資料結構實驗2

2021-08-29 12:41:54 字數 3178 閱讀 8835

一、目的和要求:

1. 熟練掌握二叉樹的定義、性質和儲存結構;

2,熟練掌握二叉樹的三種遍歷和線索化以及遍歷演算法的各種描述形式;

3.學會編寫實現樹的各種操作的演算法;

4.掌握樹的定義、儲存結構與二叉樹的轉換、遍歷;

5.掌握哈夫曼樹的建立和實現哈夫曼編碼;

二、實驗題目:

1.二叉樹的建立與遍歷:掌握建立二叉樹的方法,實現先序、中序、後序三種遍歷演算法。

問題描述: 構造一棵不少於8個結點的二叉樹,並分別輸出其先序遍歷、中序遍歷和後序遍歷的結果。

問題分析:二叉樹先序遍歷可利用非遞迴演算法實現,首先使用乙個棧stack,將根結點入棧,開始迴圈:從棧中退出當前結點p;先訪問它,然後將其它右結點入棧,再將其左結點入棧,如此直到棧空為止。後序遍歷也可使用非遞迴演算法,根據後序遍歷的二叉樹的遞迴定義,轉換成非遞迴函式時採用乙個棧儲存返回的結點,先遍歷根結點的所有左結點併入棧,出棧乙個結點,然後遍歷該結點的右結點併入棧,再遍歷該右結點的所有左結點併入棧,當乙個結點的左右子樹均訪問後再訪問該結點,如此,直到棧空。二叉樹的中序遍歷在此是用遞迴演算法實現的(以達到遞迴和非遞迴演算法都能運用的目的),先遍歷左子樹,然後訪問根結點,最後遍歷右子樹,如此迴圈,直至訪問完所有的結點。

2.樹和二叉樹的應用:掌握建立哈夫曼樹的方法,實現哈夫曼編碼。

問題描述:對任意輸入的一段英文,為每個字元編制其相應的赫夫曼編碼;並利用該編碼為任意輸入的0、1序列進行解碼.

(1)初始化: 從終端讀入一段英文本元,統計每個字元出現的頻率,建立赫夫曼樹,並將該樹存入某檔案;

(2)編碼: 利用建好的赫夫曼樹對各字元進行編碼,用列表的形式顯示在螢幕上,並將編碼結果存入另一檔案中;

(3)解碼: 利用儲存的赫夫曼編碼,對任意輸入的0,1序列能正確解碼。

三、實驗步驟與源程式:

1.二叉樹的遍歷步驟:

1).定義二叉樹的型別;

2) .構造頭節點、左孩子、右孩子;

3).中序遍歷;

4).先序遍歷;

5).後序遍歷

其源程式如下:

#include

#include

#include

struct node

*root,*p,*q; /*定義二叉樹的型別*/

struct node *make(int y) /*構造頭節點*/

void left(struct node *r,int x) /*構造左孩子*/

void right(struct node *r,int x) /*構造右孩子*/

void inorder(struct node *r) /*中序遍歷演算法*/

}void preorder(struct node *r) /*先序遍歷演算法*/

}void postorder(struct node *r) /*後序遍歷演算法*/

}void main() /*main主函式*/

if(nodata)

else

}while(1)

getch();}}

執行結果:

圖1. 二叉樹的遍歷執行結果截圖

2.huffman編碼步驟:

1). 動態分配陣列,儲存哈夫曼編碼;

2).初始化huffman樹;

3).輸入權值;

4).選擇兩個權最小的根節點;

5).構造哈夫曼樹;

6).求出哈夫曼編碼表;

其源程式如下:

#include

#include

#include

#define max 32767

typedef struct

code, *huffmancode;

typedef struct

htnode, * huffmantree; /*動態分配陣列,儲存哈夫曼樹*/

void select(huffmantree *ht,int n, int *s1, int *s2)

void main()

crthuffmantree(&ht,w,st,n); /*構造h樹*/

m = 2*n-1;

outputhuffman(ht,m); /*顯示h樹*/

printf("\n");

