![二叉樹的應(yīng)用實(shí)驗(yàn)報(bào)告_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/9/67788495-6c66-4d6a-806a-7addd3e89f3a/67788495-6c66-4d6a-806a-7addd3e89f3a1.gif)
![二叉樹的應(yīng)用實(shí)驗(yàn)報(bào)告_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/9/67788495-6c66-4d6a-806a-7addd3e89f3a/67788495-6c66-4d6a-806a-7addd3e89f3a2.gif)
![二叉樹的應(yīng)用實(shí)驗(yàn)報(bào)告_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/9/67788495-6c66-4d6a-806a-7addd3e89f3a/67788495-6c66-4d6a-806a-7addd3e89f3a3.gif)
![二叉樹的應(yīng)用實(shí)驗(yàn)報(bào)告_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/9/67788495-6c66-4d6a-806a-7addd3e89f3a/67788495-6c66-4d6a-806a-7addd3e89f3a4.gif)
![二叉樹的應(yīng)用實(shí)驗(yàn)報(bào)告_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/9/67788495-6c66-4d6a-806a-7addd3e89f3a/67788495-6c66-4d6a-806a-7addd3e89f3a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)報(bào)告課程名稱 數(shù)據(jù)結(jié)構(gòu)上機(jī)實(shí)驗(yàn) 實(shí)驗(yàn)項(xiàng)目二叉樹白應(yīng)用 實(shí)驗(yàn)儀器PC機(jī)系 另I專業(yè)班級(jí)/學(xué)號(hào)學(xué)生姓名實(shí)驗(yàn)日期成績指導(dǎo)教師實(shí)驗(yàn)三 . 二叉樹的應(yīng)用1. 實(shí)驗(yàn)?zāi)康模?掌握二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)和常用算法。利用哈夫曼樹設(shè)計(jì)最優(yōu)壓縮編碼。2. 實(shí)驗(yàn)內(nèi)容:1) 編寫函數(shù),實(shí)現(xiàn)建立哈夫曼樹和顯示哈夫曼樹的功能。2) 編寫函數(shù),實(shí)現(xiàn)生成哈夫曼編碼的功能。3) 編寫主函數(shù),從終端輸入一段英文文本;統(tǒng)計(jì)各個(gè)字符出現(xiàn)的頻率,然后構(gòu)建哈夫曼樹并求出對應(yīng)的哈夫曼編碼;顯示哈夫曼樹和哈夫曼編碼。選做內(nèi)容:修改程序,選擇實(shí)現(xiàn)以下功能:4) 編碼:用哈夫曼編碼對一段英文文本進(jìn)行壓縮編碼,顯示編碼后的文本編碼序列;5) 統(tǒng)計(jì)
2、:計(jì)算并顯示文本的壓縮比例;6) 解碼:將采用哈夫曼編碼壓縮的文本還原為英文文本。3. 算法說明:1) 二叉樹和哈夫曼樹的相關(guān)算法見講義。2) 編碼的方法是:從頭開始逐個(gè)讀取文本字符串中的每個(gè)字符,查編碼表得到它的編碼并輸出。重復(fù)處理直至文本結(jié)束。3) 解碼的方法是:將指針指向哈夫曼樹的樹根,從頭開始逐個(gè)讀取編碼序列中的每位,若該位為 1 則向右子樹走,為0 則向左子樹走。當(dāng)走到葉子節(jié)點(diǎn)時(shí),取出節(jié)點(diǎn)中的字符并輸出。重新將指針放到樹根,繼續(xù)以上過程直至編碼序列處理完畢。4) 壓縮比例的計(jì)算:編碼后的文本長度為編碼序列中的 0 和1, 的個(gè)數(shù), 原文本長度為字符數(shù)*8 。 兩者之比即為壓縮比。4.
3、 實(shí)驗(yàn)步驟:實(shí)現(xiàn)哈夫曼樹的編碼序列操作:int i=0,j=0;huffnode p;p=tree2*n-2;/ 序號(hào) 2*n-2 節(jié)點(diǎn)就是樹根節(jié)點(diǎn)while(hfmstri!='0')/ 從頭開始掃描每個(gè)字符 ,直到結(jié)束while(p.lchild!=-1&&p.rchild!=-1)if(hfmstri='0')/ 為 0 則向左子樹走p=treep.lchild;/ 取出葉子節(jié)點(diǎn)中的字符else if(hfmstri='1')/ 為 1 則向右子樹走p=treep.rchild;/ 取出葉子節(jié)點(diǎn)中的字符i+;decodest
4、rj=p.data;j+;/ 對字符進(jìn)行譯碼 ,結(jié)果放在 decodestr字符串中p=tree2*n-2;/ 返回根節(jié)點(diǎn)程序修改后完整源代碼如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <limits.h>/ 專門用于檢測整型數(shù)據(jù)數(shù)據(jù)類型的表達(dá)值范圍#define N 96 /ASCII 字符集包含至多 N 個(gè)可見字符typedef struct /Huffman 樹節(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; /編碼表,長為N,每項(xiàng)對應(yīng)一個(gè)ascii碼字符,下標(biāo)/i 的項(xiàng)對應(yīng) ascii 編碼為 i+32 的字符huffnode * CreateHufftree(char data, int weight, int n)建立 Huffman 樹的算法int i,k;int min1,min2,min_i1,min_i2;huffnode *t
6、ree;tree=(huffnode *)malloc(2*n-1)*sizeof(huffnode); / 為Huffman 樹分配 2n-1 個(gè)節(jié)點(diǎn)空間for (i=0;i<2*n-1;i+)/初 始化 ,將各字 符和其頻 率填入Huffman 樹 ,作為葉子結(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+)/合并兩棵樹,作 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 樹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')/ 從第頭開始掃描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 樹 ,逐個(gè)對 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)就是樹根節(jié)點(diǎn)while(hfmstri!='0')/ 從頭開始掃描每個(gè)字符,直到結(jié)束while(p.lchild!=-1&&p.rchild!=-1)/ 指針為空,兒子的值取完了if(hfmstri='0')/ 為 0 則向左子樹走p=treep.lchild;/ 取出葉子節(jié)點(diǎn)中的字符else if(hfmstri='1')/ 為 1 則向右子樹走p=treep.rchild;/ 取出葉子節(jié)點(diǎn)中的字符i+;
13、decodestrj=p.data;j+;/ 對字符進(jìn)行譯碼,結(jié)果放在decodestr字符串中p=tree2*n-2;/ 返回根節(jié)點(diǎn)void main()int i,j;huffnode * ht; /Huffman 樹char dataN; / 要編碼的字符集合int weightN; / 字符集合中各字符的權(quán)重 (頻率 )int n=0; /字符集合中字符的個(gè)數(shù)char str1000;/需輸入的原始字符串char hfm_str1000="" / 編碼后的字符串char decode_str1000=""/ 解碼后的字符串printf("
14、; 請輸入要轉(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 對應(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 樹 ,根節(jié)點(diǎn)是 ht2*n-2PrintHufftree(ht,n); / 顯示 Huffman 樹的存儲(chǔ)結(jié)果CreateHuffcode(ht, 2*n-2, "");/ 以 ht2*n-2 為根 ,以空字符串為起始編碼字符串,求出各葉子節(jié)點(diǎn)的編碼字符串/顯示 codeset 中的 Huffman 編碼 ,參見 " 顯示頻率統(tǒng)計(jì)結(jié)果"的代碼 .printf("haffman 編碼為 :n");for(i=0;i<N;i+)if(codeseti.count!=0)printf("%c:%sn",i+32,co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- racemic-6-7-Epoxy-cannabichromene-生命科學(xué)試劑-MCE-6900
- Gluconapin-生命科學(xué)試劑-MCE-5096
- 25B-NB3OMe-hydrochloride-生命科學(xué)試劑-MCE-6391
- 施工日志填寫樣本外墻裝飾工程
- 跨代溝通與家庭關(guān)系中的文化融合
- DB15T 3843-2025新能源分布式電源并網(wǎng)技術(shù)規(guī)范
- 云計(jì)算建設(shè)項(xiàng)目服務(wù)合同
- 事業(yè)單位與員工停薪留職合同范本
- 個(gè)人車位交易合同范例
- 個(gè)人企業(yè)房屋租賃合同模板
- 蘇州2025年江蘇蘇州太倉市高新區(qū)(科教新城婁東街道陸渡街道)招聘司法協(xié)理員(編外用工)10人筆試歷年參考題庫附帶答案詳解
- 搞笑小品劇本《大城小事》臺(tái)詞完整版
- 物業(yè)服務(wù)和后勤運(yùn)輸保障服務(wù)總體服務(wù)方案
- 2025年北京市文化和旅游局系統(tǒng)事業(yè)單位招聘101人筆試高頻重點(diǎn)提升(共500題)附帶答案詳解
- 人大代表小組活動(dòng)計(jì)劃人大代表活動(dòng)方案
- 《大模型原理與技術(shù)》全套教學(xué)課件
- 2023年護(hù)理人員分層培訓(xùn)、考核計(jì)劃表
- 《銷售培訓(xùn)實(shí)例》課件
- 2025年四川省新高考八省適應(yīng)性聯(lián)考模擬演練(二)地理試卷(含答案詳解)
- 【經(jīng)典文獻(xiàn)】《矛盾論》全文
- Vue3系統(tǒng)入門與項(xiàng)目實(shí)戰(zhàn)
評論
0/150
提交評論