九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

數(shù)據(jù)結(jié)構(gòu)哈夫曼樹編碼譯碼實驗報告.doc

  • 資源ID:16763372       資源大小:469KB        全文頁數(shù):15頁
  • 資源格式: DOC        下載積分:5積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要5積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認(rèn)打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。

數(shù)據(jù)結(jié)構(gòu)哈夫曼樹編碼譯碼實驗報告.doc

【詳細(xì)設(shè)計】具體代碼實現(xiàn)如下:/HaffmanTree.h#include<iostream>#include<fstream>#include<string>struct HuffmanNode /哈夫曼樹的一個結(jié)點 int weight; int parent; int lchild,rchild; ;class HuffmanTree /哈夫曼樹 private: HuffmanNode *Node; /Node存放哈夫曼樹 char *Info; /Info存放源文用到的字符源碼,如a,b,c,d,e,此內(nèi)容可以放入結(jié)點中,不單獨設(shè)數(shù)組存放 int LeafNum; /哈夫曼樹的葉子個數(shù),也是源碼個數(shù)public: HuffmanTree(); HuffmanTree(); void CreateHuffmanTree(); /*在內(nèi)存中建立哈夫曼樹,存放在Node中。 讓用戶從兩種建立哈夫曼樹的方法中選擇:1.從鍵盤讀入源碼字符集個數(shù),每個字符,和每個字符的權(quán)重,建立哈夫曼樹,并將哈夫曼樹寫入文件hfmTree中。2.從文件hfmTree中讀入哈夫曼樹信息,建立哈夫曼樹*/ void CreateHuffmanTreeFromKeyboard(); void CreateHuffmanTreeFromFile(); void Encoder(); /*使用建立好的哈夫曼樹(如果不在內(nèi)存,則從文件hfmTree中讀入并建立內(nèi)存里的哈夫曼樹), 對文件ToBeTran中的正文進(jìn)行編碼,并將碼文寫入文件CodeFile中。 ToBeTran的內(nèi)容可以用記事本等程序編輯產(chǎn)生。*/ void Decoder(); /*待譯碼的碼文存放在文件CodeFile中,使用建立好的哈夫曼樹(如果不在內(nèi)存, 則從文件hfmTree中讀入并建立內(nèi)存里的哈夫曼樹)將碼文譯碼, 得到的源文寫入文件TextFile中,并同時輸出到屏幕上。*/ void PrintCodeFile(); /*將碼文文件CodeFile顯示在屏幕上*/ void PrintHuffmanTree(); /*將哈夫曼樹以直觀的形式(凹入表示法,或廣義表,或其他樹形表示法)顯示在屏幕上, 同時寫入文件TreePrintFile中*/ void PrintHuffmanTree_aoru(int T,int layer=1); /*凹入表示法顯示哈夫曼樹,由PrintHuffmanTree()調(diào)用*/;/HuffmanTree.cpp#include<string>#include<limits> /為使用整型最大值#include"HuffmanTree.h"using namespace std;/*HuffmanTree:HuffmanTree()Node=NULL;/*HuffmanTree:HuffmanTree()deleteNode;/*void HuffmanTree:CreateHuffmanTree() char Choose; cout<<"你要從文件中讀入哈夫曼樹(按1),還是從鍵盤輸入哈夫曼樹(按2)?"cin>>Choose;if(Choose=2) /鍵盤輸入建立哈夫曼樹CreateHuffmanTreeFromKeyboard();/choose=2else /從哈夫曼樹文件hfmTree.dat中讀入信息并建立哈夫曼樹CreateHuffmanTreeFromFile();/*void HuffmanTree:CreateHuffmanTreeFromKeyboard()int Num;cout<<"n請輸入源碼字符集個數(shù):"cin>>Num;if (Num<=1)cout<<"無法建立少于2個葉子結(jié)點的哈夫曼樹。nn"return;LeafNum=Num;Node=new HuffmanNode2*Num-1; Info=new char2*Num-1;for(int i=0;i<Num;i+) /讀入哈夫曼樹的葉子結(jié)點信息cout<<"請輸入第"<<i+1<<"個字符值"getchar(); Infoi=getchar(); /源文的字符存入字符數(shù)組Info getchar();cout<<"請輸入該字符的權(quán)值或頻度"cin>>Nodei.weight; /源文的字符權(quán)重存入Node.weight Nodei.parent=-1; Nodei.lchild=-1; Nodei.rchild=-1; for(i=Num;i<2*Num-1;i+) /循環(huán)建立哈夫曼樹內(nèi)部結(jié)點int pos1=-1,pos2=-1;int max1=32767,max2=32767;for(int j=0;j<i;j+)/在根節(jié)點中選出權(quán)值最小的兩個if(Nodej.parent=-1)/是否為根結(jié)點if(Nodej.weight<max1)max2=max1;max1=Nodej.weight;pos2=pos1;pos1=j;elseif(Nodej.weight<max2)max2=Nodej.weight;pos2=j; Nodepos1.parent=i; Nodepos2.parent=i; Nodei.lchild=pos1; Nodei.rchild=pos2; Nodei.parent=-1; Nodei.weight=Nodepos1.weight+Nodepos2.weight; /forcout<<"哈夫曼樹已成功構(gòu)造完成。n"/把建立好的哈夫曼樹寫入文件hfmTree.datchar ch;cout<<"是否要替換原來的哈夫曼樹文件(Y/N):"cin>>ch;if (ch!=y&&ch!=Y) return;elseofstream fop; fop.open("hfmTree.dat",ios:out|ios:binary|ios:trunc); /打開文件 if(fop.fail() cout<<"n哈夫曼樹文件打開失敗,無法將哈夫曼樹寫入hfmTree.dat文件。n" return;fop.write(char*)&Num,sizeof(Num); /先寫入哈夫曼樹的葉子結(jié)點個數(shù)for(i=0;i<Num;i+) /再寫入源文字符集的所有字符(存儲在Info中)fop.write(char*)&Infoi,sizeof(Infoi);flush(cout);for(i=0;i<2*Num-1;i+) /最后寫入哈夫曼樹的各個結(jié)點(存儲在Node中)fop.write(char*)&Nodei,sizeof(Nodei);flush(cout);fop.close(); /關(guān)閉文件cout<<"n哈夫曼樹已成功寫入hfmTree.dat文件。n"/*void HuffmanTree:CreateHuffmanTreeFromFile()ifstream fip; fip.open("hfmTree.dat",ios:binary|ios:in);if(fip.fail() cout<<"哈夫曼樹文件hfmTree.dat打開失敗,無法建立哈夫曼樹。n"return; fip.read(char*)&LeafNum,sizeof(LeafNum); if (LeafNum<=1) cout<<"哈夫曼樹文件中的數(shù)據(jù)有誤,葉子結(jié)點個數(shù)少于2個,無法建立哈夫曼樹。n"fip.close();return; Info=new charLeafNum; Node=new HuffmanNode2*LeafNum-1;for(int i=0;i<LeafNum;i+) fip.read(char*)&Infoi,sizeof(Infoi);for(i=0;i<2*LeafNum-1;i+) fip.read(char*)&Nodei,sizeof(Nodei);fip.close();cout<<"哈夫曼樹已成功構(gòu)造完成。n"/*void HuffmanTree:Encoder()if(Node=NULL)/內(nèi)存沒有哈夫曼樹,則從哈夫曼樹文件hfmTree.dat中讀入信息并建立哈夫曼樹CreateHuffmanTreeFromFile();if (LeafNum<=1)cout<<"內(nèi)存無哈夫曼樹。操作撤銷。nn"return;/if char *SourceText; /字符串?dāng)?shù)組,用于存放源文 /讓用戶選擇源文是從鍵盤輸入,還是從源文文件ToBeTran.txt中讀入char Choose; cout<<"你要從文件中讀入源文(按1),還是從鍵盤輸入源文(按2)?"cin>>Choose;if(Choose=1)ifstream fip1("ToBeTran.txt");if(fip1.fail() cout<<"源文文件打開失敗!無法繼續(xù)執(zhí)行。n"return; char ch;int k=0;while(fip1.get(ch) k+; /第一次讀文件只統(tǒng)計文件中有多少個字符,將字符數(shù)存入kfip1.close(); SourceText=new chark+1; /申請存放源文的字符數(shù)組空間ifstream fip2("ToBeTran.txt");/第二次讀源文文件,把內(nèi)容寫入SourceTextk=0; while(fip2.get(ch) SourceTextk+=ch; fip2.close();SourceTextk=0; cout<<"需編碼的源文為:"cout<<SourceText<<endl;else /從鍵盤輸入源文string SourceBuff; cin.ignore();cout<<"請輸入需要編碼的源文(可輸入任意長,按回車鍵結(jié)束):n"getline(cin,SourceBuff,n); int k=0;while(SourceBuffk!=0)k+;SourceText=new chark+1;k=0;while(SourceBuffk!=0) SourceTextk=SourceBuffk;k+;SourceTextk=0;cout<<"覆蓋已有的編碼原文件?(Y/N)"char ch;cin>>ch;if(ch=y|ch=Y)ofstream fip2;fip2.open("ToBeTran.txt");if(!fip2)cerr<<"文件打開失?。?quot;<<endl;abort();fip2<<SourceText<<endl;fip2.close();cout<<"需編碼的源文已寫入ToBeTran.txt中"<<endl; /開始編碼ofstream fop("CodeFile.dat",ios:trunc); /打開碼文存放文件char *code; code=new charLeafNum; /存放一個源文字符的編碼 int k=0;while(SourceTextk!=0) /源文串中從第一個字符開始逐個編碼 int star=0;char ch=SourceTextk;for(int i=0;i<LeafNum;i+)if(Infoi=ch)/求出該文字所在的單元編號break;int j=i;while(Nodej.parent!=-1)j=Nodej.parent;if(InfoNodej.lchild=Infoi) codestar+=0;else codestar+=1;i=j;codestar=0;for(i=0;i<star/2;i+)int j=codei;codei=codestar-i-1;codestar-i-1=j; i=0; /將源文的當(dāng)前字符的對應(yīng)編碼寫入碼文文件while(codei!=0) fop<<codei;i+;k+; /源文串中的字符后移一個fop.close();cout<<"已完成編碼,碼文已寫入文件CodeFile.dat中。nn" /*void HuffmanTree:Decoder()/如果內(nèi)存沒有哈夫曼樹,則從哈夫曼樹文件hfmTree.dat中讀入信息并建立哈夫曼樹if(Node=NULL) CreateHuffmanTreeFromFile();if (LeafNum<=1)cout<<"內(nèi)存無哈夫曼樹。操作撤銷。nn"return;/將碼文從文件CodeFile.dat中讀入 CodeStrifstream fip1("CodeFile.dat"); if(fip1.fail()cout<<"沒有碼文,無法譯碼。n"return;char* CodeStr;int k=0;char ch;while(fip1.get(ch)k+; fip1.close(); CodeStr=new chark+1;ifstream fip2("CodeFile.dat");k=0;while(fip2.get(ch) CodeStrk+=ch; fip2.close(); CodeStrk=0; cout<<"經(jīng)譯碼得到的源文為:"ofstream fop("TextFile.dat"); int j=LeafNum*2-1-1; /j指向哈夫曼樹的根 int i=0; /碼文從第一個符號開始,順著哈夫曼樹由根下行,按碼文的當(dāng)前符號決定下行到左孩子還是右孩子while(CodeStri!=0) /下行到哈夫曼樹的葉子結(jié)點處,則譯出葉子結(jié)點對應(yīng)的源文字符if(CodeStri=0) j=Nodej.lchild;else j=Nodej.rchild;if(Nodej.rchild=-1)cout<<Infoj;fop<<Infoj;j=LeafNum*2-1-1;i+; fop.close(); cout<<"n譯碼成功且已存到文件TextFile.dat中。nn"/*void HuffmanTree:PrintCodeFile()char ch;int i=1;ifstream fip("CodeFile.dat"); ofstream fop("CodePrin.dat"); if(fip.fail()cout<<"沒有碼文文件,無法顯示碼文文件內(nèi)容。n"return;while(fip.get(ch)cout<<ch; fop<<ch; if(i=50) cout<<endl;fop<<endl;i=0;i+;cout<<endl;fop<<endl;fip.close(); fop.close(); /*void HuffmanTree:PrintHuffmanTree()/如果內(nèi)存沒有哈夫曼樹,則從哈夫曼樹文件hfmTree.dat中讀入信息并建立哈夫曼樹if(Node=NULL) CreateHuffmanTreeFromFile();if (LeafNum<=1) cout<<"內(nèi)存無哈夫曼樹。操作撤銷。nn"return;ofstream fop("TreePrint.dat",ios_base:trunc);fop.close();PrintHuffmanTree_aoru(2*LeafNum-1-1,0);return;/*void HuffmanTree:PrintHuffmanTree_aoru(int T,int layer)for(int i=0;i<layer;i+) cout<<"_"cout<<NodeT.weight<<endl;if(NodeT.lchild!=-1) PrintHuffmanTree_aoru(NodeT.lchild,+layer);if(NodeT.rchild!=-1) PrintHuffmanTree_aoru(NodeT.rchild,layer-);/main.cpp#include<string.h>#include<stdlib.h>using namespace std;int main()HuffmanTree huftree; char Choose;while(1)cout<<"nn*歡迎使用哈夫曼編碼/譯碼系統(tǒng)*"<<endl;cout<<"您可以進(jìn)行以下操作:"<<endl;cout<<"1 建立哈夫曼樹 3 譯碼(碼文已在文件CodeFile中) 5 顯示哈夫曼樹"<<endl;cout<<"2 編碼(源文已在文件ToBeTran中,或鍵盤輸入) 4 顯示碼文 6 退出 "<<endl;cout<<"請選擇一個操作:"cin>>Choose;switch(Choose)case 1:huftree.CreateHuffmanTree(); break;case 2:huftree.Encoder();break;case 3:huftree.Decoder();break;case 4:huftree.PrintCodeFile();break;case 5:huftree.PrintHuffmanTree();break;case 6:cout<<"n*感謝使用本系統(tǒng)!*nn"system("pause"); return 0;/switch /while/main【用戶手冊】 進(jìn)入哈弗曼樹系統(tǒng),出現(xiàn)以下界面:1建立弗曼樹 2、編碼(源文中讀入,鍵盤輸入) 3、譯碼 4、顯示碼文 5、顯示哈弗曼樹 6、退出 用戶根據(jù)該提示,選擇前面數(shù)字,就能進(jìn)入各個功能函數(shù),實現(xiàn)函數(shù)功能?!具\行結(jié)果】截圖一: 截圖二:截圖三:截圖四:【心得體會】本實驗是搜集相關(guān)資料,然后自己增加功能函數(shù)的代碼實現(xiàn)的。因此,在完成未完成的功能函數(shù)之前還必須要細(xì)心閱讀所給出代碼,整體觀察各個部分之前的聯(lián)系,搞清楚已給出和未完成的代碼功能之后,才根據(jù)算法,設(shè)計出該功能的函數(shù)代碼。在完成實驗時,有發(fā)現(xiàn)代碼也有紕漏的地方,如在源文件讀入的時候,多出了一個值,得要增加下表減這個代碼來去掉。還有就是在譯碼的時候,由于變量定義的混淆,在編譯的時候通過,但執(zhí)行時卻出現(xiàn)意料不到的結(jié)果,在自己細(xì)心觀察、思考之前也還沒找出錯誤之處。后來通過請教老師,在和老師討論檢查之后才知道了錯誤之所在,最后改正錯誤。實驗成功完成。【參考文獻(xiàn)】 數(shù)據(jù)結(jié)構(gòu)與算法(課本) C+語言基礎(chǔ)

注意事項

本文(數(shù)據(jù)結(jié)構(gòu)哈夫曼樹編碼譯碼實驗報告.doc)為本站會員(小**)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!