![哈夫曼編碼實驗報告_第1頁](http://file4.renrendoc.com/view/2728e97f01d1798ba261b53b6214423f/2728e97f01d1798ba261b53b6214423f1.gif)
![哈夫曼編碼實驗報告_第2頁](http://file4.renrendoc.com/view/2728e97f01d1798ba261b53b6214423f/2728e97f01d1798ba261b53b6214423f2.gif)
![哈夫曼編碼實驗報告_第3頁](http://file4.renrendoc.com/view/2728e97f01d1798ba261b53b6214423f/2728e97f01d1798ba261b53b6214423f3.gif)
![哈夫曼編碼實驗報告_第4頁](http://file4.renrendoc.com/view/2728e97f01d1798ba261b53b6214423f/2728e97f01d1798ba261b53b6214423f4.gif)
![哈夫曼編碼實驗報告_第5頁](http://file4.renrendoc.com/view/2728e97f01d1798ba261b53b6214423f/2728e97f01d1798ba261b53b6214423f5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
.z......資料....哈夫曼編碼器實驗報告學院:計算機學院班級:計科0801班**:王宇宏**:04081027(27)一.實驗目的練習樹和哈夫曼樹的有關操作,和各個算法程序,理解哈夫曼樹的編碼和譯碼二.實驗環(huán)境Microsoftvisualc++三、問題描述利用哈夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預先編碼,在接收端將傳來的數(shù)據(jù)進行譯碼(復原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編碼/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼編碼的編碼/譯碼器。四、需求分析(1)初始化;從終端輸入字符集的大小n,以及n個字符和n個權值建立哈夫曼樹。(2)輸出哈夫曼樹,及各字符對應的編碼。(3)編碼:利用建好的哈夫曼樹,對輸入的待發(fā)送電文進行編碼。同時輸入原文及編碼串。(4)譯碼:利用建好的哈夫曼樹,對輸入的已接收電文進行譯碼。同時輸入編碼串及原文。五、概要設計*include<iostream.h>*include<iomanip.h>*include<string.h>*include<malloc.h>*include<stdio.h>//typedefintTElemType;constintUINT_MA*=1000;charstr[50];typedefstruct{intweight,K;intparent,lchild,rchild;}HTNode,*HuffmanTree;typedefchar**HuffmanCode;//全局變量HuffmanTreeHT;HuffmanCodeHC;intw[50],i,j,n;charz[50];intflag=0;intnumb=0//求哈夫曼編碼structcou{chardata;intcount;}cou[50];intmin(HuffmanTreet,inti){//函數(shù)voidselect()調用intj,flag;intk=UINT_MA*;//取k為不小于可能的值,即k為最大的權值1000for(j=1;j<=i;j++)if(t[j].weight<k&&t[j].parent==0)k=t[j].weight,flag=j;t[flag].parent=1;returnflag;}//slect函數(shù)voidselect(HuffmanTreet,inti,int&s1,int&s2){//s1為最小的兩個值中序號小的那個intj;s1=min(t,i);s2=min(t,i);if(s1>s2){j=s1;s1=s2;s2=j;}}//算法6.12voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn){//w存放n個字符的權值(均>0),構造哈夫曼樹HT,并求出n個字符的哈夫曼編碼HCintm,i,s1,s2,start;//unsignedc,f;intc,f;HuffmanTreep;char*cd;if(n<=1)return;//檢測結點數(shù)是否可以構成樹m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0號單元未用for(p=HT+1,i=1;i<=n;++i,++p,++w){p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;++i,++p)p->parent=0;for(i=n+1;i<=m;++i)//建哈夫曼樹{//在HT[1~i-1]中選擇parent為0且weight最小的兩個結點,其序號分別為s1和s2select(HT,i-1,s1,s2);HT[s1].parent=HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}//從葉子到根逆向求每個字符的哈夫曼編碼HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//分配n個字符編碼的頭指針向量([0]不用)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';elsecd[--start]='1';HC[i]=(char*)malloc((n-start)*sizeof(char));//為第i個字符編碼分配空間strcpy(HC[i],&cd[start]);//從cd復制編碼(串)到HC}free(cd);//釋放工作空間}//獲取報文并寫入文件intInputCode(){//cout<<"請輸入你想要編碼的字符"<<endl;FILE*tobetran;if((tobetran=fopen("tobetran.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;return0;}cout<<"請輸入你想要編碼的字符"<<endl;gets(str);fputs(str,tobetran);cout<<"獲取報文成功"<<endl;fclose(tobetran);returnstrlen(str);}//初始化哈夫曼鏈表voidInitialization(){inta,k,flag,len;a=0;len=InputCode();for(i=0;i<len;i++){k=0;flag=1;cou[i-a].data=str[i];cou[i-a].count=1;while(i>k){if(str[i]==str[k]){a++;flag=0;}k++;if(flag==0)break;}if(flag){for(j=i+1;j<len;j++){if(str[i]==str[j])++cou[i-a].count;}}}n=len-a;for(i=0;i<n;i++){cout<<cou[i].data<<"";cout<<cou[i].count<<endl;}for(i=0;i<=n;i++){*(z+i)=cou[i].data;*(w+i)=cou[i].count;}HuffmanCoding(HT,HC,w,n);//打印編碼cout<<"字符對應的編碼為:"<<endl;for(i=1;i<=n;i++){puts(HC[i]);}//將哈夫曼編碼寫入文件cout<<"下面將哈夫曼編碼寫入文件"<<endl<<""<<endl;FILE*htmTree;charr[]={'','\0'};if((htmTree=fopen("htmTree.t*t","w"))==NULL){cout<<"cannotopenfile"<<endl;return;}fputs(z,htmTree);for(i=0;i<n+1;i++){fprintf(htmTree,"%6d",*(w+i));fputs(r,htmTree);}for(i=1;i<=n;i++){fputs(HC[i],htmTree);fputs(r,htmTree);}fclose(htmTree);cout<<"已將字符與對應編碼寫入根目錄下文件htmTree.t*t中"<<endl<<endl;}//編碼函數(shù)voidEncoding(){cout<<"下面對目錄下文件tobetran.t*t中的字符進行編碼"<<endl;FILE*tobetran,*codefile;if((tobetran=fopen("tobetran.t*t","rb"))==NULL){cout<<"不能打開文件"<<endl;}if((codefile=fopen("codefile.t*t","wb"))==NULL){cout<<"不能打開文件"<<endl;}char*tran;i=99;tran=(char*)malloc(100*sizeof(char));while(i==99){if(fgets(tran,100,tobetran)==NULL){cout<<"不能打開文件"<<endl;break;}for(i=0;*(tran+i)!='\0';i++){for(j=0;j<=n;j++){if(*(z+j-1)==*(tran+i)){fputs(HC[j],codefile);if(j>n){cout<<"字符錯誤,無法編碼!"<<endl;break;}}}}}cout<<"編碼工作完成"<<endl<<"編碼寫入目錄下的codefile.t*t中"<<endl<<endl;fclose(tobetran);fclose(codefile);free(tran);}//譯碼函數(shù)voidDecoding(){cout<<"下面對根目錄下文件codefile.t*t中的字符進行譯碼"<<endl;FILE*codef,*t*tfile;if((t*tfile=fopen("t*tfile.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;}if((codef=fopen("codefile.t*t","r"))==NULL){cout<<"不能打開文件"<<endl;}char*work,*work2,i2;inti4=0,i,i3;unsignedlonglength=10000;work=(char*)malloc(length*sizeof(char));fgets(work,length,codef);work2=(char*)malloc(length*sizeof(char));i3=2*n-1;for(i=0;*(work+i-1)!='\0';i++){i2=*(work+i);if(HT[i3].lchild==0){*(work2+i4)=*(z+i3-1);i4++;i3=2*n-1;i--;}elseif(i2=='0')i3=HT[i3].lchild;elseif(i2=='1')i3=HT[i3].rchild;}*(work2+i4)='\0';fputs(work2,t*tfile);cout<<"譯碼完成"<<endl<<"內(nèi)容寫入根目錄下的文件t*tfile.t*t中"<<endl<<endl;free(work);free(work2);fclose(t*tfile);fclose(codef);}//打印編碼的函數(shù)voidCode_printing(){cout<<"下面打印根目錄下文件CodePrin.t*t中編碼字符"<<endl;FILE*CodePrin,*codefile;if((CodePrin=fopen("CodePrin.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;return;}if((codefile=fopen("codefile.t*t","r"))==NULL){cout<<"不能打開文件"<<endl;return;}char*work3;work3=(char*)malloc(51*sizeof(char));do{if(fgets(work3,51,codefile)==NULL){cout<<"不能讀取文件"<<endl;break;}fputs(work3,CodePrin);puts(work3);}while(strlen(work3)==50);free(work3);cout<<"打印工作結束"<<endl<<endl;fclose(CodePrin);fclose(codefile);}//打印譯碼函數(shù)voidCode_printing1(){cout<<"下面打印根目錄下文件t*tfile.t*t中譯碼字符"<<endl;FILE*CodePrin1,*t*tfile;if((CodePrin1=fopen("CodePrin1.t*t","w"))==NULL){cout<<"不能打開文件"<<endl;return;}if((t*tfile=fopen("t*tfile.t*t","r"))==NULL){cout<<"不能打開文件"<<endl;return;}char*work5;work5=(char*)malloc(51*sizeof(char));do{if(fgets(work5,51,t*tfile)==NULL){cout<<"不能讀取文件"<<endl;break;}fputs(work5,CodePrin1);puts(work5);}while(strlen(work5)==50);free(work5);cout<<"打印工作結束"<<endl<<endl;fclose(CodePrin1);fclose(t*tfile);}//打印哈夫曼樹的函數(shù)voidcoprint(HuffmanTreestart,HuffmanTreeHT){if(start!=HT){FILE*TreePrint;if((TreePrint=fopen("TreePrint.t*t","a"))==NULL){cout<<"創(chuàng)建文件失敗"<<endl;return;}numb++;//該變量為已被聲明為全局變量coprint(HT+start->rchild,HT);cout<<setw(5*numb)<<start->weight<<endl;fprintf(TreePrint,"%d\n",start->weight);coprint(HT+start->lchild,HT);numb--;fclose(TreePrint);}}voidTree_printing(HuffmanTreeHT,intw){HuffmanTreep;p=HT+w;cout<<"下面打印哈夫曼樹"<<endl;coprint(p,HT);cout<<"打印工作結束"<<endl;}//主函數(shù)voidmain(){charchoice;while(choice!='q'){cout<<"\n******************************"<<endl;cout<<"歡迎使用哈夫曼編碼解碼系統(tǒng)"<<endl;cout<<"******************************"<<endl;cout<<"(1)要初始化哈夫曼鏈表請輸入'i'"<<endl;cout<<"(2)要編碼請輸入'e'"<<endl;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑公司保密協(xié)議書
- 農(nóng)資供應與采購合同
- 外腳手架的承包合同書
- 可研報告咨詢合同
- 承包飯店早點合同
- 工程防水施工合同
- 15年個人借款合同7篇
- 15《人造地球衛(wèi)星》教學設計-2023-2024學年科學六年級下冊冀人版
- 離婚房產(chǎn)分割離婚協(xié)議書6篇
- Unit 4 Body Language Learning About Language 語法 教學設計-2024-2025學年高中英語人教版(2019)選擇性必修第一冊
- 2025年企業(yè)法務顧問聘用協(xié)議范本
- 《康復評定技術》課件-第五章 運動控制
- 消防器材與消防設施的維護與檢查
- 【理特咨詢】2024生成式人工智能GenAI在生物醫(yī)藥大健康行業(yè)應用進展報告
- 2025年中國中煤能源股份有限公司招聘筆試參考題庫含答案解析
- 2024年度碳陶剎車盤分析報告
- 2025年春新外研版(三起)英語三年級下冊課件 Unit6第1課時Startup
- 2025年1月 浙江首考英語試卷
- 十首最美的唐詩
- 平拋運動的經(jīng)典例題
- 錄井作業(yè)現(xiàn)場風險評估及控制措施
評論
0/150
提交評論