C 和資料結構習題總結

2021-12-20 05:17:42 字數 3431 閱讀 7821

目錄1. 求fibonacci序列2

2. 求階乘3

3. 編寫字串拷貝函式4

4. 編寫字串連線函式4

5. 二分查詢5

6. 氣泡排序6

7. 編寫string類並實現其常用函式8

8. 編寫list類11

9. 用單鏈表的方法構造乙個堆疊15

作者: 張詩偉

一. 給定乙個數n,求第n位的fibonacci數是多少.

**如下:

方法一:遞迴求解

#include ""

int fib(const int n)

else

return j;

}}方法二:迴圈求解

#include ""

int fib(const int n)

if(n==1 || n==2)

int firstnum = 1;

int secondnum = 1;

int temp = 0;

int i=3;

for(; i<=n; i++)

return secondnum;

}總結:

方法一是很自然馬上就能想到的,在學習c語言時,用遞迴法求fibonacci數列是很經典的乙個例子,但是在用完這種方法後,我們應該養成這樣一種習慣,我們要多思考下,多問問自己,我用的這種方法是最好的嗎,是最合理的嗎,是最高效的嗎?經過老師的提示和講解,我們發現,遞迴在對二叉樹的遍歷時效率比較高,在別的問題中效率就比較低了,用乙個迴圈來處理這個問題似乎效率更高,因為不用反覆呼叫自身函式,也就是上面的方法二。

所以以後不管處理什麼問題,我們都要習慣這種問問自己的思維方式,這對今後的學習是很有益的。

二. 求階乘.

**如下:

方法一:迴圈求解

#include ""

int multi(const int n)

return ret;

}方法二:遞迴求解

#include ""

int multi(const int n)

return n*multi(n-1);

}總結:

求階乘跟求fibonacci數列很相似,相比較而言也是迴圈求解的效率較高,所不同的是,這一次拿到題目的時候首先想到的不是遞迴而是迴圈求解的方法,看來有點小進步,直接就想到了高效的方法了。

三. 編寫字串拷貝函式.

**如下:

char* strcopy(char* strdest,const char* strsrc)

return cstrd;

}總結:

思路很簡單,就是把源字串從第乙個字元按順序乙個個賦值給目標字串,直到將』\0』字串結束標誌賦過去後,拷貝過程結束。要注意的是,在函式型參中,strsrc源字串宣告的型別是const char*,為什麼要宣告為const呢?因為我們都知道,編寫函式原型和實現函式的很有可能是兩個人,如果不將源字串宣告為const,實現該函式的程式設計師可能會以為該源字串在函式執行過程中是可更改的,這就違背了函式原型編寫者的初衷,因為我們只是要將給出的字串拷貝到另乙個字串中,並不要改變它。

所以,將其宣告為const型,如果**編寫者在編寫**中更改了其值,則編譯器會報錯。這樣提高了程式的健壯性。

另外還有一點,strcopy函式把strsrc的內容複製到了strdest,為什麼還要char*返回值呢?經過查閱有關資料其實這樣做的目的是為了實現鏈式表達,如:int length = strlen( strcpy( strdest, 「hello world」) );

四. 編寫字串連線函式.

**如下:

void str_cat(char s1,const char* s2)

while(s2[j])

int _tmain(int argc, _tchar* ar**)

總結:字串連線就是把源字串拷貝到目標字串的末尾處,從這點考慮就可以先設乙個變數i,讓它一直加1直到到了』\0』,然後這時再從第i個位置把原始碼字串乙個乙個字元的賦過去,這樣的做的缺點是必須要實現給定目標字串的長度。如果不固定長度的話可以新開闢一塊記憶體空間用儲存,但是這樣增加了開銷,這裡就不把這個方法寫出來了。

其實在後面的練習中,我也發現,有時候你總會想到去開闢新空間用來儲存,但很多情況下是沒必要的,還是像前面所說的,寫完後程式後多想想,還有什麼更好的方法。

五. 二分查詢

**如下:

#include ""

const int max = 10;

int halfsearch(int s[max],int n,int data)

else if (s[mid]

else

}return -1;

}int _tmain(int argc, _tchar* ar**)

; int num;

printf("input the number which you want to find:");

scanf("%d",&num);

int ret = halfsearch(s,max,num);

if(ret!=-1)

else

return 0;

}總結:

二分法的具體思路還是很清楚的,取中間值與要查詢的值比較,如果小於中間值,則讓中間值作為尾值,再取前面這一部分的中間值繼續比較;如果大於的話就把中間值設成首值,取後面部分的中間值再繼續比較。就按這個方法直到找到值為止。所以設定三個變數head、mid、tail分別來表示所取字串序列的頭值、中間值和尾值,然後用if-else語句按上面所說的思路進行比較判斷即可。

覺得編成無非就是用另外一種語言說話,學會了語言了,又想清楚了,然後再組織下語言,不但能說出話,而且能夠說出漂亮的話。

六. 氣泡排序演算法.

**如下:

方法一:經典的冒泡法

#include ""

const int max = 10;

void bubble(int str[max])

}for(i=0;i

}int _tmain(int argc, _tchar* ar**)

; bubble(s);

return 0;

}方法二:改進的冒泡法

#include ""

const int max = 10;

void newbubble(int str[max])

if(index!=max-1-i) //將該輪迴圈比較出的最大值放在str[max-1-i]處

}for(int i=0; i

}int _tmain(int argc, _tchar* ar**)

; newbubble(s);

return 0;

}總結:

在思考經典的方法一的時候也想了很久,主要是這些東西丟了太久,有些細枝末節的東西已經記不太清楚了,覺得這種基礎的東西一定要多練習,練習到非常熟練幾乎不用思考就直接可以寫出來。當然如果理解了來寫也是很好的。

資料結構C語言習題及解答

第二章習題與解答 一判斷題 1 線性表的邏輯順序與儲存順序總是一致的。2 順序儲存的線性表可以按序號隨機訪問。3 順序表的插入和刪除操作不需要付出很大的時間代價,因為每次操作平均只有近一半的元素需要移動。4 線性表中的元素可以是各種各樣的,但同一線性表中的資料元素具有相同的特性,因此是屬於同一資料物...

資料結構習題

第5章陣列和廣義表 一 選擇題 1.在以下講述中,正確的是 b a 線性表的線性儲存結構優於鍊錶儲存結構 b 二維陣列是其資料元素為線性表的線性表 c 棧的操作方式是先進先出 d 佇列的操作方式是先進後出 2.若採用三元組壓縮技術儲存稀疏矩陣,只要把每個元素的行下標和列下標互換,就完成了對該矩陣的轉...

資料結構習題

前言資料結構是計算機相關專業教學計畫中的一門核心課程,是有志從事計算機與技術工作的人員的一門重要的專業基礎課程。計算機相關學科各領域都要用到各種資料結構,要從事這些領域的工作,尤其是計算機應用領域的開發研製工作,必須具備良好的資料結構基礎。資料結構課程的教學要求是學會分析研究計算機加工的資料物件的特...