哈夫曼編碼系統(tǒng)課程設(shè)計報告-源代碼_第1頁
哈夫曼編碼系統(tǒng)課程設(shè)計報告-源代碼_第2頁
哈夫曼編碼系統(tǒng)課程設(shè)計報告-源代碼_第3頁
哈夫曼編碼系統(tǒng)課程設(shè)計報告-源代碼_第4頁
哈夫曼編碼系統(tǒng)課程設(shè)計報告-源代碼_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

〃說明:請在該代碼的所在文件夾下面創(chuàng)建一個原文,默認的文件夾名稱問yuanwen.txt#include"stdlib.h"#include"stdio.h"#include"string.h"#defineN128〃字符個數(shù)#defineM2*N-1〃所有節(jié)點個數(shù)的最大值typedefstruct// 結(jié)點結(jié)構(gòu)體(chardata;intweight;//權(quán)值intparent;intLChild;intRChild;}HTNode;HTNodeHTTree[M+1];//下標為0的位置不存放元素typedefstructCod// 每個字符對應(yīng)的編碼(chardata;//字符charcode[10];//字符對應(yīng)的哈夫曼編碼}Code;CodeHCode[25];intnumArray[N];//存放字符出現(xiàn)的次數(shù)//初始化numArrayvoidFoundNumArray()(inti=0;for(;i<N;i++)numArray[i]=0;}////統(tǒng)計文檔中字符以及字符權(quán)重voidStatistics(char*p)(charch;FILE*fp;fp=fopen(p,"r");if((fp==NULL))(printf("文件打開失敗??!");exit(0);)do(ch=fgetc(fp);numArray[ch]=numArray[ch]+1;}while(ch!=EOF);printf("\n");}〃哈夫曼結(jié)點初始化intFoundHTTree()〃S回哈夫曼字符結(jié)點的數(shù)量(inti=0,j=1;while(i<128)(if(numArray[i]==0)(i++;continue;}while(j<M)(HTTree[j].data=i;HTTree[j].weight=numArray[i];HTTree[j].parent=0;HTTree[j].LChild=0;HTTree[j].RChild=0;j++;break;}i++;for(i=j;i<M;i++)(HTTree[i].data='0';HTTree[i].weight=0;//權(quán)值HTTree[i].parent=0;HTTree[i].LChild=0;HTTree[i].RChild=0;)returnj;//哈夫曼結(jié)點數(shù)量)〃選取最小的兩個節(jié)點值voidSelect(intnum,int*l,int*r)(inti,a,b;i=1;do(if(HTTree[i].parent==0)(b=i;break;)i++;}while(i<=num);do(if((HTTree[i].weight!=0)&&(HTTree[i].parent==0)&&(i!=b))(a=i;break;}i++;}while(i<=num);i=1;doif((HTTree[i].weight!=0)&&(HTTree[i].parent==0)&&(HTTree[a].weight>HTTree[i].weight))a=i;)i++;}while(i<=num);if(a==b)b++;i=1;do(if((HTTree[i].parent==0)&&(i!=a)&&(HTTree[b].weight>HTTree[i].weight))(b=i;}i++;}while(i<=num);(*l)=a;(*r)=b;}〃哈夫曼樹創(chuàng)建voidHfmTree()(inti,j,l,r;i=FoundHTTree();j=i;for(;j<=(2*(i-1)-1);j++)(Select(j-1,&l,&r);HTTree[j].weight=HTTree[l].weight+HTTree[r].weight;HTTree[l].parent=j;HTTree[r].parent=j;HTTree[j].LChild=l;HTTree[j].RChild=r;}}〃聲明:左子樹為0,右子樹為1〃遞歸--獲得每個字符對應(yīng)的哈弗曼編碼voidPreOder(char*p,inti,intj,int*z,intx)//i是數(shù)組p的下標,j是存儲結(jié)點HTTree數(shù)組的下標(左右孩子的下標),z為HCode數(shù)組的下標(charb[10]="777777777”;ints=0;while(s<i)(b[s]=p[s];s++;)if(x==0)b[i]='0';elseb[i]='1';if((HTTree[j].LChild==0)&&(HTTree[j].RChild==0))(strcpy(HCode[*z].code,b);HCode[*z].data=HTTree[j].data;(*z)=(*z)+1;return;)PreOder(b,i+1,HTTree[j].LChild,z,0);PreOder(b,i+1,HTTree[j].RChild,z,1);)〃哈夫曼編碼生成voidHfmCode()(inti,j,x;intz;charp[10];ints=0;for(;s<10;s++)p[s]='7';i=0;z=0;for(x=1;x<=M+1;x++)(if((HTTree[x].parent==0)&&(HTTree[x].LChild!=0)&&(HTTree[x].RChild!=0)&&(HTTree[x].weight!=0))j=x;break;))PreOder(p,i,HTTree[j].LChild,&z,0);PreOder(p,i,HTTree[j].RChild,&z,1);)〃哈夫曼編碼存儲數(shù)組的初始化voidFoundHCode()(intj=0;for(j=0;j<25;j++)(HCode[j].data='6';strcpy(HCode[j].code,"777777777");))〃輸出函數(shù),驗證結(jié)果voidPrin()(inti;printf("字符統(tǒng)計\n");for(i=0;i<N;i++)〃字符統(tǒng)計printf(''%d-%d,'',i,numArray[i]);printf("\n");printf("哈夫曼樹結(jié)點\n");for(i=1;HTTree[i].weight!=0;i++)//哈夫曼樹(printf("%d,%c-%d-%d-%d-%d",i,HTTree[i].data,HTTree[i].weight,HTTree[i].parent,HTTree[i].LChild,HTTree[i].RChild);)printf('\n');printf("哈弗曼編碼\n");for(i=0;strcmp(HCode[i].code,''777777777'')!=0;i++)//哈弗曼編碼printf("%d,%c-%s”,i,HCode[i].data,HCode[i].code);)printf("\n");)〃字符寫入文件函數(shù)voidWrite(chars,char*wp)//s為要寫入的字符,wp是寫入文檔的名稱(FILE*fp;charch;charpCoding[60]="yiwen.txt";charpDecoding[60]="textfile.txt";if(strcmp(pCoding,wp)==0||strcmp(pDecoding,wp))fp=fopen(wp,"a");elsefp=fopen(wp,"w");if((fp==NULL))(printf("文件yuanwen打開失?。?!\n");exit(0);)ch=s;fputc(ch,fp);fclose(fp);return;)//譯碼。將相對應(yīng)的哈弗曼編碼譯碼為字符voidDecompile(char*rp,char*wp)//----rp--譯文文檔路徑 wp--反編譯文檔路徑(charch;charp[10]="777777777'1;//初始化盛放讀取yiwen中某個哈弗曼編碼的pFILE*fp;inti=0,j=0;fp=fopen(rp,"r");if((fp==NULL))printf("文件打開失?。?!\n");exit(0);)//printf("文件打開成功?。n");do(ch=fgetc(fp);if(ch=='&')//&字符以后,是另一個字符(j=0;for(j=0;HCode[j].data!='6';j++)//遍歷HCode中的哈夫曼編碼,找到指定的字符(if(strcmp(HCode[j].code,p)==0)//找到對應(yīng)的哈弗曼編碼(Write(HCode[j].data,wp);/^^相應(yīng)字符寫入textfile.text中break;//退出循環(huán)))strcpyg,"????????711);//重新初始化盛放讀取yiwen中某個哈弗曼編碼的pi=0;continue;)p[i]=ch;i++;}while(ch!=EOF);printf("譯碼成功,請到該程序文件夾中的''%s、'1查看\n\n",wp);printf("\n");}〃編碼處理。將字符編碼為對應(yīng)的哈夫曼編碼voidTranslate(char*rp,char*wp)(charch;inti,j,c=1;//缺少一個判斷,判斷該原文文檔是否存在FILE*fp;fp=fopen(rp,"r");if(fp==NULL)(printf("文件打開失?。。n");exit(0);)do(ch=fgetc(fp);for(i=0;HCode[i].data!='6';i++)(if(ch==HCode[i].data)(for(j=0;HCode[i].code[j]!='7';j++)(Write(HCode[i].code[j],wp);)Write('&',wp);))}while(ch!=EOF);printf("編碼成功,請到該程序文件夾中的、,皈、,1查看\n\n”,wp);printf("\n");}〃獲取編碼后內(nèi)容存放文檔的名稱voidMenuCoding2(char*pp)//pp來盛放(intch;charp1[20];charp2[20]="yiwen.txt";printf(" \n");printf("| 1、指定編碼文檔的名稱 |\n");printf("| 2、選擇默認yiwen.txt文檔|\n");printf(" \n");printf("****請輸入選擇(1或2):");scanf("%d",&ch);switch(ch)((printf("請輸入編碼文檔的名稱(包括文檔的后綴名):");scanf("%s",&p1);strcpy(pp,p1);break;)(strcpy(pp,p2);break;)default:(printf(,l輸入錯誤,請重新輸入!\n");break;)))〃編碼處理--將指定的要編碼的文檔并指定的文檔來盛放voidMenuCoding1()(intch;charp11[20];〃盛放自定義的編碼文檔名稱charp22[20];charp1[20];charp2[20]="yuanwen.txt";printf(" \n");printf("| 1、指定需要編碼文檔的名稱|\n");printf("| 2、選擇默認yuanwen.txt文檔 |\n");printf(" \n");printf("****請輸入選擇(1或2):");scanf("%d",&ch);switch(ch)((printf("請輸入被編碼的文檔名稱(包括文檔的后綴名):");scanf("%s",&p1);MenuCoding2(p11);Translate(p1,p11);break;)(MenuCoding2(p22);Translate(p2,p22);break;)default:(printf(,l輸入錯誤,請重新輸入!\n");break;)))voidMenuDecoding2(char*pp)〃譯碼--反編譯文檔名稱(intch;charp1[20];charp2[20]="textfile.txt";printf(" \n");printf("| 1、指定反編譯文檔的名稱|\n");printf("| 2、選擇默認textfile.txt文檔|\n");printf(" \n");printf("****請輸入選擇(1或2):");scanf("%d",&ch);switch(ch)((printf("請輸入編碼文檔的名稱(包括文檔的后綴名):");scanf("%s",&p1);strcpy(pp,p1);break;)(strcpy(pp,p2);break;)default:(printf(,l輸入錯誤,請重新輸入!\n");break;)〃譯碼處理--將指定的要譯碼的文檔并指定的文檔來盛放voidMenuDecoding1()(intch;charp11[20];charp22[20];charp1[20];charp2[20]="yiwen.txt";printf(" \n");printf("| 1、指定需要譯碼文檔的名稱|\n");printf("| 2、選擇默認yiwen.txt文檔|\n");printf(" \n");printf("****請輸入選擇(1或2):");scanf("%d",&ch);switch(ch)((printf("請輸入被編碼的文檔名稱(包括文檔的后綴名):");scanf("%s",&p1);MenuDecoding2(p11);Decompile(p1,p11);break;)(MenuDecoding2(p22);Decompile(p2,p22);break;)default:(printf(,l輸入錯誤,請重新輸入!\n");break;)〃菜單選擇voidMenu()(intch;printf("**********

溫馨提示

  • 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

提交評論