數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)三哈夫曼樹實(shí)驗(yàn)報(bào)告_第1頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)三哈夫曼樹實(shí)驗(yàn)報(bào)告_第2頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)三哈夫曼樹實(shí)驗(yàn)報(bào)告_第3頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)三哈夫曼樹實(shí)驗(yàn)報(bào)告_第4頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)三哈夫曼樹實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)三哈夫曼樹實(shí)驗(yàn)報(bào)告 題目:哈夫曼編譯碼器 一、題目要求: 寫一個(gè)哈夫曼碼得編譯碼系統(tǒng),要求能對要傳輸?shù)脠?bào)文進(jìn)行編碼與解碼。構(gòu)造哈夫曼樹時(shí),權(quán)值小得放左子樹,權(quán)值大得放右子樹,編碼時(shí)右子樹編碼為 1,左子樹編碼為 0、 二、概要設(shè)計(jì): 數(shù)據(jù)結(jié)構(gòu): tpeef struct nt btmaxbi; int str; hcodtype; /* 編碼結(jié)構(gòu)體 / typede strut int wegt; t parent; it lchld; int rild; char alue; hnd; /* 結(jié)點(diǎn)結(jié)構(gòu)體 * 函數(shù): void enhuffmare (hnode huffndxd,

2、 it n) 作用:構(gòu)造一個(gè)哈夫曼樹,并循環(huán)構(gòu)建 it in () 作用:運(yùn)用已經(jīng)構(gòu)建好得哈弗曼樹,進(jìn)行節(jié)點(diǎn)得處理,到達(dá)成功解碼編譯 三、詳細(xì)設(shè)計(jì): 哈夫曼樹得建立: void demohufmntree (hnode hfndemxnode, int ) i 0, j, m, m, x1, x; chr x; /* 初始化存放哈夫曼樹數(shù)組 fode 中得結(jié)點(diǎn) */ wil (in) ufnodi、wegt = ;/權(quán)值 hffno、paent -1; hufn、lchld =-1; hufnode、rid ; ? snf(%c",&x); scan(”c",huf

3、fnoei、lu); /實(shí)際值,可根據(jù)情況替換為字母 i+; 輸入 n 個(gè)葉子結(jié)點(diǎn)得權(quán)值 ;)&,"%"(fas? fo(i=;in;i+) scn (”%, hfode、weight); or (i=; i2*n-1; i+) huffodei、eight 0;/權(quán)值 foei、arent =1; hffnoi、lchld =1; ufnodi、rchild -1; huffdei、vluei; / 循環(huán)構(gòu)造 huffmn 樹 / fo (i0; in1; +) m=m2=maxq; / m1、m2 中存放兩個(gè)無父結(jié)點(diǎn)且結(jié)點(diǎn)權(quán)值最小得兩個(gè)結(jié)點(diǎn) x=2=0;/找出所

4、有結(jié)點(diǎn)中權(quán)值最小、無父結(jié)點(diǎn)得兩個(gè)結(jié)點(diǎn),并合并之為一顆二叉樹 for (j=0; +i; j+) if (hffnoej、egt < m && huffnoej、prt=1) m2m1;/m1 中就是最小 x=x1; m1=huffnodj、weigt; x1=j; ele if (huffndj、wegt m2 & uffnodj、arent=-1) m2=huffnoej、eiht; x2j; ed fr */ * 設(shè)置找到得兩個(gè)子結(jié)點(diǎn) x1、x2 得父結(jié)點(diǎn)信息 / huffnode、parent = n+i; huffnod2、prnt = i; hffode

5、i、weight = huffnox1、wight + huffnodex2、wih; hufne+i、cil x; hufodn+、rild = 2; 葉子節(jié)點(diǎn)得哈夫曼編碼得保存: or (j=cd、start+; jn; j) hfodi、itj = cd、bij; huffodi、stt = d、sart; 主函數(shù)展示: int ai() hnde hufnodemaxoe; hcodetype hffodeaxaf,cd; int i, , c, p, n,k; ch en10; char z; can ("%”, &); hfmntree (huffnoe, );

6、for (; < ; i+) cd、strt = n-; c ; p = hffnodec、prnt; whi (p != ) * 父結(jié)點(diǎn)存在 */ if (huffndep、child = c) d、bitcd、srt = 0; ls cd、bitc、tart = 1; d、start-; 求編碼得低一位 */ c=p; hufnde、arent; /* 設(shè)置下一循環(huán)條件 */ / end while or (j=d、sar+1; ? else; ? ;)”n"(ftnirp? for(i=0;i 雖然哈夫曼樹得建立有書上得參考,但就是實(shí)際寫整個(gè)代碼得時(shí)候還就是問題重重。首先

7、就就是哈弗曼樹忘記了初始得賦值,導(dǎo)致最后出現(xiàn)了問題。這樣得錯(cuò)誤還就是很容易解決,但就是之后就出現(xiàn)了 wa得情況。在同學(xué)得幫助下,最后發(fā)現(xiàn)就是因?yàn)樵谶x取節(jié)點(diǎn)得時(shí)候,循環(huán)出現(xiàn)了問題,雖然瞧起來編譯沒有錯(cuò),但就是邊緣情況就會出現(xiàn)數(shù)據(jù)錯(cuò)誤,這個(gè)還就是很令人警醒,而這種思考得不全面得問題,在bu得過程中會耗去大量得時(shí)間,這就是要注意得。 五、用戶操作說明: 輸入表示字符集大小為 n(n <= 10)得正整數(shù),以及 n 個(gè)字符與 n 個(gè)權(quán)值(正整數(shù),值越大表示該字符出現(xiàn)得概率越大); 輸入串長小于或等于 100 得目標(biāo)報(bào)文。 六、運(yùn)行結(jié)果: 附帶自己得算法完成得結(jié)果圖,可以通過rt sc 與圖片器獲

8、得; 七、附錄: inclu <tdio、h inlde<tdli、 ein mabit 0 efne maxlef defin mxode maxleaf*2 1 #defie axqz 100 /權(quán)值 ypeef strct nt btabit; it start; hodtype; /* 編碼結(jié)構(gòu)體 * yedef truct nt igh; int paret; int lchil; int rchld; char vlu; hnode; / 結(jié)點(diǎn)結(jié)構(gòu)體 / 構(gòu)造一顆哈夫曼樹 */ vid hufmantree (hde hufnodmxnode, int ) int i

9、, , 1, m2, 1, 2; cr x; 初始化存放哈夫曼樹數(shù)組 ffnd 中得結(jié)點(diǎn) / whe (n) hnoi、eight 0;/權(quán)值 huffoe、parent =-; ufnodei、lchl ; hufndi、child -1; ;)x&,"c%"(nacs? scanf("%",&uffdei、value); /實(shí)際值,可根據(jù)情況替換為字母 ; / 輸入 n 個(gè)葉子結(jié)點(diǎn)得權(quán)值 * ;)x&,"c%”(fnacs? i = 0; while (in) anf (%", &ufne、iht)

