2023年數(shù)據(jù)結(jié)構(gòu)哈夫曼樹的實驗報告_第1頁
2023年數(shù)據(jù)結(jié)構(gòu)哈夫曼樹的實驗報告_第2頁
2023年數(shù)據(jù)結(jié)構(gòu)哈夫曼樹的實驗報告_第3頁
2023年數(shù)據(jù)結(jié)構(gòu)哈夫曼樹的實驗報告_第4頁
2023年數(shù)據(jù)結(jié)構(gòu)哈夫曼樹的實驗報告_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

軟件學院設(shè)計性實驗報告專業(yè):網(wǎng)絡(luò)工程年級/班級:2023—2023學年第一學期課程名稱數(shù)據(jù)結(jié)構(gòu)指導教師本組成員學號姓名實驗地點實驗時間項目名稱哈夫曼編/譯碼系統(tǒng)的設(shè)計與實現(xiàn)實驗類型設(shè)計性實驗目的理解哈夫曼樹的特性及其應用;在對哈夫曼樹進行理解的基礎(chǔ)上,構(gòu)造哈夫曼樹,并用構(gòu)造的哈夫曼樹進行編碼和譯碼;通過該實驗,使學生對數(shù)據(jù)結(jié)構(gòu)的應用有更深層次的理解。實驗儀器或設(shè)備學院提供公共機房,1臺/學生微型計算機??傮w設(shè)計(設(shè)計原理、設(shè)計方案及流程等)1.問題描述:運用哈夫曼編碼進行通信可以大大提高信道運用率,縮短信息傳輸時間,減少傳輸成本。但是,這規(guī)定在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預先編碼,在接受端將傳來的數(shù)據(jù)進行譯碼(解碼)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站設(shè)計一個哈夫曼編/譯碼系統(tǒng)。2.一個完整的系統(tǒng)應具有以下功能:1)初始化(Initialzat(yī)ion)。從數(shù)據(jù)文獻DataFile.dat(yī)中讀入字符及每個字符的權(quán)值,建立哈夫曼樹HuffTree;2)編碼(EnCoding)。用已建好的哈夫曼樹,對文獻ToBeTran.dat中的文本進行編碼形成報文,將報文寫在文獻Code.txt中;3)譯碼(Decoding)。運用已建好的哈夫曼樹,對文獻CodeFile.dat中的代碼進行解碼形成原文,結(jié)果存入文獻Textfile.txt中;4)輸出(Output):輸出DataFile.dat中出現(xiàn)的字符以及各字符出現(xiàn)的頻度(或概率);輸出ToBeTran.dat及其報文Code.txt;輸出CodeFile.dat及其原文Textfile.txt;規(guī)定:所設(shè)計的系統(tǒng)應能在程序執(zhí)行的過程中,根據(jù)實際情況(不同的輸入)建立DataFile.dat、ToBeTran.dat和CodeFile.dat三個文獻,以保證系統(tǒng)的通用性。實驗環(huán)節(jié)(涉及重要環(huán)節(jié)、代碼分析等)1)編寫C語言程序#include<string.h>#include<malloc.h>#include<stdio.h>#include<iostream.h>#include<math.h>#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1typedefstruct{?chardata; intweight;?intparent,lchild,rchild;}HTNode,*HuffmanTree;typedefchar**HuffmanCode;voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,char*d,int*w,intn)//構(gòu)造哈弗曼函數(shù)HT,構(gòu)造編碼HC{voidselect(HuffmanTreeHT,intn,int&s1,int&s2);?intm,c,f,j; HuffmanTreep; inti,s1,s2,start; char*cd; m=2*n-1;//m為結(jié)點數(shù),n為葉子數(shù)HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));?p=HT;?p++; for(i=1;i<=n;i++,p++)//將葉子的值輸入HT中 {p->data=d[i];//={*d,*w,0,0,0}; p->weight=w[i];??p->parent=0;? p->lchild=0;??p->rchild=0; }for(i=n+1;i<=m;i++,p++)//={'#',0,0,0,0} { ?p->data='#'; p->weight=0;? p->parent=0; p->lchild=0;??p->rchild=0; }?s1=1; s2=2; for(i=n+1;i<=m;i++)//構(gòu)建哈夫曼樹?{? select(HT,i-1,s1,s2); HT[i].lchild=s1; HT[i].rchild=s2;??HT[i].weight=HT[s1].weight+HT[s2].weight;??HT[s1].parent=i; HT[s2].parent=i;?}?HC=(HuffmanCode)malloc((n+1)*sizeof(HuffmanTree));//開辟空間,編碼?cd=(char*)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;++i)?{ ?start=n-1; for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)? {? if(HT[f].lchild==c)? cd[--start]='0'; ? else cd[--start]='1';? } ?HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]);? ?printf("%c的編碼是:",HT[i]);? puts(HC[i]);} free(cd);}voidselect(HuffmanTreeHT,intn,int&s1,int&s2)//求最小兩數(shù){?inti,t;?s1=1;?s2=2;?while(HT[s1].parent!=0) s1++;?while((HT[s2].parent!=0)||(s1==s2))??s2++;/*for(i=1;i<=n;i++)?{ if(HT[s1].weight>HT[i].weight&&HT[i].parent==0&&s2!=i) ?s1=i;?} if(HT[s1].weight>HT[s2].weight) {? t=s1; s1=s2; s2=t;?} for(i=1;i<=n;i++) { if(s1!=i)??{? if(HT[s2].weight>HT[i].weight&&HT[i].parent==0) ? s2=i; }?}*/ for(i=1;i<=n;i++)?{ if(s1!=i&&i!=s2)? { if(HT[i].weight<HT[s1].weight&&HT[i].parent==0&&i!=s2) { ? ?if(HT[s1].weight<HT[s2].weight)s2=s1;? s1=i; ? }??else?? if(HT[i].weight<HT[s2].weight&&HT[i].parent==0&&s1!=i)?s2=i; ?}?}}voidtranslation(HuffmanTreeHT,intnum){ charstr[20];?inti,t=num;?printf("請輸入由0或1組成的編碼:");?cin>>str;?//t=HT;//t為樹的指向各節(jié)點的指針?for(i=0;i<(strlen(str));i++)?{ if(str[i]=='0')?? t=HT[t].lchild; ?else ?if(str[i]=='1')?? t=HT[t].rchild;? else?? {?? printf("編碼輸入錯誤"); ?break; ? }?if(!(HT[t].lchild&&HT[t].rchild)) {??printf("%c",HT[t].data); ??t=num;??} } printf("\n");}voidmain(){?voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,chard[],intw[],intn);?voidtranslation(HuffmanTreeHT,intnum); HuffmanTreeHT=NULL; HuffmanCodeHC=NULL;?chardat(yī)a,n,*p,*d; int*w,wei,i,num; printf("pleaseintputcharacternumber:");?scanf("%d",&n);?d=(char*)malloc((n+1)*sizeof(char));?w=(int*)malloc((n+1)*sizeof(int));printf("請輸入Huffman樹中的字符:\n"); for(i=1;i<=n;i++)?{? cin>>data; d[i]=data; }?printf("請輸入%d次位權(quán)\n:",n);for(i=1;i<=n;i++)?{??cin>>wei; w[i]=wei;?} num=2*n-1;HuffmanCoding(HT,HC,d,w,n); translation(HT,num);}程序分析此實驗是構(gòu)造哈夫曼樹,求出哈夫曼編碼然后輸出構(gòu)造哈夫曼樹的算法操作時選出兩棵根節(jié)點的權(quán)值最小的一顆樹的左右子樹,且置新樹的根節(jié)點的權(quán)值為其左右子樹上根節(jié)點的權(quán)值之和,根據(jù)哈夫曼樹求出帶權(quán)途徑的算法操作是用遞歸調(diào)用的方法。在此實驗的操作過程中要注意構(gòu)造哈夫曼樹的方法,由于在此操作的過程中用的的指針變量特

溫馨提示

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

評論

0/150

提交評論