




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告――實(shí)驗(yàn)五簡(jiǎn)單哈夫曼編/譯碼得設(shè)計(jì)與實(shí)現(xiàn)本實(shí)驗(yàn)得目得就是通過對(duì)簡(jiǎn)單哈夫曼編/譯碼系統(tǒng)得設(shè)計(jì)與實(shí)現(xiàn)來熟練掌握樹型結(jié)構(gòu)在實(shí)際問題中得應(yīng)用。此實(shí)驗(yàn)可以作為綜合實(shí)驗(yàn),階段性實(shí)驗(yàn)時(shí)可以選擇其中得幾個(gè)功能來設(shè)計(jì)與實(shí)現(xiàn)。一、【問題描述】 利用哈夫曼編碼進(jìn)行通信可以大大提高信道利用率,縮短信息傳輸時(shí)間,降低傳輸成本。但就是,這要求在發(fā)送端通過一個(gè)編碼系統(tǒng)對(duì)待傳數(shù)據(jù)預(yù)先編碼,在接收端將傳來得數(shù)據(jù)進(jìn)行譯碼,此實(shí)驗(yàn)即設(shè)計(jì)這樣得一個(gè)簡(jiǎn)單編/碼系統(tǒng).系統(tǒng)應(yīng)該具有如下得幾個(gè)功能: 1、接收原始數(shù)據(jù).?從終端讀入字符集大小n,以及n個(gè)字符與n個(gè)權(quán)值,建立哈夫曼樹,并將它存于文件nodedata、dat中。 2、編碼.?利用已建好得哈夫曼樹(如不在內(nèi)存,則從文件nodedata、dat中讀入),對(duì)文件中得正文進(jìn)行編碼,然后將結(jié)果存入文件code、dat(yī)中。?3、譯碼。利用已建好得哈夫曼樹將文件code、dat(yī)中得代碼進(jìn)行譯碼,結(jié)果存入文件text中.?4、打印編碼規(guī)則。即字符與編碼得一一對(duì)應(yīng)關(guān)系。二、【數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)】 1、構(gòu)造哈夫曼樹時(shí)使用靜態(tài)鏈表作為哈夫曼樹得存儲(chǔ)。 在構(gòu)造哈夫曼樹時(shí),設(shè)計(jì)一個(gè)結(jié)構(gòu)體數(shù)組HuffNode保存哈夫曼樹中各結(jié)點(diǎn)得信息,根據(jù)二叉樹得性質(zhì)可知,具有n個(gè)葉子結(jié)點(diǎn)得哈夫曼樹共有2n—1個(gè)結(jié)點(diǎn),所以數(shù)組HuffNode得大小設(shè)置為2n—1,描述結(jié)點(diǎn)得數(shù)據(jù)類型為:typedefstruct{ intweight;//結(jié)點(diǎn)權(quán)值 intparent; intlchild; intrchild;?charinf;}HNodeType;?2、求哈夫曼編碼時(shí)使用一維結(jié)構(gòu)數(shù)組HuffCode作為哈夫曼編碼信息得存儲(chǔ)。?求哈夫曼編碼,實(shí)質(zhì)上就就是在已建立得哈夫曼樹中,從葉子結(jié)點(diǎn)開始,沿結(jié)點(diǎn)得雙親鏈域回退到根結(jié)點(diǎn),沒回退一步,就走過了哈夫曼樹得一個(gè)分支,從而得到一位哈夫曼碼值,由于一個(gè)字符得哈夫曼編碼就是從根結(jié)點(diǎn)到相應(yīng)葉子結(jié)點(diǎn)所經(jīng)過得路徑上各分支所組成得0、1序列,因此先得到得分支代碼為所求編碼得低位碼,后得到得分支代碼位所求編碼得高位碼,所以設(shè)計(jì)如下數(shù)據(jù)類型:#defineMAXBIT10typedefstruct{?intbit[MAXBIT];數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第1頁。?intstart;數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第1頁。}HcodeType;3、文件nodedata、dat、code、dat與text。三、【功能(函數(shù))設(shè)計(jì)】?1、初始化功能模塊。?此功能模塊得功能為從鍵盤接收字符集大小n,以及n個(gè)字符與n個(gè)權(quán)值。2、建立哈夫曼樹得功能模塊。此模塊功能為使用1中得到得數(shù)據(jù)按照教材中得構(gòu)造哈夫曼樹得算法構(gòu)造哈夫曼樹,即將HuffNode數(shù)組中得各個(gè)位置得各個(gè)域都添上相關(guān)得值,并將這個(gè)結(jié)構(gòu)體數(shù)組存于文件hfmtree、dat中。3、建立哈夫曼編碼得功能模塊.此模塊功能為從文件nodedat(yī)a、dat中讀入相關(guān)得字符信息進(jìn)行哈夫曼編碼,然后將結(jié)果存入code、dat中,同時(shí)將字符與0、1代碼串得一一對(duì)應(yīng)關(guān)系打印到屏幕上.4、譯碼得功能模塊。此模塊功能為接收需要譯碼得0、1代碼串,按照3中建立得編碼規(guī)則將其翻譯成字符集中字符所組成得字符串形式,存入文件text,同時(shí)將翻譯得結(jié)果在屏幕上打印輸出。 四、【編碼實(shí)現(xiàn)】#include<iostream、h〉#include<fstream、h>#include〈string、h>#include<stdlib、h>#defineMaxBit10#defineMaxvalue100//應(yīng)該大于權(quán)重之與#defineMaxleaf100#defineMaxnodeMaxleaf*2-1typedefstruct{ intweight;?intparent; intlchild; intrchild;?charinf;}HNodeType;structHcodeType{?intbit[MaxBit];?intstart;};voidCreat(yī)_Haffmantree(cuò)(int&n){?HNodeType*HaffNode=newHNodeType[2*n-1];?inti,j;?intm1,m2,x1,x2; for(i=0;i〈2*n-1;i++)數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第2頁。 {數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第2頁。 HaffNode[i]、weight=0; HaffNode[i]、parent=-1; ?HaffNode[i]、lchild=-1; ?HaffNode[i]、rchild=—1;??HaffNode[i]、inf='0’; } for(i=0;i〈n;i++) {? cout〈〈"請(qǐng)輸入字符"〈<endl; cin〉>HaffNode[i]、inf; ?cout<〈"請(qǐng)輸入該字符得權(quán)值”<<endl;??cin〉>HaffNode[i]、weight; } for(i=0;i<n-1;i++)//構(gòu)造哈夫曼樹 {??m1=m2=Maxvalue; x1=x2=0; for(j=0;j〈n+i;j++)//選取最小與次小 ?{???if(HaffNode[j]、parent==-1&&HaffNode[j]、weight<m1) ? { ?? m2=m1;?? ?x2=x1; ???m1=HaffNode[j]、weight;? ??x1=j;?? } else ? { if(HaffNode[j]、parent==—1&&HaffNode[j]、weight〈m2)??? {?? ? m2=HaffNode[j]、weight;? ?x2=j;? }?? }??} ??//將找出得最小與次小合并,創(chuàng)造其父母結(jié)點(diǎn) HaffNode[x1]、parent=n+i;? HaffNode[x2]、parent=n+i; HaffNode[n+i]、weight=HaffNode[x1]、weight+HaffNode[x2]、weight; HaffNode[n+i]、lchild=x1;??HaffNode[n+i]、rchild=x2;數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第3頁。??HaffNode[n+i]、inf=NULL;數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第3頁。?} cout〈<"顯示存儲(chǔ)得哈弗曼樹信息:”〈<endl;cout<<"權(quán)值左孩子右孩子雙親"〈<endl;for(i=0;i〈2*n-1;i++){ cout<〈HaffNode[i]、weight<<"”;cout<〈HaffNode[i]、lchild〈<"";cout〈〈HaffNode[i]、rchild〈<"”; cout<<HaffNode[i]、parent〈〈”";?cout〈<HaffNode[i]、inf<〈endl;?}?//寫入文件?fstreamoutfile1;?out("E:\\nodedata、dat",ios::out|ios::trunc|ios::binary);//建立進(jìn)行寫入得文件 if(!outfile1)//沒有創(chuàng)建成功則顯示相應(yīng)信息 { cout〈<"nodedata、dat文件不能打開”<<endl; ?abort(); }?for(i=0;i<2*n-1;i++)//將內(nèi)存中從HaffNode[i]地址開始得sizeof(HaffNode[i])得內(nèi)容寫入文件中 ?out((char*)&HaffNode[i],sizeof(HaffNode[i])); out();//關(guān)閉文件 delete[]HaffNode;}voidHaffCode(int&n)//哈夫曼編碼{?HNodeType*HaffNode=newHNodeType[Maxnode];?HcodeType*HaffCode=newHcodeType[Maxleaf]; HcodeTypecd; inti,j,c,p; fstreamin("E:\\nodedata、dat",ios::in|ios::binary); in、read((char*)HaffNode,(2*n—1)*sizeof(HNodeType)); in、close();?fstreamoutfile; out("E:\\codedata、dat(yī)”,ios::out|ios::binary);//建立進(jìn)行寫入得文件 for(i=0;i<n;i++)?{??cd、start=n-1; c=i;? p=HaffNode[c]、parent;數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第4頁。? while(p!=—1)數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第4頁。 ?{?? if(HaffNode[p]、lchild==c)?? ?cd、bit[cd、start]=0;???else?? ?cd、bit[cd、start]=1;???cd、start-—; ? c=p; ?p=HaffNode[c]、parent;? } for(j=cd、start+1;j〈n;j++) ?HaffCode[i]、bit[j]=cd、bit[j]; ?HaffCode[i]、start=cd、start;?} for(i=0;i<n;i++){??outfile〈<HaffNode[i]、inf;? for(j=HaffCode[i]、start+1;j〈n;j++)???outfile〈<HaffCode[i]、bit[j];?}cout<<"字符信息-—編碼信息”<<endl;for(i=0;i<n;i++){ cout<<HaffNode[i]、inf〈〈"—--"; for(j=HaffCode[i]、start+1;j〈n;j++) cout<<HaffCode[i]、bit[j];?cout<<endl;} out(); cout〈〈"請(qǐng)輸入要編碼得字符串,基本元素為("; for(i=0;i<n;i++)? cout〈<HaffNode[i]、inf<〈”,”;?cout〈<")"〈<endl;?charinf[100];?cin〉〉inf;?intf=strlen(inf); fstreamoutfile1;?out("E:\\code、dat",ios::out|ios::binary);//建立進(jìn)行寫入得文件 if(!outfile1){?cout〈<”code、dat(yī)文件不能打開!"<<endl; abort();}數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第5頁。else數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第5頁。{cout〈<endl;?cout<<"字符串編碼后為:";for(intx=0;x〈f;x++)?{for(i=0;i<n;i++) ?{ ??if(inf[x]==HaffNode[i]、inf) ?{? for(j=HaffCode[i]、start+1;j<n;j++)?? ?{?? out((char*)&HaffCode[i]、bit[j],sizeof(HaffCode[i]、bit[j])); ??cout<〈HaffCode[i]、bit[j];?? }???}??} } ?} cout<<endl;?cout<<”編譯后得代碼串已經(jīng)存入code、dat文件中!"<<endl;?cout<〈endl;out();?delete[]HaffNode; delete[]HaffCode;}voiddecode(int&n)//解碼{ inti;?HNodeType*HaffNode=newHNodeType[2*n-1];?fstreaminfile1; in(”E:\\nodedat(yī)a、dat”,ios::in|ios::binary);//讀出哈夫曼樹 if(!infile1) {??cout<<"nodedata、dat文件不能打開”<<endl; abort();?} ?for(i=0;i〈2*n-1;i++)??in((char*)&HaffNode[i],sizeof(HNodeType));?in();inttempcode[100];?intnum=0;?for(i=0;i〈100;i++) ?tempcode[i]=—1;數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第6頁。 HcodeType*Code=newHcodeType[n];數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第6頁。?fstreamin讀編碼 in(”E:\\code、dat”,ios::in|ios::binary);?while(!in()) {??in((char*)&tempcode[num],sizeof(tempcode[num])); num++; } in();?num--;?cout〈<"從文件中讀出得編碼為"〈<endl; for(i=0;i<num;i++)??cout〈<tempcode[i];cout<〈endl;intm=2*n-2;i=0;cout〈<endl;cout〈〈"譯碼后為:"<<endl;fstreamoutfile;out("E:\\text",ios::out);if(!outfile){ cout〈<"text文件不能打開!"<<endl; abort();}while(i<num)//小于字符串得長度{ while(HaffNode[m]、lchild!=-1&&HaffNode[m]、rchild!=—1)? {?if(tempcode[i]==0) { ??? ??m=HaffNode[m]、lchild; ? ?i++; ??}?? elseif(tempcode[i]==1) ?{?? m=HaffNode[m]、rchild;????i++;? ?}??}cout<<HaffNode[m]、inf;??outfile<〈HaffNode[m]、inf; m=2*n—2;數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第7頁。?}?數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼實(shí)驗(yàn)報(bào)告全文共9頁,當(dāng)前為第7頁。cout〈<endl;out();cout〈<”譯碼后得結(jié)果已經(jīng)存入text中!"<〈endl;delete[]HaffNode;}intmain(){ intn;? cout<〈”*************歡迎進(jìn)入編/譯碼系統(tǒng)!*********************"<<endl;??intch1;?do{ ?cout〈<”1、建樹"〈〈endl; cout<〈"2:編碼,并顯示字符與對(duì)應(yīng)得編碼”<<endl;??cout〈〈"3:譯碼”〈<endl; cout<<"0:退出”〈〈endl; cout〈<"*******************************************************
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 自行車騎行與城市青年創(chuàng)業(yè)機(jī)遇考核試卷
- 玉石產(chǎn)業(yè)的政策支持與財(cái)稅優(yōu)惠政策考核試卷
- 玻璃保溫容器生產(chǎn)計(jì)劃與生產(chǎn)組織優(yōu)化方法實(shí)踐探索經(jīng)驗(yàn)考核試卷
- 海洋生態(tài)系統(tǒng)恢復(fù)考核試卷
- 摩托車頭盔內(nèi)部吸汗墊清洗考核試卷
- 玻璃加工過程中的智能化檢測(cè)技術(shù)考核試卷
- 篷布遮陽篷在商業(yè)建筑的節(jié)能貢獻(xiàn)與景觀設(shè)計(jì)效果分析考核試卷
- 抖音短視頻內(nèi)容創(chuàng)作者內(nèi)部晉升及權(quán)益分配協(xié)議
- 精裝現(xiàn)房交付標(biāo)準(zhǔn)及室內(nèi)外裝飾設(shè)計(jì)合同
- 智慧城市項(xiàng)目合作與商業(yè)秘密保密協(xié)議
- 2024年7月27日內(nèi)蒙古阿拉善盟直機(jī)關(guān)遴選筆試真題及解析
- 《長期主義 關(guān)注短期業(yè)績(jī) 更要投資長期增長》讀書筆記思維導(dǎo)圖PPT模板下載
- 故宮博物院筆試試題
- 思政教育融入小學(xué)語文教學(xué)的策略研究
- 供方準(zhǔn)入申請(qǐng)表
- DDI領(lǐng)導(dǎo)力-高績(jī)效輔導(dǎo)課件
- 《煙酒有危害》公開課教案
- 高三生物一輪復(fù)習(xí)課件:生物變異類型的判斷與實(shí)驗(yàn)探究
- 先簡(jiǎn)支后連續(xù)T梁橋設(shè)計(jì)計(jì)算書
- (完整word版)樁位偏差驗(yàn)收記錄表
- 電流滯環(huán)跟蹤PWM(CHBPWM)控制技術(shù)的仿真
評(píng)論
0/150
提交評(píng)論