資料結構實踐專案 鍊錶

2021-07-05 06:09:57 字數 3730 閱讀 4957

本組專案針對《資料結構基礎系列(2):線性表》課程第8-15節

8. 線性表的鏈式儲存

9. 建立單鏈表

10. 單鏈表基本操作的實現

11. 單鏈表應用舉例

12. 雙鏈表

13. 迴圈鍊錶

14. 線性表的應用

15. 有序表

【專案1 - 建立單鏈表】

定義單鏈表儲存結構,用頭插法和尾插法建立單鏈表,並顯示建立好以後的結果。

請在下面**的基礎上開展工作:

#include 

#include

typedef

int elemtype;

typedef

struct lnode //定義單鏈表結點型別

linklist;

void createlistf(linklist *&l,elemtype a,int n);//頭插法建立單鏈表

void createlistr(linklist *&l,elemtype a,int n);//尾插法建立單鏈表

void destroylist(linklist *&l); //銷毀單鏈表

void displist(linklist *l) //輸出單鏈表

int main()

; createlistf(l1, a, 8);

printf("頭插法建表結果:");

displist(l1);

createlistr(l2, a, 6);

printf("尾插法建表結果:");

displist(l2);

destroylist(l1);

destroylist(l2);

return0;}

//在下面寫自定義函式(實現相關演算法)的**

[參考解答]

【專案2 - 建設「單鏈表」演算法庫】

按照「0207將演算法變程式」部分建議的方法,建設自己的專業基礎設施演算法庫。這一周,建的是單鏈表的演算法庫。

演算法庫包括兩個檔案:

標頭檔案:linklist.h,包含定義順序表資料結構的**、巨集定義、要實現演算法的函式的宣告;

原始檔:linklist.cpp,包含實現各種演算法的函式的定義

請採用程式的多檔案組織形式,建立如上的兩個檔案,另外再建立乙個原始檔(如main.cpp),編制main函式,完成相關的測試工作。

測試工作可以採用「漸進」的思路,每次涉及的函式應該盡可能少。

例如,首先設計測試函式,可以涉及初始化線性表、銷毀線性表、輸出線性表、插入資料元素對應的函式,設計的測試函式可以是

#include "linklist.h"

int main()

[參考解答]

【專案3 - 單鏈表應用】

完成下面的應用時,除專案中給出的特殊要求,其餘工作均可利用專案2完成的演算法支援。

1、設計乙個演算法,將乙個帶頭結點的資料域依次為a1,a2,…,an(n≥3)的單鏈表的所有結點逆置,即第乙個結點的資料域變為an,…,最後乙個結點的資料域為a1。實現這個演算法,並完成測試。

2、已知l1和l2分別指向兩個單鏈表的頭結點,且已知其長度分別為m、n,請設計演算法將l2連線到l1的後面。實現這個演算法,完成測試,並分析這個演算法的複雜度。

3、設計乙個演算法,判斷單鏈表l是否是遞增的。實現這個演算法,並完成測試。

[參考解答]

【專案4 - 建設雙鏈表演算法庫(選做)】

演算法庫包括兩個檔案:

標頭檔案:dlinklist.h,包含定義順序表資料結構的**、巨集定義、要實現演算法的函式的宣告;

原始檔:dlinklist.cpp,包含實現各種演算法的函式的定義

請採用程式的多檔案組織形式,建立如上的兩個檔案,另外再建立乙個原始檔(如main.cpp),編制main函式,完成相關的測試工作。

[參考解答]

【專案5 - 猴子選大王】

一群猴子,編號是1,2,3 …m,這群猴子(m個)按照1-m的順序圍坐一圈。從第1只開始數,每數到第n個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後乙隻猴子,則該猴子為大王。輸入m和n,輸出為大王的猴子是幾號。

【專案5- 迴圈雙鏈表應用】

設非空線性表ha和hb都用帶頭節點的迴圈雙鏈表表示。設計乙個演算法insert(ha,hb,i)。其功能是:i=0時,將線性表hb插入到線性表ha的最前面;當i>0時,將線性表hb插入到線性表ha中第i個節點的後面;當i大於等於線性表ha的長度時,將線性表hb插入到線性表ha的最後面。