10、; i+; o (i=n; i2*1; i+) hufnode、weight = 0;/權(quán)值 ufodi、arent =-1; hundei、lhil =1; hffnei、rchild =-; uffnoe、vl=; /* 循環(huán)構(gòu)造 huffman 樹 */ or (i; in-1; i+) =mmaxq; / 1、2 中存放兩個(gè)無父結(jié)點(diǎn)且結(jié)點(diǎn)權(quán)值最小得兩個(gè)結(jié)點(diǎn) x1x2=0;/找出所有結(jié)點(diǎn)中權(quán)值最小、無父結(jié)點(diǎn)得兩個(gè)結(jié)點(diǎn),并合并之為一顆二叉樹 for (0; ni; j+) if (huffnoj、weiht < 1 & ufndej、part1) 2m1;/m1 中就是最小

11、x2=x1; mhuffndej、wight; x1=j; els f (ufnodj、weight < m2 & huffj、parent=) m2=hufnj、wg; x2=j; / end for * /* 設(shè)置找到得兩個(gè)子結(jié)點(diǎn) 1、x2 得父結(jié)點(diǎn)信息 */ ufndex1、an = i; ufodex2、parent = n+i; uffnde+、weight = ufndx1、weght + hufnodex2、weight; hunode+i、lcild = x1; huffnen、chld 2; t in() hno noemaxnode; 定義一個(gè)結(jié)點(diǎn)結(jié)構(gòu)體數(shù)組

12、hcodpe uodemal,; /* 定義一個(gè)編碼結(jié)構(gòu)體數(shù)組, 同時(shí)定義一個(gè)臨時(shí)變量來存放求解編碼時(shí)得信息 */ int i, j, c, p, n,k0; har we100; char z; scanf (”%d”, &n); hufmantree (hffode, n); fr (=; i < n; i+) cd、sr = n-; = ; = huffnoc、parent; ile (p ! 1) /* 父結(jié)點(diǎn)存在 */ if (hufde、lchild = c) d、btcd、star = 0; ls d、icd、start = 1; cd、str-; /* 求編碼得低

13、一位 */ ; p=uffnodec、parent; /* 設(shè)置下一循環(huán)條件 / n while / 保存求出得每個(gè)葉結(jié)點(diǎn)得哈夫曼編碼與編碼得起始位 */ or (j=c、str+1; jn; j+) hufcode、bi = c、bij; fodei、start = cd、sat; end o / zgetcha(); gecar(); for(;z!=;=gechar() ;=+knew? )+i;n 5、實(shí)驗(yàn)報(bào)告不用寫出算法,只要寫出對課程設(shè)計(jì)得見解,如對某一算法得改良思想,算法設(shè)計(jì)思想,調(diào)試算法過程中出現(xiàn)得問題及改良方法,調(diào)試程序得體會等。只要就是自己編程與 調(diào)試就會寫出相應(yīng)得報(bào)告。 考核標(biāo)準(zhǔn) 1、機(jī)試程序與結(jié)果、設(shè)計(jì)報(bào)告缺一不可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論