版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程設(shè)計(jì)題目 : 赫夫曼編碼系統(tǒng) </p><p> 學(xué)生姓名 : </p><p> 專 業(yè) : 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 班 級(jí) : </p><p&g
2、t; 學(xué) 號(hào) : </p><p> 指導(dǎo)教師 : </p><p> 2012年 06 月 20 日</p><p><b> 目 錄</b></p><p> 設(shè)計(jì)要求------------------------------------2</p><p
3、> 二、存儲(chǔ)結(jié)構(gòu)------------------------------------2</p><p> 三、設(shè)計(jì)思想------------------------------------2</p><p> 1、設(shè)計(jì)包含的幾個(gè)部分-----------------------2</p><p> 2、流程圖-------------------
4、----------------3</p><p> 四、詳細(xì)設(shè)計(jì)------------------------------------4</p><p> 五、算法復(fù)雜度分析------------------------------8</p><p> 六、顯示結(jié)果------------------------------------9</p&g
5、t;<p> 七、心得體會(huì)------------------------------------11</p><p> 八、附錄:源程序代碼----------------------------11</p><p><b> 一、設(shè)計(jì)要求</b></p><p><b> 赫夫曼樹</b><
6、/p><p> 任務(wù) :建立建立最優(yōu)二叉樹函數(shù) </p><p> 要求:可以建立函數(shù)輸入二叉樹,實(shí)現(xiàn)赫夫曼樹的編碼和譯碼系統(tǒng),重復(fù)地顯示并處理編碼/解碼功能,直到選擇退出為止。</p><p><b> 二、存儲(chǔ)結(jié)構(gòu):</b></p><p> 在本次課程設(shè)計(jì)中,每一個(gè)字符的信息用一個(gè)結(jié)構(gòu)體存儲(chǔ),包含結(jié)點(diǎn)值、<
7、;/p><p> 權(quán)值、雙親結(jié)點(diǎn)、左孩子結(jié)點(diǎn)、右孩子結(jié)點(diǎn)等數(shù)據(jù)。赫夫曼碼和所有字符都是用一個(gè)一維數(shù)組建立存儲(chǔ)的,所以本次課程設(shè)計(jì)的存儲(chǔ)結(jié)構(gòu)是順序存儲(chǔ)。</p><p><b> 三、設(shè)計(jì)思想</b></p><p> 哈夫曼編譯碼系統(tǒng)的主要功能是先建立哈夫曼樹,然后利用建好的哈夫曼樹生成哈夫曼編碼后進(jìn)行譯碼 。</p><
8、p> 在數(shù)據(jù)通信中,經(jīng)常需要將傳送的文字轉(zhuǎn)換成由二進(jìn)制字符0、1組成的二進(jìn)制串,稱之為編碼。構(gòu)造一棵哈夫曼樹,規(guī)定哈夫曼樹中的左分之代表0,右分支代表1,則從根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)所經(jīng)過的路徑分支組成的0和1的序列便為該節(jié)點(diǎn)對(duì)應(yīng)字符的編碼,稱之為哈夫曼編碼。</p><p> 最簡(jiǎn)單的二進(jìn)制編碼方式是等長(zhǎng)編碼。若采用不等長(zhǎng)編碼,讓出現(xiàn)頻率高的字符具有較短的編碼,讓出現(xiàn)頻率低的字符具有較長(zhǎng)的編碼,這樣可能縮
9、短傳送電文的總長(zhǎng)度。哈夫曼樹用于構(gòu)造使電文的編碼總長(zhǎng)最短的編碼方案。</p><p> ?。?)設(shè)計(jì)包含的幾個(gè)方面:</p><p><b> ① 赫夫曼樹的建立</b></p><p> 赫夫曼樹的建立由赫夫曼算法的定義可知,初始森林中共有n棵只含有根結(jié)點(diǎn)的二叉樹。算法的第二步是:將當(dāng)前森林中的兩棵根結(jié)點(diǎn)權(quán)值最小的二叉樹,合并成一棵新的二
10、叉樹;每合并一次,森林中就減少一棵樹,產(chǎn)生一個(gè)新結(jié)點(diǎn)。顯然要進(jìn)行n-1次合并,所以共產(chǎn)生n-1個(gè)新結(jié)點(diǎn),它們都是具有兩個(gè)孩子的分支結(jié)點(diǎn)。由此可知,最終求得的赫夫曼樹中一共有2n-1個(gè)結(jié)點(diǎn),其中n個(gè)結(jié)點(diǎn)是初始森林的n個(gè)孤立結(jié)點(diǎn)。并且赫夫曼樹中沒有度數(shù)為1的分支結(jié)點(diǎn)。我們可以利用一個(gè)大小為2n--1的一維數(shù)組來(lái)存儲(chǔ)赫夫曼樹中的結(jié)點(diǎn)。</p><p><b> ?、?赫夫曼編碼 </b></
11、p><p> 要求電文的赫夫曼編碼,必須先定義赫夫曼編碼類型,根據(jù)設(shè)計(jì)要求和實(shí)際需要定義的類型如下: </p><p> typedet struct { </p><p> char ch; // 存放編碼的字符 </p><p> char bits[N+1]; // 存放編碼位串 </p><p> int
12、 len; // 編碼的長(zhǎng)度 </p><p> }CodeNode; // 編碼結(jié)構(gòu)體類型 </p><p> ?、?代碼文件的譯碼 </p><p> 譯碼的基本思想是:讀文件中編碼,并與原先生成的赫夫曼編碼表比較,遇到相等時(shí),即取出其對(duì)應(yīng)的字符存入一個(gè)新串中。</p><p> ?。?)其主要流程圖如圖所示。</p>
13、<p><b> 四、詳細(xì)設(shè)計(jì)</b></p><p> ?。?)①赫夫曼樹的存儲(chǔ)結(jié)構(gòu)描述為: </p><p> #define N 50 // 葉子結(jié)點(diǎn)數(shù) </p><p> #define M 2*N-1 // 赫夫曼樹中結(jié)點(diǎn)總數(shù) </p><p> typedef struct { </p
14、><p> int weight; // 葉子結(jié)點(diǎn)的權(quán)值 </p><p> int lchild, rchild, parent; // 左右孩子及雙親指針 </p><p> }HTNode; // 樹中結(jié)點(diǎn)類型 </p><p> typedef HTNode HuffmanTree[M+1]; </p><p&
15、gt;<b> ②哈弗曼樹的算法</b></p><p> void CreateHT(HTNode ht[],int n) //調(diào)用輸入的數(shù)組ht[],和節(jié)點(diǎn)數(shù)n</p><p><b> {</b></p><p> int i,k,lnode,rnode;</p>
16、<p> int min1,min2;</p><p> for (i=0;i<2*n-1;i++) </p><p> ht[i].parent=ht[i].lchild=ht[i].rchild=-1; //所有結(jié)點(diǎn)的相關(guān)域置初值-1</p><p> for (i=n;i<2*n-1;i++)
17、 //構(gòu)造哈夫曼樹</p><p><b> {</b></p><p> min1=min2=32767; //int的范圍是-32768—32767</p><p> lnode=rnode=-1; //lnode和rnode記錄最小權(quán)值的兩個(gè)結(jié)點(diǎn)位置&l
18、t;/p><p> for (k=0;k<=i-1;k++)</p><p><b> {</b></p><p> if (ht[k].parent==-1) //只在尚未構(gòu)造二叉樹的結(jié)點(diǎn)中查找</p><p><b> {</b></p>&l
19、t;p> if (ht[k].weight<min1) //若權(quán)值小于最小的左節(jié)點(diǎn)的權(quán)值</p><p><b> {</b></p><p> min2=min1;rnode=lnode;</p><p> min1=ht[k].weight;lnode=k;</p><p>&
20、lt;b> }</b></p><p> else if (ht[k].weight<min2)</p><p><b> {</b></p><p> min2=ht[k].weight;rnode=k;</p><p><b> }</b></p>
21、<p><b> }</b></p><p><b> }</b></p><p> ht[lnode].parent=i;ht[rnode].parent=i; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)是i</p><p> ht[i].weight=ht[lnode].weight+h
22、t[rnode].weight; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)權(quán)值為兩個(gè)最小節(jié)點(diǎn)權(quán)值之和</p><p> ht[i].lchild=lnode;ht[i].rchild=rnode; //父節(jié)點(diǎn)的左節(jié)點(diǎn)和右節(jié)點(diǎn)</p><p><b> }</b></p><p><b> }</
23、b></p><p><b> ?。?)哈弗曼編碼</b></p><p> void CreateHCode(HTNode ht[],HCode hcd[],int n)</p><p><b> {</b></p><p> int i,f,c;</p><p&g
24、t;<b> HCode hc;</b></p><p> for (i=0;i<n;i++) //根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b> {</b></p><p> hc.start=n;c=i;</p><p>
25、 f=ht[i].parent;</p><p> while (f!=-1) //循序直到樹根結(jié)點(diǎn)結(jié)束循環(huán)</p><p><b> {</b></p><p> if (ht[f].lchild==c) //處理左孩子結(jié)點(diǎn)</
26、p><p> hc.cd[hc.start--]='0';</p><p> else //處理右孩子結(jié)點(diǎn)</p><p> hc.cd[hc.start--]='1';</p><p> c=f;f=ht[f].parent;</
27、p><p><b> }</b></p><p> hc.start++; //start指向哈夫曼編碼hc.cd[]中最開始字符</p><p> hcd[i]=hc;</p><p><b> }</b></p>&l
28、t;p><b> }</b></p><p> void DispHCode(HTNode ht[],HCode hcd[],int n) //輸出哈夫曼編碼的列表</p><p><b> {</b></p><p><b> int i,k;</b></p>&
29、lt;p> printf(" 輸出哈夫曼編碼:\n"); </p><p> for (i=0;i<n;i++) //輸出data中的所有數(shù)據(jù),即A-Z</p><p><b> {</b></p><p> printf("
30、 %c:\t",ht[i].data); </p><p> for (k=hcd[i].start;k<=n;k++) //輸出所有data中數(shù)據(jù)的編碼</p><p><b> {</b></p><p> printf("%c",
31、hcd[i].cd[k]); </p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p>
32、<p> void editHCode(HTNode ht[],HCode hcd[],int n) //編碼函數(shù)</p><p><b> {</b></p><p> char string[MAXSIZE]; </p><p> int i,j,k;</p&g
33、t;<p> scanf("%s",string); //把要進(jìn)行編碼的字符串存入string數(shù)組中</p><p> printf("\n輸出編碼結(jié)果:\n");</p><p> for (i=0;string[i]!='#';i++)
34、 //#為終止標(biāo)志</p><p><b> {</b></p><p> for (j=0;j<n;j++)</p><p><b> {</b></p><p> if(string[i]==ht[j].data) //循環(huán)查找與輸入字符相同的編號(hào),相同的就
35、輸出這個(gè)字符的編碼</p><p><b> {</b></p><p> for (k=hcd[j].start;k<=n;k++)</p><p><b> {</b></p><p> printf("%c",hcd[j].cd[k]);</p>
36、<p><b> }</b></p><p> break; //輸出完成后跳出當(dāng)前for循環(huán)</p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
37、t;/b></p><p><b> }</b></p><p><b> ?。?)哈弗曼譯碼</b></p><p> void deHCode(HTNode ht[],HCode hcd[],int n) //譯碼函數(shù)</p><p><b> {</b&g
38、t;</p><p> char code[MAXSIZE];</p><p> int i,j,l,k,m,x;</p><p> scanf("%s",code); //把要進(jìn)行譯碼的字符串存入code數(shù)組中</p><p> while(code[0]!=
39、9;#')</p><p> for (i=0;i<n;i++)</p><p><b> {</b></p><p> m=0; //m為想同編碼個(gè)數(shù)的計(jì)數(shù)器</p><p> for (k=hcd[i].start,j=0;k<=
40、n;k++,j++) //j為記錄所存儲(chǔ)這個(gè)字符的編碼個(gè)數(shù)</p><p><b> {</b></p><p> if(code[j]==hcd[i].cd[k]) //當(dāng)有相同編碼時(shí)m值加1</p><p><b> m++;</b></p><p><
41、b> }</b></p><p> if(m==j) //當(dāng)輸入的字符串與所存儲(chǔ)的編碼字符串個(gè)數(shù)相等時(shí)則輸出這個(gè)的data數(shù)據(jù)</p><p><b> {</b></p><p> printf("%c",ht[i].data);<
42、/p><p> for(x=0;code[x-1]!='#';x++) //把已經(jīng)使用過的code數(shù)組里的字符串刪除</p><p><b> {</b></p><p> code[x]=code[x+j];</p><p><b> }</b></p
43、><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> ?。?)主函數(shù)</b></p><p> void main()</p><
44、;p><b> {</b></p><p> int n=26,i;</p><p> char orz,back,flag=1;</p><p> char str[]={'a','b','c','d','e','f','g&
45、#39;,'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y'
46、,'z'}; //初始化</p><p> int fnum[]={186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16}; //初始化</p><p> HTNode ht[M]; //建立結(jié)構(gòu)體</p><p
47、> HCode hcd[N]; //建立結(jié)構(gòu)體</p><p> for (i=0;i<n;i++) //把初始化的數(shù)據(jù)存入ht結(jié)構(gòu)體中</p><p><b> {</b></p><p> ht[i].data=str[i];</p><p>
48、ht[i].weight=fnum[i];</p><p><b> }</b></p><p> while (flag) //菜單函數(shù),當(dāng)flag為0時(shí)跳出循環(huán)</p><p> (5)顯示部分源程序:</p><p><b> {</b></p&g
49、t;<p> printf(" 歡迎使用赫夫曼編譯系統(tǒng) \n");</p><p> printf(" 制作人:章建\n");</p><p> printf(" *************
50、************************************\n");</p><p> printf(" 1:顯示編碼\n ");</p><p> printf(" 2:進(jìn)行編碼\n");</p>
51、<p> printf(" 3:進(jìn)行譯碼\n");</p><p> printf(" 0:退出\n");</p><p> printf(" ********************
52、*****************************\n");</p><p> printf(" 請(qǐng)輸入選擇的編號(hào):");</p><p> scanf("%c",&orz);</p><p> switch(orz)</p>
53、<p><b> {</b></p><p><b> case '1':</b></p><p> system("cls"); //清屏函數(shù)</p><p> CreateHT(ht,n);</p>
54、<p> CreateHCode(ht,hcd,n);</p><p> DispHCode(ht,hcd,n);</p><p> printf("\n按任意鍵返回...");</p><p><b> getch();</b></p><p> system("cls
55、");</p><p><b> break;</b></p><p><b> case '2':</b></p><p> system("cls");</p><p> printf("請(qǐng)輸入要進(jìn)行編碼的字符串(以#結(jié)束,字符為小
56、寫英文字母):\n");</p><p> editHCode(ht,hcd,n);</p><p> printf("\n按任意鍵返回...");</p><p><b> getch();</b></p><p> system("cls");</p&g
57、t;<p><b> break;</b></p><p><b> case '3':</b></p><p> system("cls");</p><p> DispHCode(ht,hcd,n);</p><p> printf(&
58、quot;請(qǐng)輸入編碼(以#結(jié)束):\n");</p><p> deHCode(ht,hcd,n);</p><p> printf("\n按任意鍵返回...");</p><p><b> getch();</b></p><p> system("cls");
59、</p><p><b> break;</b></p><p><b> case '0':</b></p><p><b> flag=0;</b></p><p> printf("
60、 感謝您的使用! \n");</p><p><b> break;</b></p><p><b> default:</b></p><p> system("cls");</p><p><b> }</b>&
61、lt;/p><p><b> }</b></p><p><b> }</b></p><p> 五、算法復(fù)雜度分析:</p><p> void editHCode(HTNode ht[],HCode hcd[],int n) //編碼函數(shù)</p><p> voi
62、d deHCode(HTNode ht[],HCode hcd[],int n) //譯碼函數(shù)</p><p> 這兩個(gè)被調(diào)函數(shù)里面都用了三重循環(huán),其他的調(diào)用函數(shù)或者主函數(shù)都是一重或二重循環(huán),所以算法復(fù)雜度為o(n^3)??梢钥闯龃怂惴ㄐ适潜容^低的,希望能夠找出更好的算法來(lái)減小復(fù)雜度。</p><p><b> 六、調(diào)試結(jié)果</b></p><
63、;p><b> 進(jìn)入主菜單</b></p><p><b> 選1時(shí)的顯示結(jié)果</b></p><p><b> 選擇2時(shí)的顯示結(jié)果</b></p><p><b> 選3時(shí)的顯示結(jié)果</b></p><p><b> 七、心得體
64、會(huì)</b></p><p> 通過這次課程設(shè)計(jì),讓我對(duì)一個(gè)程序的數(shù)據(jù)結(jié)構(gòu)有更全面更進(jìn)一步的認(rèn)識(shí),根據(jù)不同的需求,采用不同的數(shù)據(jù)存儲(chǔ)方式,不一定要用棧,二叉樹等高級(jí)類型,有時(shí)用基本的一維數(shù)組,只要運(yùn)用得當(dāng),也能達(dá)到相同的效果,甚至更佳,就如這次的課程設(shè)計(jì),通過用for的多重循環(huán),舍棄多余的循環(huán),提高了程序的運(yùn)行效率。在編寫這個(gè)程序的過程中,我復(fù)習(xí)了之前學(xué)的基本語(yǔ)法,哈弗曼樹最小路徑的求取,哈弗曼編碼及
65、譯碼的應(yīng)用范圍,程序結(jié)構(gòu)算法等一系列的問題它使我對(duì)數(shù)據(jù)結(jié)構(gòu)改變了看法。在這次設(shè)計(jì)過程中,體現(xiàn)出自己?jiǎn)为?dú)設(shè)計(jì)模具的能力以及綜合運(yùn)用知識(shí)的能力,體會(huì)了學(xué)以致用、突出自己勞動(dòng)成果的喜悅心情,也從中發(fā)現(xiàn)自己平時(shí)學(xué)習(xí)的不足和薄弱環(huán)節(jié),從而加以彌補(bǔ)。</p><p> 八、附錄:源程序代碼</p><p><b> 源程序如下:</b></p><p>
66、; #include <stdio.h></p><p> #include <stdlib.h> //要用system函數(shù)要調(diào)用的頭文件</p><p> #include<conio.h> //用getch()要調(diào)用的頭文件</p><p> #include <strin
67、g.h></p><p> #define N 50 //義用N表示50葉節(jié)點(diǎn)數(shù)</p><p> #define M 2*N-1 //用M表示節(jié)點(diǎn)總數(shù) 當(dāng)葉節(jié)點(diǎn)數(shù)位n時(shí)總節(jié)點(diǎn)數(shù)為2n-1</p><p> #define MAXSIZE 100</p><p> ty
68、pedef struct</p><p><b> {</b></p><p> char data; //結(jié)點(diǎn)值</p><p> int weight; //權(quán)值</p><p> int parent; //雙
69、親結(jié)點(diǎn)</p><p> int lchild; //左孩子結(jié)點(diǎn)</p><p> int rchild; //右孩子結(jié)點(diǎn)</p><p> }HTNode; </p><p> typedef struct</p>&
70、lt;p><b> {</b></p><p> char cd[N]; //存放哈夫曼碼</p><p> int start; //從start開始讀cd中的哈夫曼碼</p><p><b> }HCode;</b></p>
71、<p> void CreateHT(HTNode ht[],int n) //調(diào)用輸入的數(shù)組ht[],和節(jié)點(diǎn)數(shù)n</p><p><b> {</b></p><p> int i,k,lnode,rnode;</p><p> int min1,min2;</p><p&g
72、t; for (i=0;i<2*n-1;i++) </p><p> ht[i].parent=ht[i].lchild=ht[i].rchild=-1; //所有結(jié)點(diǎn)的相關(guān)域置初值-1</p><p> for (i=n;i<2*n-1;i++) //構(gòu)造哈夫曼樹</p><p><b&
73、gt; {</b></p><p> min1=min2=32767; //int的范圍是-32768-32767</p><p> lnode=rnode=-1; //lnode和rnode記錄最小權(quán)值的兩個(gè)結(jié)點(diǎn)位置</p><p> for (k=0;k<=i-1;k++)
74、</p><p><b> {</b></p><p> if (ht[k].parent==-1) //只在尚未構(gòu)造二叉樹的結(jié)點(diǎn)中查找</p><p><b> {</b></p><p> if (ht[k].weight<min1)
75、 //若權(quán)值小于最小的左節(jié)點(diǎn)的權(quán)值</p><p><b> {</b></p><p> min2=min1;rnode=lnode;</p><p> min1=ht[k].weight;lnode=k;</p><p><b> }</b></p><p>
76、else if (ht[k].weight<min2)</p><p><b> {</b></p><p> min2=ht[k].weight;rnode=k;</p><p><b> }</b></p><p><b> }</b></p>
77、<p><b> }</b></p><p> ht[lnode].parent=i;ht[rnode].parent=i; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)是i</p><p> ht[i].weight=ht[lnode].weight+ht[rnode].weight; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)權(quán)值為兩個(gè)最小節(jié)點(diǎn)
78、權(quán)值之和</p><p> ht[i].lchild=lnode;ht[i].rchild=rnode; //父節(jié)點(diǎn)的左節(jié)點(diǎn)和右節(jié)點(diǎn)</p><p><b> }</b></p><p><b> }</b></p><p> void CreateHCode
79、(HTNode ht[],HCode hcd[],int n)</p><p><b> {</b></p><p> int i,f,c;</p><p><b> HCode hc;</b></p><p> for (i=0;i<n;i++)
80、 //根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b> {</b></p><p> hc.start=n;c=i;</p><p> f=ht[i].parent;</p><p> while (f!=-1) //循序直到樹根結(jié)點(diǎn)結(jié)束
81、循環(huán)</p><p><b> {</b></p><p> if (ht[f].lchild==c) //處理左孩子結(jié)點(diǎn)</p><p> hc.cd[hc.start--]='0';</p><p> else
82、 //處理右孩子結(jié)點(diǎn)</p><p> hc.cd[hc.start--]='1';</p><p> c=f;f=ht[f].parent;</p><p><b> }</b></p><p> hc.start++;
83、 //start指向哈夫曼編碼hc.cd[]中最開始字符</p><p> hcd[i]=hc;</p><p><b> }</b></p><p><b> }</b></p><p> void DispHCode(HTNode ht[],HCode hcd[],int
84、 n) //輸出哈夫曼編碼的列表</p><p><b> {</b></p><p><b> int i,k;</b></p><p> printf(" 輸出哈夫曼編碼:\n"); </p><p> for (i=0;i<n;i++)
85、 //輸出data中的所有數(shù)據(jù),即A-Z</p><p><b> {</b></p><p> printf(" %c:\t",ht[i].data); </p><p> for (k=hcd[i].start;k<=n;k+
86、+) //輸出所有data中數(shù)據(jù)的編碼</p><p><b> {</b></p><p> printf("%c",hcd[i].cd[k]); </p><p><b> }</b></p><
87、p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> void editHCode(HTNode ht[],HCode hcd[],int n) //編碼函數(shù)</p><p><b
88、> {</b></p><p> char string[MAXSIZE]; </p><p> int i,j,k;</p><p> scanf("%s",string); //把要進(jìn)行編碼的字符串存入string數(shù)組中<
89、/p><p> printf("\n輸出編碼結(jié)果:\n");</p><p> for (i=0;string[i]!='#';i++) //#為終止標(biāo)志</p><p><b> {</b></p><p> for (j=0;j<n;j+
90、+)</p><p><b> {</b></p><p> if(string[i]==ht[j].data) //循環(huán)查找與輸入字符相同的編號(hào),相同的就輸出這個(gè)字符的編碼</p><p><b> {</b></p><p> for (k=hcd[j].start
91、;k<=n;k++)</p><p><b> {</b></p><p> printf("%c",hcd[j].cd[k]);</p><p><b> }</b></p><p> break; //輸出完成后跳出當(dāng)前
92、for循環(huán)</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void deHCode(HTNode
93、ht[],HCode hcd[],int n) //譯碼函數(shù)</p><p><b> {</b></p><p> char code[MAXSIZE];</p><p> int i,j,l,k,m,x;</p><p> scanf("%s",code);
94、 //把要進(jìn)行譯碼的字符串存入code數(shù)組中</p><p> while(code[0]!='#')</p><p> for (i=0;i<n;i++)</p><p><b> {</b></p><p> m=0;
95、 //m為想同編碼個(gè)數(shù)的計(jì)數(shù)器</p><p> for (k=hcd[i].start,j=0;k<=n;k++,j++) //j為記錄所存儲(chǔ)這個(gè)字符的編碼個(gè)數(shù)</p><p><b> {</b></p><p> if(code[j]==hcd[i].cd[k]) //當(dāng)有相同編碼
96、時(shí)m值加1</p><p><b> m++;</b></p><p><b> }</b></p><p> if(m==j) //當(dāng)輸入的字符串與所存儲(chǔ)的編碼字符串個(gè)數(shù)相等時(shí)則輸出這個(gè)的data數(shù)據(jù)</p><p><b&g
97、t; {</b></p><p> printf("%c",ht[i].data);</p><p> for(x=0;code[x-1]!='#';x++) //把已經(jīng)使用過的code數(shù)組里的字符串刪除</p><p><b> {</b></p>&l
98、t;p> code[x]=code[x+j];</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
99、 void main()</p><p><b> {</b></p><p> int n=26,i;</p><p> char orz,back,flag=1;</p><p> char str[]={'a','b','c','d',
100、9;e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w&
101、#39;,'x','y','z'}; //初始化</p><p> int fnum[]={186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16}; //初始化</p><p> HTNode ht[M];
102、 //建立結(jié)構(gòu)體</p><p> HCode hcd[N]; //建立結(jié)構(gòu)體</p><p> for (i=0;i<n;i++) //把初始化的數(shù)據(jù)存入ht結(jié)構(gòu)體中</p><p><b> {</b></p><p> ht[i].data=str
103、[i];</p><p> ht[i].weight=fnum[i];</p><p><b> }</b></p><p> while (flag) //菜單函數(shù),當(dāng)flag為0時(shí)跳出循環(huán)</p><p><b> {</b></p><
104、;p> printf(" 歡迎使用赫夫曼編譯系統(tǒng) \n");</p><p> printf(" 制作人:章建\n");</p><p> printf(" ********************
105、*****************************\n");</p><p> printf(" 1:顯示編碼\n ");</p><p> printf(" 2:進(jìn)行編碼\n");</p><p
106、> printf(" 3:進(jìn)行譯碼\n");</p><p> printf(" 0:退出\n");</p><p> printf(" ***************************
107、**********************\n");</p><p> printf(" 請(qǐng)輸入選擇的編號(hào):");</p><p> scanf("%c",&orz);</p><p> switch(orz)</p><p
108、><b> {</b></p><p><b> case '1':</b></p><p> system("cls"); //清屏函數(shù)</p><p> CreateHT(ht,n);</p><p&g
109、t; CreateHCode(ht,hcd,n);</p><p> DispHCode(ht,hcd,n);</p><p> printf("\n按任意鍵返回...");</p><p><b> getch();</b></p><p> system("cls")
110、;</p><p><b> break;</b></p><p><b> case '2':</b></p><p> system("cls");</p><p> printf("請(qǐng)輸入要進(jìn)行編碼的字符串(以#結(jié)束,字符為小寫英文字母):
111、\n");</p><p> editHCode(ht,hcd,n);</p><p> printf("\n按任意鍵返回...");</p><p><b> getch();</b></p><p> system("cls");</p><
112、;p><b> break;</b></p><p><b> case '3':</b></p><p> system("cls");</p><p> DispHCode(ht,hcd,n);</p><p> printf("請(qǐng)輸
113、入編碼(以#結(jié)束):\n");</p><p> deHCode(ht,hcd,n);</p><p> printf("\n按任意鍵返回...");</p><p><b> getch();</b></p><p> system("cls");</p&
114、gt;<p><b> break;</b></p><p><b> case '0':</b></p><p><b> flag=0;</b></p><p> printf(" 感謝您的使
115、用! \n");</p><p><b> break;</b></p><p><b> default:</b></p><p> system("cls");</p><p><b> }</b></p&g
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---- 赫夫曼編碼系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--赫夫曼編碼系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) (赫夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---赫夫曼編碼
- 赫夫曼編碼器數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告(赫夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)赫夫曼編碼譯碼器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--赫夫曼編碼譯碼器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)前綴編碼課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---前綴編碼問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--電文編碼譯碼(哈夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì)之哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)電文編碼譯碼(哈夫曼編碼)
評(píng)論
0/150
提交評(píng)論