版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 數(shù)據(jù)結構課程設計實習報告</p><p><b> 目 錄</b></p><p><b> 一、需求分析1</b></p><p><b> 二、邏輯設計2</b></p><p><b> 三、詳細設計5</b>&
2、lt;/p><p><b> 四、程序編碼9</b></p><p> 五、程序調試與測試35</p><p><b> 六、結果分析39</b></p><p><b> 需求分析:</b></p><p> 1、程序一:單鏈表的應用<
3、;/p><p> ?。?)要求生成線性表時,可以鍵盤上讀取元素。通過在鍵盤上輸入的數(shù)據(jù)構造成單鏈表,進而對構造成的單鏈表進行插入、刪除、遍歷等操作的實現(xiàn)。</p><p> ?。?)限制條件是要求在生成線性表的時候,線性表中的元素是從鍵盤上輸入而不是自動生成,這樣就可以對自己想要進行的元素序列進行各種操作。</p><p> 2、程序二:二叉排序樹的操作</p&
4、gt;<p> ?。?)建立二叉樹,并輸出二叉樹的先序,中序和后序遍歷序列,以及二叉樹的葉子數(shù)。</p><p> ?。?)要求根據(jù)讀取的元素建立二叉樹,能輸出各種遍歷。</p><p> ?。?)可通過輸入帶空格的前序序列建立二叉鏈表。</p><p> 附加功能:輸出了二叉樹的深度。</p><p> 程序三:哈夫曼編碼
5、器(未嚴格依照要求)</p><p> 從鍵盤接受一串電文字符,輸出對應的Huffman編碼。同時,能翻譯由Huffman編碼生成的代碼串,輸出對應的電文字符串。</p><p><b> 程序四:停車場管理</b></p><p> 設停車場是一個可以停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先后
6、順序,依次有北向南排列(大門在最南端,最先到達的第一車停放在車場的最北端),若車場內已停滿n輛車,那么后來的車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。</p><p
7、><b> 邏輯設計:</b></p><p> 圖一、主函數(shù)總體設計</p><p><b> 1、功能一</b></p><p> 圖二、單鏈表的基本操作</p><p><b> 2、功能二</b></p><p> 圖三、二叉樹
8、的基本操作</p><p><b> 3、功能三</b></p><p> 圖四、哈夫曼樹的基本操作</p><p><b> 4、功能四</b></p><p> 圖五、停車場管理系統(tǒng)</p><p><b> 詳細設計:</b></p
9、><p> 1、單鏈表的操作(流程圖)</p><p> 圖六、單鏈表插入 圖七、單鏈表的刪除</p><p> 2、二叉樹的基本操作(流程圖)</p><p> 圖八、二叉樹的前序遍歷 圖九、二叉樹的中序遍歷</p><p> 圖十、二叉樹的
10、后序遍歷</p><p><b> 哈夫曼樹的詳細設計</b></p><p><b> 、構造哈夫曼樹。</b></p><p> 根據(jù)Huffman算法:若已知有n個葉子節(jié)點,則構造的huffman樹有2n-1個結點。</p><p> 先輸入字符集中的n個字符(葉子節(jié)點)和表示其概率分
11、布的權值,存儲在HuffNode型數(shù)組的前n個數(shù)組元素中。然后將2n-1個結點的雙親和左右孩子均置為0。</p><p> 在所有的節(jié)點中,選取雙親為0,且具有最小權值m1和次小權值m2的兩個結點,用p1和p2指示這兩個結點在數(shù)組中的位置。將根為ht[p1]和ht[p2]的兩顆樹合并,使其成為新節(jié)點ht[i]的左右孩子,ht[i]的權值為最小權值m1和次小權值m2之和;ht[p1]和ht[p2]的雙親指向i。重
12、復上述過程,共進行n-1次合并就構造了一顆Huffman樹。當進行n-1次合并時,產生n-1個結點,依次放在ht數(shù)組中,數(shù)組的下標從n到2n-2。</p><p><b> 、編碼。</b></p><p> 基本思想:從Huffman樹的葉子節(jié)點ht[i]出發(fā),通過雙親parent找到其雙親ht[f],通過ht[f]的left和right域,可知ht[i]是ht
13、[f]的左分支還是右分支,若是左分支,生成代碼0;若是右分支,生成代碼1,代碼存放在數(shù)組cd[start]中,然后把ht[f]作為出發(fā)點,重復上述過程,直到找到根節(jié)點為止。</p><p><b> 、譯碼。</b></p><p> 基本思想:首先輸入二進制代碼串,存放在數(shù)組ch中,以“#”為結束標志。接下來,將代碼與編碼表比較,如果為0,轉為左子樹;若為1,轉
14、為右子樹,直到葉子節(jié)點結束,此時輸出葉子結點的數(shù)據(jù)域,即所對應的字符。繼續(xù)譯碼,直到代碼結束。</p><p> 停車場管理系統(tǒng)的詳細設計</p><p> 、模擬停車場車輛進出時需要輸入車輛的信息,包括車牌號碼以及進入和離開的時刻,因此可以定義一個時間節(jié)點類型和一個車輛信息結點類型,在順序棧及鏈式隊列中定義結點類型為車輛信息結點類型。</p><p> 、當
15、車輛離開后,需要打印輸出車輛離開后的信息,如離開時間、離開時的所在位置和應繳納的費用等,定義函數(shù)Print實現(xiàn)。</p><p> 、車輛到達時需要用戶輸入車輛的信息,接著要判斷棧是否已滿,如果當前站未滿,則進行入棧操作,即車輛進入停車場;如果棧已滿,則車輛必須進入便道等待。用函數(shù)Arrival實現(xiàn)。</p><p> ?。?)、車輛的離開,則需要另設一個棧,給要離去的汽車讓路而從停車場
16、退出來的汽車臨時停放,也用順序棧實現(xiàn),車輛離開后需檢查便道內是否有車等待,如有等待的車輛則進行便道內的車輛進入停車場的操作,即將車輛信息結點進行入棧操作,輸入當前時間后開始計費,最后進行出棧操作,表示車輛離開便道以進入停車場。用函數(shù)Leave()實現(xiàn)。</p><p><b> 程序編碼:(源碼)</b></p><p><b> 主函數(shù)</b&g
17、t;</p><p> #include<stdio.h> </p><p> #include<string.h></p><p> #include<malloc.h></p><p> #include<stdlib.h></p><p> #includ
18、e"LinkedList.h"</p><p> #include"Huffman.h" </p><p> #include"Parking.h"</p><p> #include"Tree.h"</p><p> void main()</p&
19、gt;<p><b> { </b></p><p><b> int k;</b></p><p> char ch='y';</p><p> while(ch=='y')</p><p><b> {</b><
20、;/p><p> printf("\t\t#*#*#*#*歡迎進入我的課設工程*#*#*#*#\n");</p><p> printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");</p><p> printf("\t如果碰到意外結束的情況或者排序不正確的情況\n
21、\n");</p><p> printf("\t\t 請及時聯(lián)系我 \n \n");</p><p> printf("\t\t☆ 請選擇以下題目展示: ☆\n");</p><p> printf("\t\t★
22、 1.二叉樹簡單操作(★★★) ★\n");</p><p> printf("\t\t★ 2.單鏈表簡單操作(★★) ★\n");</p><p> printf("\t\t★ 3.哈夫曼樹編碼器(★★★) ★\n");</p&
23、gt;<p> printf("\t\t★ 4.停車場管理系統(tǒng)(★★★★★) ★\n");</p><p> printf("\t\t★ 0.退出程序 ★\n");</p><p> printf("\n\n\n");</
24、p><p> printf("請選擇(0-4):");</p><p> scanf("%d",&k);</p><p> switch (k)</p><p><b> {</b></p><p> case 1:printf("
25、您選擇的是二叉樹操作系統(tǒng)\n");</p><p> Treemenu();</p><p><b> break;</b></p><p> case 2: printf("您選擇進入的是單鏈表操作系統(tǒng)\n");</p><p> LListmenu();</p>&
26、lt;p><b> break;</b></p><p> case 3:printf("您選擇進入的是哈夫曼樹編碼器\n");</p><p> Huffmanmenu();</p><p><b> break;</b></p><p> case 4:pri
27、ntf("您選擇的是停車場管理系統(tǒng)\n");</p><p> Parkingmenu();</p><p><b> break;</b></p><p><b> case 0:</b></p><p><b> exit(0);</b><
28、/p><p><b> default:</b></p><p> printf("您的輸入有誤,請重新輸入!");</p><p><b> }</b></p><p><b> }</b></p><p><b>
29、 }</b></p><p><b> 功能函數(shù)</b></p><p><b> 二叉樹的操作</b></p><p><b> 頭文件</b></p><p> typedef char DataType;</p><p> #
30、define MAX 100</p><p> typedef struct BiTNode//二叉鏈表數(shù)據(jù)結構定義</p><p><b> {</b></p><p> DataType data;</p><p> struct BiTNode *lchild,*rchild; </p>&
31、lt;p><b> }BiTree;</b></p><p><b> 菜單函數(shù)</b></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include"Tree.h&
32、quot;</p><p> int Treemenu()//(int argc,char *argv[])</p><p><b> {</b></p><p> BiTree *tree;</p><p> int deep,sum;</p><p> printf("\t
33、\t歡迎進入二叉樹基本操作系統(tǒng)\n\n\n");</p><p> tree=Create(); /* 建立二叉樹 */ </p><p> deep=DepthPost(tree);/* 求二叉樹高度 */</p><p> printf("\n1:輸出先序序列: ");</p><p>
34、 PreTra(tree);</p><p> printf("\n2:輸出中序序列: ");</p><p> InTra(tree);</p><p> printf("\n3:輸出后序序列: ");</p><p> PostTra(tree);</p>&
35、lt;p> printf("\n4:輸出二叉樹的高度:%d\n",deep);</p><p> sum=LeafCount(tree);</p><p> printf("\n5:輸出二叉樹的葉子節(jié)點:%d\n",sum);</p><p> printf("\n操作結束!謝謝您的使用。\n"
36、;);</p><p> return 0; </p><p><b> }</b></p><p><b> 各個源文件子函數(shù)</b></p><p> #include<stdio.h></p><p> #include<stdlib.
37、h></p><p> #include"Tree.h"</p><p> BiTree *Create()//非遞歸方法建立二叉鏈表</p><p><b> {</b></p><p> BiTree *Q[MAX];</p><p> DataType c
38、h;</p><p> int front,rear;</p><p> BiTree *s,*root; </p><p> root=NULL;</p><p><b> front=1;</b></p><p> rear=0; //隊列初始化 </p><p
39、> printf("\t請按完全二叉樹的編號順序依次輸入結點序列\(zhòng)n");</p><p> printf("\t注:空結點用'@'表示,輸入序列以'#'結束\n\n");</p><p> printf("\t輸入的順序為:");</p><p> ch=ge
40、tchar();</p><p> while(ch!='#')</p><p><b> {</b></p><p> s=NULL; </p><p> if(ch!='@')</p><p><b> { </b><
41、/p><p> s=(BiTree *)malloc(sizeof(BiTree));//申請新結點 </p><p> s->data=ch; </p><p> s->lchild=NULL; </p><p> s->rchild=NULL; </p><p><b> }<
42、;/b></p><p><b> rear++;</b></p><p> Q[rear]=s; //空結點和新結點都入隊</p><p> if(rear==1) </p><p> root=s; //rear是1,是根結點,用root指向它</p>
43、<p><b> else</b></p><p><b> {</b></p><p> if(s&&Q[front]) // 當前結點和雙親結點都非空 </p><p> if(rear%2==0)// rear是偶數(shù),新結點為雙親的左孩子</p><p>
44、; Q[front]->lchild=s;</p><p> else // rear是奇數(shù),新結點為雙親的右孩子 </p><p> Q[front]->rchild=s;</p><p> if(rear%2==1) </p><p> front++; // rear是奇數(shù),頭指針front
45、指向下一個雙親</p><p><b> }</b></p><p> ch=getchar(); </p><p><b> } </b></p><p> return root; </p><p><b> } </b></p>
46、;<p> void PreTra(BiTree *t) //遞歸算法先序遍歷二叉樹</p><p><b> {</b></p><p> if(t) // 初始條件:二叉樹存在</p><p><b> {</b></p><p>
47、 printf("%c",t->data); // 訪問結點 </p><p> PreTra(t->lchild); // 先序遍歷左子樹 </p><p> PreTra(t->rchild); // 先序遍歷右子樹 </p><p><b> }</b></p><p>
48、;<b> } </b></p><p> void InTra(BiTree *t)//遞歸算法中序遍歷二叉樹</p><p><b> {</b></p><p><b> if(t)</b></p><p><b> {</b><
49、;/p><p> InTra(t->lchild); // 中序遍歷左子樹 </p><p> printf("%c",t->data); // 訪問根結點 </p><p> InTra(t->rchild); // 中序遍歷右子樹 </p><p><b> }</b>&
50、lt;/p><p><b> } </b></p><p> void PostTra(BiTree *t)//遞歸算法后序遍歷二叉樹</p><p><b> {</b></p><p><b> if(t)</b></p><p><
51、b> {</b></p><p> PostTra(t->lchild); //后序遍歷左子樹 </p><p> PostTra(t->rchild); // 后序遍歷右子樹 </p><p> printf("%c",t->data); // 訪問根結點 </p><p>
52、<b> }</b></p><p><b> }</b></p><p> int DepthPost(BiTree *t) //遞歸算法后序遍歷求二叉樹的高度</p><p><b> {</b></p><p> int hl,hr,max;</p>
53、;<p><b> if(t)</b></p><p><b> {</b></p><p> hl= DepthPost(t->lchild); // 求左子樹的深度 </p><p> hr= DepthPost(t->rchild); // 求右子樹的深度 </p>
54、<p> max=hl>hr?hl:hr; // 得到左、右子樹深度較大者</p><p> return max+1; // 返回樹的深度 </p><p><b> }</b></p><p><b> else</b></p>
55、;<p> return 0; // 如果是空樹,則返回0 </p><p><b> } </b></p><p> int LeafCount(BiTree *t) //遍歷求葉子結點的個數(shù)</p><p><b> {</b></p><
56、p> int sum=0,m,n;</p><p><b> if(t)</b></p><p><b> { </b></p><p> if((!t->lchild)&&(!t->rchild)) </p><p><b> sum++; &
57、lt;/b></p><p> m=LeafCount(t->lchild); </p><p><b> sum+=m; </b></p><p> n=LeafCount(t->rchild); </p><p><b> sum+=n; </b></p>
58、<p><b> } </b></p><p> return sum; </p><p><b> }</b></p><p><b> 單鏈表的操作</b></p><p><b> 頭文件</b></p><
59、p> typedef char DataType; </p><p> #define OK 1</p><p> #define ERROR -1</p><p> typedef struct node//結點類型定義 </p><p><b> {</b></p><p>
60、 DataType data;</p><p> struct node *next;</p><p> }LinkedList;</p><p> void InitLList(LinkedList *L);</p><p> int GetLListLength(LinkedList *L);</p><p&
61、gt; LinkedList *GetLListElem(LinkedList *L, int i);</p><p> LinkedList *LocateLListElem( LinkedList *L,DataType key);</p><p> int InsertLList(LinkedList *L,int i,DataType x);</p><p
62、> int DeleteLList(LinkedList *L,int i,DataType *e);</p><p> LinkedList *CreateLList();// 建立不帶頭結點的單鏈表(頭插法建表)</p><p> LinkedList *CreateLListR();//建立帶頭結點的單鏈表(尾插法建表)</p><p> P
63、rintLList(LinkedList *q);</p><p><b> 菜單函數(shù)</b></p><p> #include<stdio.h> </p><p> #include<string.h></p><p> #include<stdlib.h></p&
64、gt;<p> #include<malloc.h></p><p> #include"LinkedList.h" </p><p> int LListmenu()</p><p><b> {</b></p><p> LinkedList *a,*p;&l
65、t;/p><p> int length,node,i,j,k;</p><p> char value,q;</p><p> char ch='y';</p><p> while(ch=='y')</p><p><b> {</b></p>
66、;<p> printf("\t\t#*#*#*#*歡迎進入單鏈表操作系統(tǒng)*#*#*#*#\n");</p><p> printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");</p><p> printf("\n\n\n");</p><
67、p> printf("\t 如果碰到意外結束的情況或者操作不正確的情況\n\n");</p><p> printf("\t\t★★★ 請及時聯(lián)系18062794950 ★★★\n");</p><p> printf("\t\t★ 注意: 功能使用中應該先建表 ★\n")
68、; </p><p> printf("\t\t★ 然后進行各個操作,最后初始化鏈表 ★\n");</p><p> printf("\t\t☆ 請選擇所需功能: ☆\n");</p><p> printf("\t\t★ 1
69、.頭插法建表 ★\n");</p><p> printf("\t\t★ 2.尾插法建表 ★\n");</p><p> printf("\t\t★ 3.求表的長度 ★\n");</p>
70、<p> printf("\t\t★ 4.取結點(遍歷) ★\n");</p><p> printf("\t\t★ 5.插入運算 ★\n");</p><p> printf("\t\t★
71、 6.刪除運算 ★\n");</p><p> printf("\t\t★ 7.輸出帶頭結點的單鏈表 ★\n");</p><p> printf("\t\t★★★ 8.鏈表的初始化 ★★★\n");</p><
72、p> printf("\t\t★ 0.返回主菜單 ★\n");</p><p> printf("\n\n\n");</p><p> printf("請選擇(1-8):");</p><p> scanf("%d",&
73、amp;k);</p><p> switch (k)</p><p><b> {</b></p><p><b> case 1: </b></p><p> printf("\t您的選擇是頭插法建表\n");</p><p> printf
74、("\t輸入字符串,如: abcdef@ 以@結束后回車\n");</p><p> a=CreateLList();</p><p> PrintLList(a);</p><p><b> break;</b></p><p><b> case 2: </b><
75、;/p><p> printf("\t你的選擇是尾插法建表\n");</p><p> printf("\t輸入字符串,如: abcdef@ 以@結束后回車\n"); </p><p> a=CreateLListR();</p><p> PrintLList(a);</p><
76、;p><b> break;</b></p><p><b> case 3: </b></p><p> printf("\t您選擇的是計算表的長度\n");</p><p> length=GetLListLength(a);</p><p> printf(
77、"該表的長度為:%d\n",length);</p><p><b> break;</b></p><p><b> case 4: </b></p><p> printf("\t您的選擇是取結點\n");</p><p> printf(&quo
78、t;請輸入取第幾個節(jié)點:\n");</p><p> scanf("%d",&node);</p><p> p=GetLListElem(a,node);</p><p> if(p==NULL)</p><p> printf("表中沒有該節(jié)點!\n");</p>
79、;<p><b> else</b></p><p> printf("該節(jié)點的數(shù)據(jù)域為:%c\n",p->data);</p><p><b> break;</b></p><p><b> case 5: </b></p><p
80、> printf("您的選擇是插入運算\n");</p><p> printf("請輸入要插入的位置:\n");</p><p> scanf("%d",&i);</p><p> printf("請輸入插入的字符");</p><p>
81、 getchar();</p><p> scanf("%c",&value);</p><p> InsertLList(a,i,value);</p><p> PrintLList(a);</p><p><b> break;</b></p><p>&
82、lt;b> case 6: </b></p><p> printf("\t您選擇的是刪除運算\n");</p><p> printf("請輸入要刪除的位置 \n");</p><p> scanf("%d",&j);</p><p> Dele
83、teLList(a,j,&q);</p><p> PrintLList(a);</p><p><b> break;</b></p><p><b> case 7: </b></p><p> printf("\t輸出鏈表為:");</p>&
84、lt;p> PrintLList(a);</p><p><b> break;</b></p><p><b> case 8:</b></p><p> printf("\t您選擇的是鏈表的初始化\n");</p><p> InitLList(a);<
85、;/p><p> PrintLList(a);</p><p><b> break;</b></p><p><b> case 0:</b></p><p> printf("\t您的選擇是返回主菜單\n");</p><p><b>
86、 main();</b></p><p><b> default:</b></p><p> printf("\t\t輸入錯誤!請重新輸入!\n\t\t");</p><p><b> }</b></p><p><b> }</b>
87、</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 各個子函數(shù)源文件</b></p><p> #include<stdio.h> </p><p> #inclu
88、de<string.h></p><p> #include<malloc.h></p><p> #include<stdlib.h> </p><p> #include"LinkedList.h"</p><p> void InitLList(LinkedList *L)
89、// 對單鏈表進行初始化 </p><p><b> {</b></p><p> L->next=NULL;// 置為空表 </p><p><b> }</b></p><p> int GetLListLength(LinkedList *L)// 求表的長度 </p&
90、gt;<p><b> {</b></p><p> LinkedList *p;</p><p><b> int j;</b></p><p> p=L->next;</p><p><b> j=0;</b></p><p
91、> while(p!=NULL)</p><p><b> {</b></p><p> p=p->next;</p><p><b> j++;</b></p><p><b> }</b></p><p><b>
92、return j;</b></p><p><b> }</b></p><p> LinkedList *GetLListElem(LinkedList *L, int i)//在帶頭結點的單鏈表L中查找第i個結點</p><p><b> { </b></p><p>&l
93、t;b> int j;</b></p><p> LinkedList *p;</p><p><b> p=L;</b></p><p><b> j=0; </b></p><p> while ((p->next!=NULL)&&(j<
94、i))</p><p><b> { </b></p><p> p=p->next; </p><p><b> j++; </b></p><p><b> }</b></p><p> if(i == j)</p>&
95、lt;p> return p; </p><p><b> else </b></p><p> return NULL; </p><p><b> }</b></p><p> LinkedList *LocateLListElem( LinkedList *L,DataTy
96、pe key)//在帶頭結點的單鏈表L中查找其</p><p><b> { </b></p><p> LinkedList *p;</p><p> p=L->next; </p><p> while (p!=NULL)</p><p><b> {</b
97、></p><p> if (p->data!=key)</p><p> p=p->next; </p><p><b> else</b></p><p><b> break; </b></p><p><b> }</b&g
98、t;</p><p><b> return p;</b></p><p><b> }</b></p><p> int InsertLList(LinkedList *L,int i,DataType x)//在帶頭結點的單鏈表L中第i個位置插入值為e的新結點s</p><p><b
99、> {</b></p><p> LinkedList *pre,*s;</p><p><b> int k;</b></p><p><b> pre=L; </b></p><p><b> k=0; </b></p>&l
100、t;p> while(pre!=NULL&&k<i-1) </p><p><b> {</b></p><p> pre=pre->next;</p><p><b> k=k+1; </b></p><p><b> } </b&g
101、t;</p><p><b> if(!pre) </b></p><p><b> { </b></p><p> printf("插入位置不合理!");</p><p> return ERROR;</p><p><b> }&l
102、t;/b></p><p> s=(LinkedList*)malloc(sizeof(LinkedList)); </p><p> s->data=x; </p><p> s->next=pre->next; </p><p> pre->next=s;</p><p>
103、 return OK;</p><p><b> }</b></p><p> int DeleteLList(LinkedList *L,int i,DataType *e)//在帶頭結點的單鏈表L中刪除第i個元素,并將刪除的元素保存到變量*e中</p><p><b> {</b></p>&l
104、t;p> LinkedList *pre,*r;</p><p><b> int k;</b></p><p><b> pre=L;</b></p><p><b> k=0;</b></p><p> while(pre->next!=NULL &a
105、mp;& k<i-1) </p><p><b> {</b></p><p> pre=pre->next; </p><p><b> k=k+1;</b></p><p><b> } </b></p><p>
106、if(!(pre->next)) </p><p><b> { </b></p><p> printf("刪除結點的位置i不合理!");</p><p> return ERROR;</p><p><b> }</b></p><p>
107、; r=pre->next;</p><p> pre->next=pre->next->next; </p><p> *e = r->data;</p><p><b> free(r); </b></p><p> printf("成功刪除結點!");&l
108、t;/p><p> return OK;</p><p><b> }</b></p><p> LinkedList *CreateLList()// 建立不帶頭結點的單鏈表(頭插法建表)</p><p><b> {</b></p><p><b> c
109、har ch;</b></p><p> LinkedList *l,*s;</p><p> l=(LinkedList *)malloc(sizeof(LinkedList));</p><p> l->next=NULL;</p><p> ch=getchar();</p><p>
110、 while(ch!='@') </p><p><b> {</b></p><p> s=(LinkedList *)malloc(sizeof(LinkedList));</p><p> s->data=ch;</p><p> s->next=l->next;<
111、/p><p> l->next=s;</p><p> ch=getchar();</p><p><b> }</b></p><p><b> return l;</b></p><p><b> }</b></p><
112、;p> LinkedList *CreateLListR()//建立帶頭結點的單鏈表(尾插法建表)</p><p><b> { </b></p><p><b> char ch;</b></p><p> LinkedList *head,*s,*r;</p><p> h
113、ead=(LinkedList *)malloc(sizeof(LinkedList));</p><p><b> r=head;</b></p><p> ch=getchar();</p><p> while(ch!='@') </p><p><b> { </b>
114、;</p><p> s=(LinkedList *)malloc(sizeof(LinkedList));</p><p> s->data=ch;</p><p> r->next=s;</p><p><b> r=s;</b></p><p> ch=getchar(
115、);</p><p><b> }</b></p><p> r->next=NULL; </p><p> return head;</p><p><b> }</b></p><p> PrintLList(LinkedList *q)//輸出帶頭結點
116、的單鏈表</p><p><b> {</b></p><p> LinkedList *p;</p><p> p=q->next;</p><p> printf("字符單鏈表結果是: \n(");</p><p> while(p!=NULL)<
117、/p><p><b> {</b></p><p> printf("%5c,",p->data);</p><p> p=p->next;</p><p><b> }</b></p><p> printf("\b)&quo
118、t;);</p><p><b> }</b></p><p><b> 哈夫曼編碼器</b></p><p><b> 頭文件</b></p><p> #include <stdio.h></p><p> typedef ch
119、ar DataType;</p><p> #define MAXNUM 50</p><p> typedef struct// 哈夫曼樹結點的結構 </p><p><b> {</b></p><p> DataType data; // 數(shù)據(jù)用字符表示 </p><p> i
120、nt weight; // 權值 </p><p> int parent; // 雙親 </p><p> int left; // 左孩子 </p><p> int right; // 右孩子 </p><p> }HuffNode;</p><p> t
121、ypedef struct// 哈夫曼編碼的存儲結構 </p><p><b> {</b></p><p> DataType cd[MAXNUM];// 存放編碼位串 </p><p> int start; // 編碼的起始位置 </p><p> }HuffCode;</p>
122、<p><b> 菜單函數(shù)</b></p><p> #include"Huffman.h"</p><p> int Huffmanmenu()</p><p><b> {</b></p><p> int n,select,flag=0; //
123、flag為0時標記第一次選擇功能 </p><p> HuffNode ht[2*MAXNUM]; // 定義存放哈夫曼樹的數(shù)組 </p><p> HuffCode hcd[MAXNUM]; // 定義存放編碼的數(shù)組 </p><p><b> while(1)</b></p><p><b>
124、 {</b></p><p> printf("\t 請選擇您所要實現(xiàn)的功能:\n");</p><p> printf("\t1---建立哈夫曼樹\n");</p><p> printf("\t2---編碼\n");</p><p> printf(&quo
125、t;\t3---譯碼\n");</p><p> printf("\t4---退出系統(tǒng)\n");</p><p> printf("(請輸入1-4數(shù)字)\n");</p><p> scanf("%d",&select);</p><p> if(selec
126、t!=1&&select!=4&&flag==0)</p><p> { // 提示先建立哈夫曼樹或退出 </p><p> printf("請先建立哈夫曼樹再選擇其他功能!\n");</p><p><b> continue;</b></p&
127、gt;<p><b> }</b></p><p><b> flag=1;</b></p><p> switch(select) // 選擇功能 </p><p><b> { </b></p><p><b> case 1:&
128、lt;/b></p><p> n=HuffmanCreate(ht); </p><p><b> break;</b></p><p><b> case 2: </b></p><p> Encoding(ht,hcd,n); </p><p><b
129、> break;</b></p><p><b> case 3:</b></p><p> Decoding(ht,hcd,n); </p><p><b> break;</b></p><p><b> case 4: </b></p&g
130、t;<p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> } <
131、;/b></p><p><b> 各個子函數(shù)模塊</b></p><p> #include"Huffman.h"</p><p> int HuffmanCreate(HuffNode *ht)//建立哈夫曼樹 </p><p><b> {</b></
132、p><p> int i,k,n,m1,m2,p1,p2;</p><p> printf("請輸入元素個數(shù):");</p><p> scanf("%d",&n);</p><p> for(i=1;i<=n;i++) // 輸入結點值和信息 </p&g
133、t;<p><b> {</b></p><p> getchar(); // 接收回車 </p><p> printf("第%d個元素的=>\n\t結點值:",i);</p><p> scanf("%c",&ht[i].data);
134、</p><p> printf("\t權 重:");</p><p> scanf("%d",&ht[i].weight);</p><p><b> }</b></p><p> for(i=1;i<=2*n-1;i++) // 對數(shù)組
135、初始化 </p><p> ht[i].parent=ht[i].left=ht[i].right=0;</p><p> for(i=n+1;i<=2*n-1;i++)</p><p> { </p><p> m1=m2=32767; /
136、/ 初始化,令m1、m2為整數(shù)最大值 </p><p><b> p1=p2=1;</b></p><p> for(k=1;k<=i-1;k++) // 從數(shù)組ht[1]到ht[i-1]中找出 </p><p> if(ht[k].parent==0) // parent為0并且權值最小的兩個結點 &
137、lt;/p><p> if(ht[k].weight<m1) </p><p><b> {</b></p><p> m2=m1; // m1為最小權值 </p><p> p2=p1; // p1為最小權值的位置 </p><p>
138、; m1=ht[k].weight; // m1存放最小權值 </p><p><b> p1=k;</b></p><p><b> }</b></p><p> else if(ht[k].weight<m2)</p><p><b> {</b>&l
139、t;/p><p> m2=ht[k].weight; // m2為次小權值 </p><p> p2=k; // p2為次小權值的位置 </p><p><b> }</b></p><p> ht[p1].parent=i; // i分別賦給下標為p1、p
140、2的數(shù)組中 </p><p> ht[p2].parent=i;</p><p> ht[i].weight=m1+m2; // 新結點的的權值為最小權值和次小權值的和 </p><p> ht[i].left=p1; // p1為新結點的左孩子 </p><p> ht[i].right
141、=p2; // p2為新結點的右孩子 </p><p><b> }</b></p><p> printf("哈夫曼樹已成功建立!\n");</p><p> return n; </p><p><b> }&l
142、t;/b></p><p> void Encoding(HuffNode ht[],HuffCode hcd[],int n)// 哈夫曼編碼 </p><p><b> { </b></p><p> HuffCode d;</p><p> int i,k,f,c;
143、 </p><p> for(i=1;i<=n;i++) // 對所有結點循環(huán) </p><p><b> {</b></p><p> d.start=n+1; // 起始位置 </p><p> c=i;
144、 // 從葉結點開始向上 </p><p> f=ht[i].parent;</p><p> while(f!=0) // 直到樹根為止 </p><p><b> {</b></p><p> if(ht[f].left==c)</p><p>
145、 d.cd[--d.start]='0';// 規(guī)定左樹為代碼0 </p><p><b> else</b></p><p> d.cd[--d.start]='1';// 規(guī)定右樹為代碼1 </p><p> c=f; // c指孩子的位置 </p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結構課程設計實習報告
- 數(shù)據(jù)結構課程設計實習報告.doc
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 《數(shù)據(jù)結構》課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計--數(shù)據(jù)結構課程設計----huffman編碼
- 數(shù)據(jù)結構課程設計——課程設計報告模板
- 數(shù)據(jù)結構課程設計報告 (2)
- 數(shù)據(jù)結構課程設計報告 (4)
- 數(shù)據(jù)結構課程設計報告.doc
- 數(shù)據(jù)結構課程設計報告 (3)
- 數(shù)據(jù)結構課程設計報告 (2)
評論
0/150
提交評論