版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)報(bào)告課程名稱 數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn) 實(shí)驗(yàn)項(xiàng)目二叉樹(shù)白應(yīng)用 實(shí)驗(yàn)儀器PC機(jī)系 另I專業(yè)班級(jí)/學(xué)號(hào)學(xué)生姓名實(shí)驗(yàn)日期成績(jī)指導(dǎo)教師實(shí)驗(yàn)三 . 二叉樹(shù)的應(yīng)用1. 實(shí)驗(yàn)?zāi)康模?掌握二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)和常用算法。利用哈夫曼樹(shù)設(shè)計(jì)最優(yōu)壓縮編碼。2. 實(shí)驗(yàn)內(nèi)容:1) 編寫(xiě)函數(shù),實(shí)現(xiàn)建立哈夫曼樹(shù)和顯示哈夫曼樹(shù)的功能。2) 編寫(xiě)函數(shù),實(shí)現(xiàn)生成哈夫曼編碼的功能。3) 編寫(xiě)主函數(shù),從終端輸入一段英文文本;統(tǒng)計(jì)各個(gè)字符出現(xiàn)的頻率,然后構(gòu)建哈夫曼樹(shù)并求出對(duì)應(yīng)的哈夫曼編碼;顯示哈夫曼樹(shù)和哈夫曼編碼。選做內(nèi)容:修改程序,選擇實(shí)現(xiàn)以下功能:4) 編碼:用哈夫曼編碼對(duì)一段英文文本進(jìn)行壓縮編碼,顯示編碼后的文本編碼序列;5) 統(tǒng)計(jì)
2、:計(jì)算并顯示文本的壓縮比例;6) 解碼:將采用哈夫曼編碼壓縮的文本還原為英文文本。3. 算法說(shuō)明:1) 二叉樹(shù)和哈夫曼樹(shù)的相關(guān)算法見(jiàn)講義。2) 編碼的方法是:從頭開(kāi)始逐個(gè)讀取文本字符串中的每個(gè)字符,查編碼表得到它的編碼并輸出。重復(fù)處理直至文本結(jié)束。3) 解碼的方法是:將指針指向哈夫曼樹(shù)的樹(shù)根,從頭開(kāi)始逐個(gè)讀取編碼序列中的每位,若該位為 1 則向右子樹(shù)走,為0 則向左子樹(shù)走。當(dāng)走到葉子節(jié)點(diǎn)時(shí),取出節(jié)點(diǎn)中的字符并輸出。重新將指針?lè)诺綐?shù)根,繼續(xù)以上過(guò)程直至編碼序列處理完畢。4) 壓縮比例的計(jì)算:編碼后的文本長(zhǎng)度為編碼序列中的 0 和1, 的個(gè)數(shù), 原文本長(zhǎng)度為字符數(shù)*8 。 兩者之比即為壓縮比。4.
3、 實(shí)驗(yàn)步驟:實(shí)現(xiàn)哈夫曼樹(shù)的編碼序列操作:int i=0,j=0;huffnode p;p=tree2*n-2;/ 序號(hào) 2*n-2 節(jié)點(diǎn)就是樹(shù)根節(jié)點(diǎn)while(hfmstri!='0')/ 從頭開(kāi)始掃描每個(gè)字符 ,直到結(jié)束while(p.lchild!=-1&&p.rchild!=-1)if(hfmstri='0')/ 為 0 則向左子樹(shù)走p=treep.lchild;/ 取出葉子節(jié)點(diǎn)中的字符else if(hfmstri='1')/ 為 1 則向右子樹(shù)走p=treep.rchild;/ 取出葉子節(jié)點(diǎn)中的字符i+;decodest
4、rj=p.data;j+;/ 對(duì)字符進(jìn)行譯碼 ,結(jié)果放在 decodestr字符串中p=tree2*n-2;/ 返回根節(jié)點(diǎn)程序修改后完整源代碼如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <limits.h>/ 專門(mén)用于檢測(cè)整型數(shù)據(jù)數(shù)據(jù)類型的表達(dá)值范圍#define N 96 /ASCII 字符集包含至多 N 個(gè)可見(jiàn)字符typedef struct /Huffman 樹(shù)節(jié)點(diǎn)定義 char data; / 字符值int weight; / 權(quán)重int lchi
5、ld; / 左子結(jié)點(diǎn)int rchild; / 右子結(jié)點(diǎn) huffnode; /huffman 節(jié)點(diǎn)類型struct charcode int count; / 字符出現(xiàn)的次數(shù)(頻率)char codeN; / 字符的 Huffman 編碼 codesetN; /編碼表,長(zhǎng)為N,每項(xiàng)對(duì)應(yīng)一個(gè)ascii碼字符,下標(biāo)/i 的項(xiàng)對(duì)應(yīng) ascii 編碼為 i+32 的字符huffnode * CreateHufftree(char data, int weight, int n)建立 Huffman 樹(shù)的算法int i,k;int min1,min2,min_i1,min_i2;huffnode *t
6、ree;tree=(huffnode *)malloc(2*n-1)*sizeof(huffnode); / 為Huffman 樹(shù)分配 2n-1 個(gè)節(jié)點(diǎn)空間for (i=0;i<2*n-1;i+)/初 始化 ,將各字 符和其頻 率填入Huffman 樹(shù) ,作為葉子結(jié)點(diǎn)treei.lchild=treei.rchild=-1;if (i<n) treei.data=datai;treei.weight=weighti;else treei.data=' 'for (i=n;i<2*n-1;i+)/合并兩棵樹(shù),作 n-1 遍min1=min2=INT_MAX; /
7、INT_MAX 為最大值min_i1=min_i2=-1;for (k=0;k<i;k+)/查找定位兩個(gè)最小權(quán)重節(jié)點(diǎn)if (treek.weight>=0)/僅在根節(jié)點(diǎn)中找if (treek.weight<min1)min2=min1;min_i2=min_i1;min1=treek.weight;min_i1=k;elseif (treek.weight<min2) min2=treek.weight;min_i2=k;treei.weight=min1+min2; / 合并treemin_i1.weight *= -1;treemin_i2.weight *= -1
8、;treei.lchild=min_i1;treei.rchild=min_i2;return tree;void CreateHuffcode(huffnode tree, int i, char s)/ 已知 treei 節(jié)點(diǎn)的編碼序列為s,求該節(jié)點(diǎn)下所有葉子節(jié)點(diǎn)的編碼序列。 char s1N,c;if(i!=-1)if (treei.lchild=-1 && treei.rchild=-1) c=treei.data;strcpy(codesetc-32.code, s);else strcpy(s1, s); strcat(s1, "0");Crea
9、teHuffcode(tree, treei.lchild, s1);strcpy(s1, s); strcat(s1, "1");CreateHuffcode(tree, treei.rchild, s1);return;void PrintHufftree(huffnode tree, int n)/輸出 tree 中的Huffman 樹(shù)int i;printf("Huffman tree :n");printf("itValuetLchildtRchildtWeightn");for(i=2*n-2;i>=0;i-)pri
10、ntf("%dt",i);printf("%ct",treei.data);printf("%dt",treei.lchild);printf("%dt",treei.rchild);printf("%dt",treei.weight);printf("n");void EnCoding(char str, char hfmstr)根據(jù)codeset編碼表,逐個(gè)將str字符串中的字符轉(zhuǎn)化為它的huffman 編碼,結(jié)果編碼串放在hfmstr 字符串中int i, j;hfms
11、tr0='0'/ 把 hfmstr 串賦空i=0;while(stri!='0')/ 從第頭開(kāi)始掃描str 的每個(gè)字符,一直到該字符的結(jié)束j=stri-32;/ 執(zhí)行字符到 huffman 的轉(zhuǎn)換strcat(hfmstr, codesetj.code);把 codest編碼串添加到hfmstr 結(jié)尾處i+;/ 每次循環(huán)完 i 的值加 1void DeCoding(huffnode tree, int n, char hfmstr, char decodestr)/根據(jù) tree 數(shù)組中的 huffman 樹(shù) ,逐個(gè)對(duì) hfmstr 字符串中的字符進(jìn)行譯碼,結(jié)果
12、放在decodestr字符串中int i=0,j=0;huffnode p;p=tree2*n-2;/ 序號(hào) 2*n-2 節(jié)點(diǎn)就是樹(shù)根節(jié)點(diǎn)while(hfmstri!='0')/ 從頭開(kāi)始掃描每個(gè)字符,直到結(jié)束while(p.lchild!=-1&&p.rchild!=-1)/ 指針為空,兒子的值取完了if(hfmstri='0')/ 為 0 則向左子樹(shù)走p=treep.lchild;/ 取出葉子節(jié)點(diǎn)中的字符else if(hfmstri='1')/ 為 1 則向右子樹(shù)走p=treep.rchild;/ 取出葉子節(jié)點(diǎn)中的字符i+;
13、decodestrj=p.data;j+;/ 對(duì)字符進(jìn)行譯碼,結(jié)果放在decodestr字符串中p=tree2*n-2;/ 返回根節(jié)點(diǎn)void main()int i,j;huffnode * ht; /Huffman 樹(shù)char dataN; / 要編碼的字符集合int weightN; / 字符集合中各字符的權(quán)重 (頻率 )int n=0; /字符集合中字符的個(gè)數(shù)char str1000;/需輸入的原始字符串char hfm_str1000="" / 編碼后的字符串char decode_str1000=""/ 解碼后的字符串printf("
14、; 請(qǐng)輸入要轉(zhuǎn)換的字符串 n");gets(str);for(i=0;i<N;i+) / 初始化編碼表,頻率為0,編碼串為空串codeseti.count=0; codeseti.code0='0' i=0;while(stri!='0') /統(tǒng)計(jì)原始字符串中各字符出現(xiàn)的頻率,存入編碼表 j=stri-32; codesetj.count+; /codeset095 對(duì)應(yīng) ascii 碼 32127 的字 符 i+; for(i=0;i<N;i+) / 統(tǒng)計(jì)原始字符串中出現(xiàn)的字符個(gè)數(shù) if(codeseti.count!=0) n+; pr
15、intf(" 字符頻率統(tǒng)計(jì):n"); / 顯示統(tǒng)計(jì)結(jié)果for(i=0;i<N;i+) if(codeseti.count!=0) printf("%c:%d, ",i+32,codeseti.count); printf("n"); j=0; for(i=0;i<N;i+) / 生成要編碼的字符集合,以及權(quán)重if (codeseti.count!=0) dataj=i+32;weightj=codeseti.count;j+;ht=CreateHufftree(data,weight,n);/建立Huffman 樹(shù) ,根節(jié)點(diǎn)是 ht2*n-2PrintHufftree(ht,n); / 顯示 Huffman 樹(shù)的存儲(chǔ)結(jié)果CreateHuffcode(ht, 2*n-2, "");/ 以 ht2*n-2 為根 ,以空字符串為起始編碼字符串,求出各葉子節(jié)點(diǎn)的編碼字符串/顯示 codeset 中的 Huffman 編碼 ,參見(jiàn) " 顯示頻率統(tǒng)計(jì)結(jié)果"的代碼 .printf("haffman 編碼為 :n");for(i=0;i<N;i+)if(codeseti.count!=0)printf("%c:%sn",i+32,co
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州財(cái)經(jīng)職業(yè)學(xué)院《社會(huì)保障》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴陽(yáng)幼兒師范高等??茖W(xué)?!吨袑W(xué)政治教學(xué)法與技能訓(xùn)練》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年江蘇省安全員C證考試題庫(kù)
- 2025福建建筑安全員-C證考試題庫(kù)
- 貴陽(yáng)康養(yǎng)職業(yè)大學(xué)《酒店規(guī)劃與設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣州中醫(yī)藥大學(xué)《高分子化學(xué)與物理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年安徽省建筑安全員-C證(專職安全員)考試題庫(kù)
- 2025遼寧省建筑安全員C證考試(專職安全員)題庫(kù)附答案
- 廣州醫(yī)科大學(xué)《混凝土結(jié)構(gòu)基本原理(建筑工程)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年廣東建筑安全員《B證》考試題庫(kù)
- 幼兒園小班教案《墊子多玩》
- 論藥品管理在藥品安全中的重要性
- 河北省唐山市2023-2024學(xué)年高一上學(xué)期1月期末考試物理試題(含答案解析)
- 大學(xué)宣傳部工作總結(jié)學(xué)生會(huì)
- 2024年永州職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 藥物分離與純化技術(shù)
- 餐廳各類食材原材料供貨驗(yàn)收標(biāo)準(zhǔn)
- 物理實(shí)驗(yàn):測(cè)量電容器的電容和電荷量
- 免疫相關(guān)不良反應(yīng)的預(yù)防和處理
- 【區(qū)域開(kāi)發(fā)戰(zhàn)略中環(huán)境保護(hù)政策的現(xiàn)存問(wèn)題及優(yōu)化建議分析6800字(論文)】
- 新型農(nóng)村集體經(jīng)濟(jì)研究綜述
評(píng)論
0/150
提交評(píng)論