版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 數(shù) 據(jù) 結(jié) 構(gòu)</p><p><b> 課程設計報告</b></p><p> 題 目: </p><p> 專 業(yè): </p><p> 班 級:
2、 </p><p> 學 號: </p><p> 姓 名: </p><p> 指導老師: </p>&
3、lt;p> 時 間: </p><p> 一、課程設計題目及所涉及知識點</p><p> 設計題目是:“前綴編碼問題”。</p><p> 所涉及的知識點主要是:</p><p> 本課程設計利用二叉樹來設計二進制的前綴編碼,前綴編碼顧名思義就是任意一字符的編碼
4、都不是另一個字符的編碼的前綴,主要難點在于如何根據(jù)輸入的字符和使用頻度構(gòu)造出最優(yōu)二叉樹,并根據(jù)構(gòu)造的最優(yōu)二叉樹輸出每個字符的編碼,這主要設計到對每個字符的權值進行冒泡排序找出最小的兩個權值作為左右孩子結(jié)點,以他們的和作為父母結(jié)點,并把父母結(jié)點作為新的權值數(shù)重新排序,最終構(gòu)造出完整的哈夫曼樹,以根的左右路徑分別代表值“0”與“1”連續(xù)存儲,得到每個字符的編碼。</p><p> 二、課程設計思路及算法描述<
5、/p><p> 設計思路:通過構(gòu)造哈夫曼樹的結(jié)構(gòu)體定義一個哈夫曼樹組,對用戶輸入的字符以及使用頻率進行存儲和初始化,然后對字符進行編譯處理,通過構(gòu)造哈夫曼樹編譯出每個字符的編碼,然后對每個編碼進行存儲并與字符相關聯(lián),并輸出每個字符以及對應的編碼。最終根據(jù)用戶選擇的功能進行編碼和譯碼操作。</p><p> 問題一:哈夫曼樹的表示。</p><p> 設計哈夫曼樹的
6、結(jié)構(gòu)體,其中包含使用頻率(權重)、左孩子、右孩子、雙親和要編碼的字符。用這個結(jié)構(gòu)體定義個一個哈夫曼數(shù)組。</p><p> 哈夫曼結(jié)構(gòu)體定義如下:</p><p> typedef struct</p><p><b> {</b></p><p> int weight;</p><p>
7、; int lchild;</p><p> int rchild;</p><p> int parent;</p><p><b> char key;</b></p><p><b> }htnode;</b></p><p> typedef htnode
8、 hfmt[MAXLEN];</p><p> 問題二:對輸入字符進行編碼。</p><p> 初始化哈夫曼樹,每個節(jié)點的孩子及雙親默認值為-1,使用頻率為0。根據(jù)用戶選擇輸入字符個數(shù)n,以及n個字符和n個權值,構(gòu)造出哈夫曼樹,并顯示出每個字符及對應編碼。</p><p> 1.void creathfmt(hfmt t)//創(chuàng)建哈夫曼樹的函數(shù)</p&g
9、t;<p> 2.void selectmin(hfmt t,int i,int *p1,int *p2)//選出兩個最小的字符權值</p><p> 3.void phfmnode(hfmt t)//對字符進行初始編碼</p><p> 問題三:對用戶輸入的電文進行編碼。</p><p> 用戶輸入一連串原本輸入的字符構(gòu)成電文,電文長度在10
10、00字符以內(nèi),由程序進行編碼轉(zhuǎn)換。并輸出轉(zhuǎn)換后的編碼。</p><p> void encoding(hfmt t)//對用戶輸入的電文進行編碼 </p><p><b> { </b></p><p> char r[1000];//用來存儲輸入的字符串 </p><p><b> int i,j;&
11、lt;/b></p><p> printf("\n請輸入需要編碼的字符:");</p><p><b> gets(r);</b></p><p> printf("編碼結(jié)果為:"); </p><p> for(j=0;r[j]!='\0';j++
12、)</p><p> for(i=0;i<n;i++)</p><p> if(r[j]==t[i].key)</p><p> hfmtpath(t,i,j); </p><p> printf("\n");</p><p><b> }</b></p&
13、gt;<p> 問題四:對用戶輸入的密文進行譯碼。</p><p> 用戶輸入一連串二進制代碼字符構(gòu)成密文,電文長度在100個二進制代碼以內(nèi),由程序進行編碼轉(zhuǎn)換。并輸出轉(zhuǎn)換后的譯碼。</p><p> void decoding(hfmt t)//對用戶輸入的密文進行譯碼</p><p><b> {</b></p&
14、gt;<p> char r[100];</p><p> int i,j,len;</p><p> j=2*n-2;//j初始從樹的根節(jié)點開始</p><p> printf("\n請輸入需要譯碼的字符串:");</p><p><b> gets(r);</b></
15、p><p> len=strlen(r);</p><p> printf("譯碼的結(jié)果是:");</p><p> for(i=0;i<len;i++)</p><p><b> {</b></p><p> if(r[i]=='0')</p
16、><p><b> {</b></p><p> j=t[j].lchild;</p><p> if(t[j].lchild==-1)</p><p><b> {</b></p><p> printf("%c",t[j].key);</p
17、><p><b> j=2*n-2;</b></p><p><b> }</b></p><p><b> }</b></p><p> else if(r[i]=='1')</p><p><b> {</b&g
18、t;</p><p> j=t[j].rchild;</p><p> if(t[j].rchild==-1)</p><p><b> {</b></p><p> printf("%c",t[j].key);</p><p><b> j=2*n-2;&
19、lt;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p><p><b> }<
20、;/b></p><p> 三、課程設計中遇到的難點及解決辦法</p><p> 在程序設計中遇到的問題主要是如何根據(jù)輸入的字符頻率構(gòu)造哈夫曼樹,這其中涉及到對哈夫曼樹的存儲,以及根據(jù)樹的左孩子路徑為“0”右孩子路徑“1”對字符進行二級制編碼,在參考課文和網(wǎng)絡資源后進行整理和加工,設計出了構(gòu)造哈夫曼樹的程序。由于事先不知道用戶要輸入幾個字符,所以無法判斷最終二進制編碼的長度,通過
21、定義一個比較大的存儲空間存儲編碼。在對每個字符構(gòu)造出編碼后根據(jù)用戶選擇進行編碼和譯碼,這其中遇到的難點主要是根據(jù)用戶輸入的信息進行翻譯,特別是譯碼過程,主要難點的解決時上網(wǎng)百度和詢問老師解決的。</p><p><b> 總結(jié)</b></p><p> 通過這次課程設計,我對前綴編碼問題有了深刻的認識,對哈夫曼樹的優(yōu)越性也有了深刻的了解,利用哈夫曼編碼可以極大的縮
22、短編碼長度,提高信息的傳輸時間,在社會的實際應用時很廣泛的,同時通過程序設計中對哈夫曼樹的構(gòu)造,對我的編程思想有了很大的提高,我對數(shù)據(jù)結(jié)構(gòu)也有了更好的掌握,雖然距離完全的掌握每一個功能操作還有一定的差距,但是我相信通過不斷地學習和努力,我一定能做的更好更完善。</p><p> 附錄—主要源程序代碼及運行結(jié)果</p><p> #include <stdio.h></
23、p><p> #include <stdlib.h></p><p> #include <string.h></p><p> #define MAXLEN 100</p><p> typedef struct</p><p><b> {</b></p&g
24、t;<p> int weight;</p><p> int lchild;</p><p> int rchild;</p><p> int parent;</p><p><b> char key;</b></p><p><b> }htnode;&
25、lt;/b></p><p> typedef htnode hfmt[MAXLEN];</p><p><b> int n;</b></p><p> void selectmin(hfmt t,int i,int *p1,int *p2)//選中兩個權值最小的函數(shù) </p><p><b>
26、 {</b></p><p> long min1=999999;</p><p> long min2=999999;</p><p><b> int j;</b></p><p> for(j=0;j<=i;j++)//選擇最小權值字符的下標返回 </p><p>
27、 if(t[j].parent==-1)</p><p> if(min1>t[j].weight)</p><p><b> {</b></p><p> min1=t[j].weight;</p><p><b> *p1=j;</b></p><p>&
28、lt;b> }</b></p><p> for(j=0;j<=i;j++)//選擇次小權值字符的下標還回</p><p> if(t[j].parent==-1)</p><p> if(min2>t[j].weight&&j!=(*p1))</p><p><b> {&l
29、t;/b></p><p> min2=t[j].weight;</p><p><b> *p2=j;</b></p><p><b> }</b></p><p><b> }</b></p><p> void creathfmt(
30、hfmt t)//創(chuàng)建哈夫曼樹的函數(shù) </p><p><b> {</b></p><p> int i,w,p1,p2;</p><p> char k;//k表示獲取的字符</p><p> printf("\n");</p><p> printf("
31、;------------------------------------------------\n");</p><p> printf("*********************輸入?yún)^(qū)*********************\n");</p><p> printf("\n請輸入字符個數(shù):");</p><
32、p> scanf("%d",&n);</p><p> getchar();</p><p> for(i=0;i<2*n-1;i++)//對結(jié)構(gòu)體進行初始化 </p><p><b> {</b></p><p> t[i].weight=0;</p>&
33、lt;p> t[i].lchild=-1;</p><p> t[i].rchild=-1;</p><p> t[i].parent=-1;</p><p><b> }</b></p><p> printf("\n");</p><p> for(i=0
34、;i<n;i++)</p><p><b> {</b></p><p> printf("請輸入第%d個字符:",i+1);</p><p> scanf("%c",&k);</p><p> getchar();</p><p>
35、 t[i].key=k;</p><p> printf("請輸入第%d個字符的權值:",i+1);</p><p> scanf("%d",&w);</p><p> getchar();</p><p> t[i].weight=w;</p><p> pr
36、intf("\n");</p><p><b> } </b></p><p> for(i=n;i<2*n-1;i++)</p><p><b> {</b></p><p> selectmin(t,i-1,&p1,&p2);</p>
37、<p> t[p1].parent=i;</p><p> t[p2].parent=i;</p><p> t[i].lchild=p1;</p><p> t[i].rchild=p2;</p><p> t[i].weight=t[p1].weight+t[p2].weight; </p><
38、p><b> }</b></p><p><b> }</b></p><p> void hfmtpath(hfmt t,int i,int j)//編碼的重要哈夫曼樹路徑遞歸算法 </p><p><b> {</b></p><p><b> i
39、nt a,b;</b></p><p><b> a=i;</b></p><p> b=j=t[i].parent;</p><p> if(t[j].parent!=-1) </p><p><b> {</b></p><p><b>
40、i=j;</b></p><p> hfmtpath(t,i,j);</p><p><b> }</b></p><p> if(t[b].lchild==a)</p><p> printf("0");</p><p><b> else&l
41、t;/b></p><p> printf("1");</p><p><b> }</b></p><p> void phfmnode(hfmt t)//對字符進行初始編碼</p><p><b> {</b></p><p><b
42、> int i,j;</b></p><p> printf("------------------------------------------------\n");</p><p> printf("*******************哈夫曼編碼*******************\n");</p>&
43、lt;p> for(i=0;i<n;i++)</p><p><b> {</b></p><p><b> j=0;</b></p><p> printf("\n");</p><p> printf("\t\t%c\t\t",t[i
44、].key,t[i].weight);</p><p> hfmtpath(t,i,j);</p><p><b> }</b></p><p><b> }</b></p><p> void encoding(hfmt t)//對用戶輸入的電文進行編碼 </p><p
45、><b> { </b></p><p> char r[1000];//用來存儲輸入的字符串 </p><p><b> int i,j;</b></p><p> printf("\n請輸入需要編碼的字符:");</p><p><b> gets(
46、r);</b></p><p> printf("編碼結(jié)果為:"); </p><p> for(j=0;r[j]!='\0';j++)</p><p> for(i=0;i<n;i++)</p><p> if(r[j]==t[i].key)</p><p&g
47、t; hfmtpath(t,i,j); </p><p> printf("\n");</p><p><b> }</b></p><p> void decoding(hfmt t)//對用戶輸入的密文進行譯碼</p><p><b> {</b></p>
48、;<p> char r[100];</p><p> int i,j,len;</p><p> j=2*n-2;//j初始從樹的根節(jié)點開始</p><p> printf("\n請輸入需要譯碼的字符串:");</p><p><b> gets(r);</b></p&
49、gt;<p> len=strlen(r);</p><p> printf("譯碼的結(jié)果是:");</p><p> for(i=0;i<len;i++)</p><p><b> {</b></p><p> if(r[i]=='0')</p&g
50、t;<p><b> {</b></p><p> j=t[j].lchild;</p><p> if(t[j].lchild==-1)</p><p><b> {</b></p><p> printf("%c",t[j].key);</p&g
51、t;<p><b> j=2*n-2;</b></p><p><b> }</b></p><p><b> }</b></p><p> else if(r[i]=='1')</p><p><b> {</b>
52、</p><p> j=t[j].rchild;</p><p> if(t[j].rchild==-1)</p><p><b> {</b></p><p> printf("%c",t[j].key);</p><p><b> j=2*n-2;<
53、;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p><p><b> }</
54、b></p><p> void main()</p><p><b> {</b></p><p><b> hfmt ht;</b></p><p> char flag;</p><p> printf("-------------------
55、-----------------------------\n");</p><p> printf(" **********說明********** \n"); </p><p> printf(" * 11級數(shù)據(jù)結(jié)構(gòu)課程設計 * \n");</p><p> prin
56、tf(" * 哈夫曼編碼 * \n");</p><p> printf(" * 科學與技術專業(yè) 邵帥 * \n");</p><p> printf(" ************************ \n"); </p>&l
57、t;p> creathfmt(ht);//創(chuàng)建哈夫曼樹的函數(shù)</p><p> phfmnode(ht); //對字符進行初始編碼 </p><p> printf("\n------------------------------------------------\n");</p><p><b> do{</b
58、></p><p> printf("********************功能選擇********************\n");</p><p> printf("【1】編碼\t【2】譯碼\t【0】退出\n");</p><p> printf("您的選擇:");</p>
59、<p> flag=getchar();</p><p> getchar();</p><p> if(flag=='1')</p><p> encoding(ht);</p><p> else if(flag=='2')</p><p> decoding(
60、ht);</p><p> else if(flag=='0')</p><p><b> return;</b></p><p><b> else</b></p><p> printf("您的輸入有誤,請重新輸入。\n"); </p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設計報告---前綴編碼問題
- 數(shù)據(jù)結(jié)構(gòu)課程設計--數(shù)據(jù)結(jié)構(gòu)課程設計----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計 (赫夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設計--赫夫曼編碼系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設計---- 赫夫曼編碼系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設計報告---赫夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計--赫夫曼編碼系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設計---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計----哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計--哈夫曼編碼
- 赫夫曼編碼器數(shù)據(jù)結(jié)構(gòu)課程設計
- 數(shù)據(jù)結(jié)構(gòu)課程設計---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計--電文編碼譯碼(哈夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設計實驗報告(赫夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設計赫夫曼編碼譯碼器
- 數(shù)據(jù)結(jié)構(gòu) 課程設計之哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設計電文編碼譯碼(哈夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設計----huffman樹編碼和譯碼
評論
0/150
提交評論