本文目錄一覽:
- 1、C語言數據結構與算法:鏈表
- 2、數據結構算法與c語言的關係?
- 3、c語言常用算法有哪些
- 4、c語言中什麼是算法?有哪些描述算法的例子?
- 5、數據結構與算法和c語言有什麼關係嗎?
- 6、C語言用數組存儲大型數據的算法
C語言數據結構與算法:鏈表
先搞清楚基本概念,不懂再問
// 返回一個帶頭結點的且具有五個結點的鏈表
link *initLink()
{
link * p=(link*)malloc(sizeof(link)); // 創建頭結點
link * temp=p; // 使用變量temp在下面創建結點時指向鏈表末端
for(int i=1; i5; i++)
{
link *a=(link*)malloc(sizeof(link)); // 創建一個結點
a-elem=i; // 為結點賦值
a-next=NULL; // 指針域暫時賦為NULL,若後面還要創建結點的話再修改
temp-next=a; // 因為temp指向鏈表末端,即最後一個結點
// 故該節點指針域應指向剛才創建的結點 a
temp=temp-next;// 連接好以後,temp指向下一個結點(剛才創建的結點a,現在是鏈表末端)
}
return p; // 返回頭結點
}
數據結構算法與c語言的關係?
C語言是工具,數據結構是基礎,算法是核心且有難有易,初級的編程只要懂編程語言和一般算法即可,至於數據結構可作一般了解;中級的編程要對數據結構和算法有深入的理解和掌握;高級的編程就需要完全理解各種數據結構以及自己編寫算法了!不過現在的很多程序員都是在中級階段的居多吧!
c語言常用算法有哪些
0) 窮舉法
窮舉法簡單粗暴,沒有什麼問題是搞不定的,只要你肯花時間。同時對於小數據量,窮舉法就是最優秀的算法。就像太祖長拳,簡單,人人都能會,能解決問題,但是與真正的高手過招,就頹了。
1) 貪婪算法
貪婪算法可以獲取到問題的局部最優解,不一定能獲取到全局最優解,同時獲取最優解的好壞要看貪婪策略的選擇。特點就是簡單,能獲取到局部最優解。就像打狗棍法,同一套棍法,洪七公和魯有腳的水平就差太多了,因此同樣是貪婪算法,不同的貪婪策略會導致得到差異非常大的結果。
2) 動態規划算法
當最優化問題具有重複子問題和最優子結構的時候,就是動態規划出場的時候了。動態規划算法的核心就是提供了一個memory來緩存重複子問題的結果,避免了遞歸的過程中的大量的重複計算。動態規划算法的難點在於怎麼將問題轉化為能夠利用動態規划算法來解決。當重複子問題的數目比較小時,動態規劃的效果也會很差。如果問題存在大量的重複子問題的話,那麼動態規劃對於效率的提高是非常恐怖的。就像斗轉星移武功,對手強它也會比較強,對手若,他也會比較弱。
3)分治算法
分治算法的邏輯更簡單了,就是一個詞,分而治之。分治算法就是把一個大的問題分為若干個子問題,然後在子問題繼續向下分,一直到base cases,通過base cases的解決,一步步向上,最終解決最初的大問題。分治算法是遞歸的典型應用。
4) 回溯算法
回溯算法是深度優先策略的典型應用,回溯算法就是沿着一條路向下走,如果此路不同了,則回溯到上一個
分岔路,在選一條路走,一直這樣遞歸下去,直到遍歷萬所有的路徑。八皇后問題是回溯算法的一個經典問題,還有一個經典的應用場景就是迷宮問題。
5) 分支限界算法
回溯算法是深度優先,那麼分支限界法就是廣度優先的一個經典的例子。回溯法一般來說是遍歷整個解空間,獲取問題的所有解,而分支限界法則是獲取一個解(一般來說要獲取最優解)。
c語言中什麼是算法?有哪些描述算法的例子?
c語言中的算法是指:一系列解決問題的清晰指令,用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。通俗說就是解決問題的方法和步驟。
描述算法的例子:
問題:從上海去到北京。
其中的算法:做汽車、做飛機、或者徒步。
問題:喝茶。
其中的算法:先找到茶葉,再燒一壺開水,然後將茶葉放到杯子里,將開水倒入杯中,等茶葉泡好。
問題:開車。
其中的算法:首先要打開車門,駕駛員坐好,插上車鑰匙,發動汽車。
算法的五個重要的特徵:有窮性(Finiteness)、確切性(Definiteness)、輸入項(Input)、輸出項(Output)、可行性(Effectiveness)。
算法的時間複雜度:算法的時間複雜度是指執行算法所需要的計算工作量。一般來說,計算機算法是問題規模n 的函數f(n),算法的時間複雜度也因此記做。T(n)=Ο(f(n))因此,問題的規模n 越大,算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間複雜度(Asymptotic Time Complexity)。
算法的空間複雜度:算法的空間複雜度是指算法需要消耗的內存空間。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示。同時間複雜度相比,空間複雜度的分析要簡單得多。可以從正確性、可讀性、健壯性(容錯性)來分析。
數據結構與算法和c語言有什麼關係嗎?
數據結構和算法在本質上說和C語言沒有關係,C語言僅僅是描述工具而已,就像要講一個故事,可以用漢語,也可以用英語。數據結構和算法同樣可以用java,用c#等語言,甚至自然語言也可以描述。
數據結構與算法是計算機科學,具體的實現無非就是些數據交換和變化,這些交換和變化大都是在內存中進行的,而c/c++操作內存的能力要強於其他語言(當然彙編在操作內存方面更強,但離自然語言太遠,不易理解),所以學習數據結構和算法就常使用c/c++語言當作描述工具。
C語言用數組存儲大型數據的算法
/*
size_a,pa——指向數組a的有效末端
ma——a的最大容量,必須大於na
n=12——求n的階
p——求階乘時的當前乘數
*/
#includestdio.h
#define Ma 10000
int pa;/*指向數組a的有效末端*/
int p=2;
int memory_over=0;
union data
{ unsigned long int b;
struct
{unsigned l:16;
unsigned h:16;
}m;
}a[Ma];
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法說明1:考慮到result比較長,我用a[Ma].b來存儲n!的result,每一位a[pa].b能存儲4位10進制數字。
因為我定義的數組是靜態的,所以Ma應該足夠大。
ps:其實只用定義一個unsigned long int b[Ma];就可以了(直接用b[pa]代替a[pa].b),但是我考慮到可能會訪問每一結點b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考慮是多餘的!!不用像我這樣定義這麼複雜的共用體!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
unsigned int cashe;
unsigned int carry;
void main()
{
unsigned int n;/*求n的階*/
void facto(unsigned int n);
printf(“Input n:”);
scanf(“%u”,n);
/*=================開始求階乘!=============*/
a[0].b=1;/*初始化*/
facto(n);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法說明2:上面這句直接調用facto(n)來求n!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*========================以下是顯示最後結果====================================*/
if(memory_over==0)
{printf(“the result include %dNO:\n”,pa+1);
printf(“%u”,a[pa–].m.l);
for(;pa=0;pa–)
printf(“%04u”,a[pa].m.l);
printf(“\n”);
}
getch();
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法說明2:求階函數facto(n)說明:
這個函數會不斷地調用multiple(),它的作用是每被調用一次就使得a[pa].b與階數p相乘一次,直到乘完n為止!
{multiple();
p++;/*每一輪乘一個階數p*/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void facto(unsigned int n)
{void multiple();
pa=0;
while(paMa-1p=n)/*容量限制*/
{multiple();
p++;/*每一輪乘一個階數p*/
}
if(p=n)
{printf(“memory out!\n”);memory_over=1;}/*如果當前的存儲結果的數組a[Ma]不夠用!應提高Ma*/
}
/*==============================================================================
算法說明3:乘法函數multiple()說明:負責a[pa].b與階數p相乘。
a[pa].b有很多結點,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。
當然是從低結點a[0].b開始不斷與p相乘,產生的“進位”加到高位a[1].b,直到a[pa].b*p為止!
隨着結果數值增大,pa個結點的a[].b可能容納不下結果,所以如果a[pa].b與p相乘後還有“進位”carry,就擴大pa,並把carry放入到新增加的結點:
if(carry0)
a[++pa].b=carry;
===================================================================================*/
void multiple()
{int i=0;
carry=0;
while(i=pa)/*i指向當前處理的元素a[i],每一輪用一個位與階數p相乘*/
{a[i].b=a[i].b*p+carry;/*計算結果,要考慮來自低位的進位*/
carry=a[i].b/10000;/*計算進位*/
a[i].b=a[i].b%10000;/*計算餘數*/
i++;
}
if(carry0)
a[++pa].b=carry;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/232328.html