請在實現演算法時,除專案中給出的特殊要求,其餘工作均可利用專案4完成的演算法支援。

[參考解答]

【專案6 - 多項式求和】

用單鏈表儲存一元多項式,並實現兩個多項式的加法。

多項式的通式是pn

(x)=

anxn

+an−

1xn−

1+..

.+a1

x+a0

。n次多項式共有n+1項。直觀地,可以定義乙個陣列來儲存這n+1個係數。以多項式p(

x)=−

3.4x10−

9.6x8+

7.2x2+

x 為例,儲存這個多項式的陣列如下圖:

可以看出,這種方案適合對某些多項式的處理。但是,在處理一些次數高但項數少的多項式時,存在浪費空間的現象,會有很多閒置的0。

可以使用如下定義的單鏈表結構儲存多項式:鍊錶中的每乙個結點是多項式中的一項,結點的資料域包括指數和係數兩部分,由指標域連線起多項式中的各項。

typedef struct pnode //定義單鏈表結點型別,儲存多項式中的一項,鍊錶構成多項式 polynode;

用於表示多項式的鍊錶將如下圖所示,在建立多項式的鍊錶時,已經令結點按指數由大到小的順序排列。

2、多項式加法在鍊錶儲存結構下的實現

鍊錶儲存結構下,多項式加法的實現 在如上定義的單鏈表儲存結構基礎上,討論實現多項式加法的演算法。

兩個多項式相加,其規則是對具有相同指數的項,令其係數相加。設兩個待相加的多項式的鍊錶的頭指標分別為head1(第乙個多項式)和head2(第二個多項式),兩者的和儲存到鍊錶head1中。只需要先將head1和head2鍊錶的首結點作為當前結點(分別用p1和p2指向)開始檢測,在遍歷鍊錶的過程中,分情況作如下處理:

(1)若兩個多項式中當前結點的指數值相同,則它們的係數相加,結果儲存到p1結點,並將p2結點刪除。如果相加後的係數不為0,p1指向第乙個多項式的下乙個結點,準備隨後的工作,否則,不儲存係數為0的項,將當前p1結點刪除。

(2)當兩個多項式中對應結點的指數值不相等時,若p1指向的結點的指數大,則p1簡單地指向下一結點即可;而p2指向的結點大時,需要將p2結點插入到p1前,然後p2再重新指回到第二個多項式中的下一結點,繼續進行處理。

(3)檢測過程直到其中的任乙個鍊錶結束。若p1不為空,第乙個多項式中的剩餘項已經在鍊錶中,不作處理,如果p2不為空,只需要將p2鏈結到相加後的第乙個多項式末尾。

上面的討論假設多項式鍊錶中,已經按指數由大到小排序,在加法之前,採取多種手段保證這一前提成立。

[參考解答]

資料結構實踐專案 順序表

本組專案針對 資料結構基礎系列 2 線性表 課程第1 7節 1.導學 2.線性表的邏輯結構與基本運算 3.線性表的順序儲存結構 4.建立線性表的實現 暨引數型別的討論 5.順序表基本運算的實現 6.線性表順序儲存的應用 7.實踐指導 用程式實踐演算法 include 必要的庫檔案包括 define ...

資料結構 雙向迴圈鍊錶實踐

問題描述 要求實現使用者輸入乙個數使得26個字母的排列發生變化,例如使用者輸入3,輸出結果 defghijklmnopqrstuvwxyzabc 同時需要支援負數,例如使用者輸入 3,輸出結果 xyzabcdefghijklmnopqrstuvw include include define ok ...

資料結構 鍊錶

鍊錶 what 就是一張鏈式儲存的表,是一種資料結構,是基礎,所以還是不要想有什麼用。具體呢?在c中就用結構體實現物件描述,然後通過函式來實現各個基本操作 c 則用類來表述,c中的結構體就可以看成c 中的類,然後通過類封裝各個操作步驟。這些操作實現後就需要 來測試,號稱demo,就是main函式裡面...