crthuffmancode(&ht,&hc,n); /*根據h樹,求每個字元的編碼,放在hc中*/

for(i=1;i<=n;i++) /*輸出編碼*/

printf("%c編碼為%s\n",hc[i].ch,hc[i].hfmcode);

}執行結果:

圖2. huffman編碼程式執行結果截圖

三、實驗結果分析和體會:

通過這次實驗讓我對所學內容有進一步理解,雖然程式寫的有點吃力,但還是有一定收穫。學習它頗有一定的難度,除錯時出現了不少問題,但最終還是成功了,這次實驗使我對學習資料結構有了更濃的興趣,在以後的學習中我將更努力的學好每一章節,做好每個實驗。

做這次實驗感覺比以前好多了,也許是有過一兩次實驗的鍛鍊,至少比以前順暢多了。以前做一點就要翻書看看,不然就做不下去。這次看書的頻率終於有所降低了。通過這次試驗加深了我對所學基礎知識的理解,樹型結構是一類重要的非線性資料結構,對它的操作主要是進行一些遍歷,先、中、後序的遍歷我們都必須掌握。由於二叉樹是一種非線性結構,每個結點都可能有兩棵子樹,因而需要尋找一種規律,以便使二叉樹上的結點能排列在乙個線性佇列上,從而便於遍歷。通過實驗加深了自己對樹的理解以及樹的實現,以及各種遍歷順序。,二叉樹是另一種樹型結構的樹,它的特點就是每個結點至多只有兩棵子樹(既二叉樹不存在度大於2的結點),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。遍歷二叉樹有可分為先序遍歷二叉樹,中序遍歷二叉樹和後序遍歷二叉樹。二叉樹的遍歷是以一定規則將二叉樹的每個節點均被訪問一次,而且僅被訪問一次,這次實驗最大的收穫就是學會了對二叉樹進行先、中、後序遍歷。

本次實驗還使我進一步熟悉了鍊錶的構造等相關操作。同樣由於初次接觸二叉樹。雖然基本概念能夠理解,但在實踐過程中還是遇到了一些意想不到的困難。比如二叉樹的初始化階段,由於沒有全面考慮到初始狀態的特殊情況,導致非法儲存單元被呼叫多次。很長一段時間都在解決或者說尋找這一嚴重的錯誤,這在以往的實驗中從未遇到。我通過這次實踐得到了很寶貴的經驗和教訓,相信對以後的實驗有不小的幫助。

通過這次實驗我在程式設計方面有了一定的提高!自己進一步熟悉了這個程式的建立過程,使自己又進一步的認識到c語言的重要性,在程式設計和除錯的過程中,充分認識到自己c語言基礎知識掌握的不紮實,在今後的學習過程中一定會在基礎方面多努力。

《資料結構》 實驗2

一 實驗目的 鞏固線性表的資料結構,學會線性表的應用。1.回顧線性表的邏輯結構,線性表的物理儲存結構和常見操作。2.學習運用線性表的知識來解決實際問題。3.進一步鞏固程式除錯方法。4.進一步鞏固模板程式設計。二 實驗時間 準備時間為第2周到第4周,具體集中實驗時間為第4週第2次課。2個學時。三 實驗...

資料結構實驗2

要求 1 建立乙個帶頭結點的單鏈表 頭指標為head 且遍歷此鍊錶 輸出鍊錶中各結點的值 2 查詢單鏈表中的第i個結點,並輸出結點元素的值 3 在單鏈表中的第i個結點前插入乙個結點值為e的正整數 從外部輸入 4 刪除單鏈表中的第j個結點 5 將單鏈表中的各結點就地逆序 不允許另建乙個鍊錶 程式 in...

資料結構實驗2

題目 建立乙個迴圈單鏈表,其節點有 prior,data 和 next 三個域,其中 data 為數 據域,存放元素的有效資訊,next 域為指標域,指向後繼節點,prior 為指標域,它的 值為 null。編寫乙個演算法將此表改為迴圈雙鏈表。test.h ifndef list define li...