哈夫曼編譯碼器教學(xué)規(guī)劃報(bào)告(完全版)_第1頁(yè)
哈夫曼編譯碼器教學(xué)規(guī)劃報(bào)告(完全版)_第2頁(yè)
哈夫曼編譯碼器教學(xué)規(guī)劃報(bào)告(完全版)_第3頁(yè)
哈夫曼編譯碼器教學(xué)規(guī)劃報(bào)告(完全版)_第4頁(yè)
哈夫曼編譯碼器教學(xué)規(guī)劃報(bào)告(完全版)_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

XXX學(xué)院本科數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)總結(jié)報(bào)告設(shè)計(jì)題目:實(shí)驗(yàn)一、哈夫曼編/譯碼器學(xué)生姓名:XXX系 別:XXX專 業(yè):XXX班 級(jí):XXX學(xué) 號(hào):XXX指導(dǎo)教師:XXXXXX_2012年6月21日學(xué)院程設(shè)計(jì)任務(wù)書(shū)題目 一、赫夫曼編譯碼器專業(yè)、班級(jí)xxx學(xué)號(hào) xxx 姓名 xxx主要內(nèi)容、基本要求、主要參考資料等:主要內(nèi)容利用哈夫曼編碼進(jìn)行信息通信可大大提高信道利用率,縮短信息傳輸時(shí)間,降低傳輸成本。要求在發(fā)送端通過(guò)一個(gè)編碼系統(tǒng)對(duì)待傳數(shù)據(jù)預(yù)先編碼;在接收端將傳來(lái)的數(shù)據(jù)進(jìn)行譯碼(復(fù)原)。對(duì)于雙工信道(既可以雙向傳輸信息的信道),每端都需要一個(gè)完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫(xiě)一個(gè)哈夫曼的編/譯碼系統(tǒng)。精品文檔放心下載基本要求系統(tǒng)應(yīng)具有以下功能:(1)C:編碼(Coding)。對(duì)文件tobetrans中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile中,將以此建好的哈夫曼樹(shù)存入文件HuffmanTree中感謝閱讀(2)D:解碼(Decoding)。利用已建好的哈夫曼樹(shù)將文件codefile中的代碼進(jìn)行譯碼,結(jié)果存入textfile中。精品文檔放心下載_(3)P:打印代碼文件(Print)。將文件codefile以緊湊格式顯示在終端上,每行50個(gè)代碼。同時(shí)將此字符形式的編碼文件寫(xiě)入文件codeprint中。精品文檔放心下載(4)T:打印哈夫曼樹(shù)(TreePrinting)。將已在內(nèi)存中的哈夫曼樹(shù)以直觀的方式(樹(shù)或凹入表形式)顯示在終端上,同時(shí)將此字符形式的哈夫曼樹(shù)寫(xiě)入文件treeprint中。感謝閱讀3.參考資料:數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)嚴(yán)蔚敏、吳偉民編著;謝謝閱讀數(shù)據(jù)結(jié)構(gòu)標(biāo)準(zhǔn)教程胡超、閆寶玉編著完 成 期 限:2012年6月21 日指導(dǎo)教師簽名:課程負(fù)責(zé)人簽名:2012年 6月 21日一、設(shè)計(jì)題目(任選其一)實(shí)驗(yàn)一、哈夫曼編/譯碼器二、實(shí)驗(yàn)?zāi)康撵柟毯图由顚?duì)數(shù)據(jù)結(jié)構(gòu)的理解,提高綜合運(yùn)用本課程所學(xué)知識(shí)的能力;感謝閱讀深化對(duì)算法課程中基本概念、理論和方法的理解;鞏固構(gòu)造赫夫曼樹(shù)的算法;設(shè)計(jì)試驗(yàn)用程序?qū)嶒?yàn)赫夫曼樹(shù)的構(gòu)造。三、運(yùn)行環(huán)境(軟、硬件環(huán)境)Windowsxpsp3,VisualC++6.0英文版精品文檔放心下載_四、算法設(shè)計(jì)的思想(1)初始化赫夫曼樹(shù),輸入文件tobetrans.txt中各字符及其權(quán)值,并保存于hfmtree.txt文件中謝謝閱讀(2)編碼(Coding)。對(duì)文件tobetrans中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile中精品文檔放心下載(3)D:解碼(Decoding)。利用已建好的哈夫曼樹(shù)將文件codefile中的代碼進(jìn)行譯碼,結(jié)果存入textfile中。感謝閱讀(4)P:打印代碼文件(Print)。將文件codefile以緊湊格式顯示在終端上,每行50個(gè)代碼。同時(shí)將此字符形式的編碼文件寫(xiě)入文件codeprint中。感謝閱讀(5)T:打印哈夫曼樹(shù)(TreePrinting)。將已在內(nèi)存中的哈夫曼樹(shù)以直觀的方式顯示在終端上,同時(shí)將此字符形式的哈夫曼樹(shù)寫(xiě)入文件treeprint中。感謝閱讀五、流程圖_六、算法設(shè)計(jì)分析1.赫夫曼樹(shù)節(jié)點(diǎn)的數(shù)據(jù)類型定義為:typedefstruct{//赫夫曼樹(shù)的結(jié)構(gòu)體charch;感謝閱讀intweight; //權(quán)值intparent,lchild,rchild;}HTNode,*HuffmanTree;voidHuffmanCoding(HuffmanTree&,char*,int*,int);建立赫夫曼樹(shù)的算法,此函數(shù)塊調(diào)用了Select()函數(shù)。voidselect(HuffmanTreeHT,intj,int*x,int*y);從已建好的赫夫曼樹(shù)中選擇parent為0,weight最小的兩個(gè)結(jié)點(diǎn)。感謝閱讀3.利用已建好的哈夫曼樹(shù)從文件hfmtree.txt中讀入,對(duì)文件中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile.txt中。精品文檔放心下載coding編碼功能:對(duì)輸入字符進(jìn)行編碼Decoding譯碼功能:利用已建好的哈夫曼樹(shù)將文件codefile.txt中的代碼進(jìn)行譯碼,結(jié)果存入文件textfile.txt中。謝謝閱讀Print()打印功能函數(shù):輸出哈夫曼樹(shù)以及對(duì)應(yīng)的編碼。精品文檔放心下載七、源代碼//////////////////////////////////////////////////////////////////////////////感謝閱讀_////////////#include<stdio.h>#include<stdlib.h>#include<string.h>//定義赫夫曼樹(shù)結(jié)點(diǎn)的結(jié)構(gòu)體typedefstruct{charch; //增加一個(gè)域,存放該節(jié)點(diǎn)的字符intweight;intparent,lchild,rchild;}HTNode,*HuffmanTree;typedefchar**HuffmanCode; //指向赫夫曼編碼的指針謝謝閱讀voidtips(); //打印操作選擇界面voidHuffmanCoding(HuffmanTree&,char*,int*,int); //建立赫夫曼精品文檔放心下載樹(shù)的算法voidselect(HuffmanTreeHT,intj,int*x,int*y); //從已建好的赫夫曼謝謝閱讀樹(shù)中選擇parent為0,weight最小的兩個(gè)結(jié)點(diǎn)精品文檔放心下載voidInit();voidCoding(); //編碼voidDecoding(); //譯碼voidPrint_code(); //打印譯碼好的代碼謝謝閱讀_voidPrint_tree(); //打印哈夫曼樹(shù)感謝閱讀intRead_tree(HuffmanTree&);//從文件中讀入赫夫曼樹(shù)精品文檔放心下載voidfind(HuffmanTree&HT,char*code,char*text,inti,intm); //譯碼感謝閱讀時(shí)根據(jù)01字符串尋找相應(yīng)葉子節(jié)點(diǎn)的遞歸算法voidConvert_tree(unsignedcharT[100][100],ints,int*i,intj); //將內(nèi)謝謝閱讀存中的赫夫曼樹(shù)轉(zhuǎn)換成凹凸表形式的赫夫曼樹(shù)HuffmanTreeHT; //全局變量intn=0; //全局變量,存放赫夫曼樹(shù)葉子結(jié)點(diǎn)的數(shù)目感謝閱讀intmain(){charselect;while(1){tips();scanf("%c",&select);switch(select) //選擇操作,根據(jù)不同的序號(hào)選擇不同的操作精品文檔放心下載{case'1':Init();_break;case'2':Coding();break;case'3':Decoding();break;case'4':Print_code();break;case'5':Print_tree();break;case'0':exit(1);default:printf("Inputerror!\n");感謝閱讀}getchar();}return0;}_voidtips()//操作選擇界面{printf("-----------------------------------------------------\n");printf("--請(qǐng)選擇操作--\n");printf("-----------------------------------------------------\n");printf("\n");printf("---------------------1初始化赫夫曼樹(shù)---------------\n");printf("---------------------2編碼---------------\n");printf("---------------------3譯碼---------------\n");printf("---------------------4打印代碼文件---------------\n");printf("---------------------5打印赫夫曼樹(shù)---------------\n");printf("---------------------0退出---------------\n");printf("-----------------------------------------------------\n");}//初始化函數(shù),輸入n個(gè)字符及其對(duì)應(yīng)的權(quán)值,根據(jù)權(quán)值建立哈夫曼樹(shù),并謝謝閱讀將其存于文件hfmtree中voidInit(){FILE*fp;_inti,n,w[52]; //數(shù)組存放字符的權(quán)值謝謝閱讀charcharacter[52]; //存放n個(gè)字符謝謝閱讀printf("\n輸入字符個(gè)數(shù)n:");scanf("%d",&n); //輸入字符集大小printf("輸入%d個(gè)字符及其對(duì)應(yīng)的權(quán)值:\n",n);精品文檔放心下載for(i=0;i<n;i++){charb=getchar();scanf("%c",&character[i]);精品文檔放心下載scanf("%d",&w[i]); //輸入n個(gè)字符和對(duì)應(yīng)的權(quán)值感謝閱讀}HuffmanCoding(HT,character,w,n); //建立赫夫曼樹(shù)精品文檔放心下載if((fp=fopen("hfmtree.txt","w"))==NULL)感謝閱讀printf("Openfilehfmtree.txterror!\n");精品文檔放心下載for(i=1;i<=2*n-1;i++){if(fwrite(&HT[i],sizeof(HTNode),1,fp)!=1)//將建立的赫夫曼樹(shù)存入文件hfmtree.txt中感謝閱讀printf("Filewriteerror!\n");精品文檔放心下載}printf("\n赫夫曼樹(shù)建立成功,并已存于文件hfmtree.txt中\(zhòng)n");精品文檔放心下載_fclose(fp);}//建立赫夫曼樹(shù)的算法voidHuffmanCoding(HuffmanTree&HT,char*character,int*w,intn)謝謝閱讀{intm,i,x,y;HuffmanTreep;if(n<=1)return;m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));感謝閱讀for(p=HT+1,i=1;i<=n;++i,++p,++character,++w)感謝閱讀{p->ch=*character;p->weight=*w;p->parent=0;p->lchild=0;p->rchild感謝閱讀=0;}for(;i<=m;++i,++p){p->ch=0;p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}感謝閱讀for(i=n+1;i<=m;++i){select(HT,i-1,&x,&y);HT[x].parent=i;HT[y].parent=i;感謝閱讀HT[i].lchild=x;HT[i].rchild=y;精品文檔放心下載_HT[i].weight=HT[x].weight+HT[y].weight;精品文檔放心下載}}//從HT[1]到HT[j]中選擇parent為0,weight最小的兩個(gè)結(jié)點(diǎn),用x和y返回其序號(hào)謝謝閱讀voidselect(HuffmanTreeHT,intj,int*x,int*y)感謝閱讀{inti;//查找weight最小的結(jié)點(diǎn)for(i=1;i<=j;i++)if(HT[i].parent==0){*x=i;break;}for(;i<=j;i++)if((HT[i].parent==0)&&(HT[i].weight<HT[*x].weight))精品文檔放心下載*x=i;HT[*x].parent=1;//查找weight次小的結(jié)點(diǎn)for(i=1;i<=j;i++)if(HT[i].parent==0)_{*y=i;break;}for(;i<=j;i++)if((HT[i].parent==0)&&(i!=*x)&&(HT[i].weight<HT[*y].weight))謝謝閱讀*y=i;}//對(duì)文件tobetrans中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile中感謝閱讀voidCoding(){FILE*fp,*fw;inti,f,c,start;char*cd;HuffmanCodeHC;if(n==0)n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹(shù),返回葉子結(jié)點(diǎn)數(shù)感謝閱讀//求赫夫曼樹(shù)中各葉子節(jié)點(diǎn)的字符對(duì)應(yīng)的的編碼,并存于HC指向的空間中精品文檔放心下載{HC=(HuffmanCode)malloc((n+1)*sizeof(char*));精品文檔放心下載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));精品文檔放心下載strcpy(HC[i],&cd[start]);}free(cd);}if((fp=fopen("tobetrans.txt","rb"))==NULL)謝謝閱讀printf("Openfiletobetrans.txterror!\n");謝謝閱讀if((fw=fopen("codefile.txt","wb+"))==NULL)謝謝閱讀printf("Openfilecodefile.txterror!\n");精品文檔放心下載chartemp;fscanf(fp,"%c",&temp);//從文件讀入第一個(gè)字符while(!feof(fp))謝謝閱讀_{for(i=1;i<=n;i++)if(HT[i].ch==temp)break; //在赫夫曼樹(shù)中查找字符所在的位置感謝閱讀for(intr=0;HC[i][r]!='\0';r++) //將字符對(duì)應(yīng)的編碼存入文件精品文檔放心下載fputc(HC[i][r],fw);fscanf(fp,"%c",&temp); //從文件讀入下一個(gè)字符謝謝閱讀}fclose(fw);fclose(fp);printf("\n已將文件hfmtree.txt成功編碼,并已存入codefile.txt中!\n\n");感謝閱讀}//將文件codefile中的代碼進(jìn)行譯碼,結(jié)果存入文件textfile中精品文檔放心下載voidDecoding(){FILE*fp,*fw;intm,i;char*code,*text,*p;if(n==0)_n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹(shù),返回葉子結(jié)點(diǎn)數(shù)感謝閱讀if((fp=fopen("codefile.txt","rb"))==NULL)printf("Openfilecodefile.txterror!\n");if((fw=fopen("textfile.txt","wb+"))==NULL)printf("Openfiletextfile.txterror!\n");感謝閱讀code=(char*)malloc(sizeof(char));謝謝閱讀fscanf(fp,"%c",code); //從文件讀入一個(gè)字符謝謝閱讀for(i=1;!feof(fp);i++){code=(char*)realloc(code,(i+1)*sizeof(char)); //增加空間感謝閱讀fscanf(fp,"%c",&code[i]); //從文件讀入下一個(gè)字符感謝閱讀}code[i-1]='\0';//codefile.txt文件中的字符已全部讀入,存放在code數(shù)組中感謝閱讀text=(char*)malloc(100*sizeof(char));精品文檔放心下載p=text;m=2*n-1;if(*code=='0')find(HT,code,text,HT[m].lchild,m);//從根節(jié)點(diǎn)的左子樹(shù)去找else感謝閱讀find(HT,code,text,HT[m].rchild,m); //從根節(jié)點(diǎn)的右子樹(shù)去找謝謝閱讀_for(i=0;p[i]!='\0';i++)//把譯碼好的字符存入文件textfile.txt中fputc(p[i],fw);謝謝閱讀fclose(fp);fclose(fw);printf("\n已將codefile.txt文件成功譯碼,兵已存入textfile.txt文件!\n\n");精品文檔放心下載}//將文件codefi1e以緊湊格式顯示在終端上,每行50個(gè)代碼。同時(shí)將此字符形式的編碼文件寫(xiě)入文件codeprint中。voidPrint_code()精品文檔放心下載{FILE*fp,*fw;chartemp;inti;if((fp=fopen("codefile.txt","rb"))==NULL)謝謝閱讀printf("Openfilecodefile.txterror!\n");精品文檔放心下載if((fw=fopen("codeprint.txt","wb+"))==NULL)精品文檔放心下載printf("Openfilecodeprint.txterror!\n");感謝閱讀_printf("\n文件codefi1e顯示如下:\n");感謝閱讀fscanf(fp,"%c",&temp); //從文件讀入一個(gè)字符謝謝閱讀for(i=1;!feof(fp);i++){printf("%c",temp);if(i%50==0)printf("\n");fputc(temp,fw); //將該字符存入文件codeprint.txt中謝謝閱讀fscanf(fp,"%c",&temp); //從文件讀入一個(gè)字符精品文檔放心下載}printf("\n\n已將此字符形式的編碼寫(xiě)入文件codeprint.txt中!\n\n");感謝閱讀fclose(fp);fclose(fw);}//將已在內(nèi)存中的哈夫曼樹(shù)顯示在屏幕上,并將此字符形式的哈夫曼樹(shù)寫(xiě)入文感謝閱讀件treeprint中。voidPrint_tree(){_unsignedcharT[100][100];謝謝閱讀inti,j,m=0;FILE*fp;if(n==0)n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹(shù),返回葉子結(jié)點(diǎn)數(shù)感謝閱讀Convert_tree(T,0,&m,2*n-1);//將內(nèi)存中的赫夫曼樹(shù)轉(zhuǎn)換成凹凸表形式的樹(shù),存于數(shù)組T中感謝閱讀if((fp=fopen("treeprint.txt","wb+"))==NULL)printf("Openfiletreeprint.txterror!\n");printf("\n打印已建好的赫夫曼樹(shù):\n");感謝閱讀for(i=1;i<=2*n-1;i++){for(j=0;T[i][j]!=0;j++){if(T[i][j]==''){printf("");fputc(T[i][j],fp);}精品文檔放心下載else{printf("%d",T[i][j]);fprintf(fp,"%d\n",T[i][j]);}感謝閱讀}printf("\n");_}fclose(fp);printf("\n已將該字符形式的哈夫曼樹(shù)寫(xiě)入文件treeprint.txt中!\n\n");精品文檔放心下載}//從文件hfmtree.txt中讀入赫夫曼樹(shù),返回葉子節(jié)點(diǎn)數(shù)intRead_tree(HuffmanTree&HT){謝謝閱讀FILE*fp;inti,n;HT=(HuffmanTree)malloc(sizeof(HTNode));感謝閱讀if((fp=fopen("hfmtree.txt","r"))==NULL)精品文檔放心下載printf("Openfilehfmtree.txterror!\n");謝謝閱讀for(i=1;!feof(fp);i++){HT=(HuffmanTree)realloc(HT,(i+1)*sizeof(HTNode));//增加空間fread(&HT[i],sizeof(HTNode),1,fp);//讀入一個(gè)節(jié)點(diǎn)信息謝謝閱讀}fclose(fp);n=(i-1)/2;returnn;_}//譯碼時(shí)根據(jù)01字符串尋找相應(yīng)葉子節(jié)點(diǎn)的遞歸算法感謝閱讀voidfind(HuffmanTree&HT,char*code,char*text,inti,intm)謝謝閱讀{if(*code!='\0') //若譯碼未結(jié)束{code++;if(HT[i].lchild==0&&HT[i].rchild==0) //若找到葉子節(jié)點(diǎn)精品文檔放心下載{*text=HT[i].ch; //將葉子節(jié)點(diǎn)的字符存入text中精品文檔放心下載text++;if((*code=='0'))find(HT,code,text,HT[m].lchild,m); //從根節(jié)點(diǎn)的左子樹(shù)找謝謝閱讀elsefind(HT,code,text,HT[m].rchild,m); //從根節(jié)點(diǎn)的右子樹(shù)找謝謝閱讀}else //如果不是葉子節(jié)點(diǎn)_if(*code=='0')find(HT,code,text,HT[i].lchild,m);//從該節(jié)點(diǎn)的左子樹(shù)去找else精品文檔放心下載find(HT,code,text,HT[i].rchild,m); //從該節(jié)點(diǎn)的右子樹(shù)去找感謝閱讀}else*text='\0';//譯碼結(jié)束}//將文件中的赫夫曼樹(shù)轉(zhuǎn)換成凹凸表形式的赫夫曼樹(shù)打印出來(lái)voidConvert_tree(unsignedcharT[100][100],ints,int*i,intj){謝謝閱讀intk,l;l=++(*i);for(k=0;k<s;k++)T[l][k]='';T[l][k]=HT[j].weight;if(HT[j].lchild)Convert_tree(T,s+1,i,HT[j].lchild);感謝閱讀_if(HT[j].rchild)Convert_tree(T,s+1,i,HT[j].rchild);感謝閱讀T[l][++k]='\0';}//////////////////////////////////////////////////////////////////////////////謝謝閱讀////////////////////八、運(yùn)行結(jié)果分析截圖說(shuō)明:1、運(yùn)行后界面如圖(1):圖(1)選擇要選擇的操作序號(hào)可以運(yùn)行各個(gè)步驟;2、初始化赫夫曼樹(shù):輸入tobetrans.txt中各元素及其出現(xiàn)頻率,如圖(2)感謝閱讀_圖(2)3、編碼及譯碼,如圖(3)圖(3)4、打印編碼文件,如圖(4)_圖(4)5、打印赫夫曼樹(shù),如圖(5)圖(5)6、各步驟所存的文件內(nèi)容如圖(6)_圖(6)九、收獲及體會(huì)課程設(shè)計(jì)是讓我們充分利用我們專業(yè)課程所學(xué)知識(shí)的機(jī)會(huì),也是我們邁向社謝謝閱讀會(huì),從事工作前一個(gè)必不少的過(guò)程。通過(guò)這次課程設(shè)計(jì),我深深體會(huì)到將知識(shí)運(yùn)謝謝閱讀用到實(shí)踐中的重要作用。我這兩天的課程設(shè)計(jì),是讓我學(xué)會(huì)腳踏實(shí)地邁開(kāi)這一步,精品文檔放心下載也是為明天能穩(wěn)健地在社會(huì)大潮中奔跑打下堅(jiān)實(shí)的基礎(chǔ)。我的課程設(shè)計(jì)題目是赫夫曼編譯碼器。最初做這個(gè)程序的時(shí)候,讓我覺(jué)得完謝謝閱讀成這次程序設(shè)計(jì)真的是太難了,然后我查閱了課本,并去圖書(shū)館借了資料,在寫(xiě)精品文檔放心下載這個(gè)程序的時(shí)候也參考了網(wǎng)上的設(shè)計(jì)流程,寫(xiě)完剛運(yùn)行時(shí)出現(xiàn)了很多問(wèn)題。尤其精品文檔放心下載是編碼錯(cuò)誤,導(dǎo)致內(nèi)存無(wú)法read,通過(guò)同組人員的交流請(qǐng)教,逐漸明白過(guò)來(lái),精品文檔放心下載然后經(jīng)過(guò)不知道多少次修改才順利運(yùn)行。本次試驗(yàn)也讓我明白了理論與實(shí)際相結(jié)精品文檔放心下載合的重要性,并提高了自己組織數(shù)據(jù)及編寫(xiě)大型程序的能力,培養(yǎng)了基本的、良謝謝閱讀_好的程序設(shè)計(jì)技能以及合作能力。通過(guò)對(duì)各個(gè)步驟各個(gè)流程的控制,逐漸讓我精品文檔放心下載產(chǎn)生了興趣,在實(shí)際編寫(xiě)過(guò)程中,和同學(xué)們相互討論讓我學(xué)到的不僅僅是一些解精品文檔放心下載決問(wèn)題的方法,更是解決問(wèn)題的思想。課程設(shè)計(jì)本身也是一種相互學(xué)習(xí)的過(guò)謝謝閱讀程,//////////////////////////////////////////////////////////////////////////////謝謝閱讀/////////////////////////////////////////////////////////感謝閱讀#include<stdio.h>#include<stdlib.h> //為exit()提供原型謝謝閱讀#include<string.h>//哈夫曼樹(shù)結(jié)點(diǎn)的結(jié)構(gòu)typedefstruct{charch;

//該字符域用于存放節(jié)點(diǎn)的關(guān)鍵字intweight;intparent,lchild,rchild;感謝閱讀}HTNode, *HuffmanTree;

//動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼樹(shù)typedefchar**HuffmanCode; //動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼編碼表感謝閱讀voidMenu(); //顯示菜單voidHuffmanCoding(HuffmanTree&HT,char*character,int*w,intn); //建立哈夫曼樹(shù)謝謝閱讀voidselect(HuffmanTreeHT,intj,int*x,int*y); //從已建好的赫夫曼樹(shù)中選擇parent為0,謝謝閱讀weight最小的兩個(gè)結(jié)點(diǎn)voidInit();_voidCoding(); //編碼voidDecoding(); //譯碼voidPrint_code(); //打印譯碼好的代碼感謝閱讀voidPrint_tree(); //打印哈夫曼樹(shù)精品文檔放心下載intRead_tree(HuffmanTree&);//從文件中讀入赫夫曼樹(shù)謝謝閱讀voidfind(HuffmanTree&HT,char*code,char*text,inti,intm); //譯碼時(shí)根據(jù)01字符串尋找謝謝閱讀相應(yīng)葉子節(jié)點(diǎn)的遞歸算法voidConvert_tree(unsignedcharT[100][100],ints,int*i,intj); //將內(nèi)存中的赫夫曼樹(shù)轉(zhuǎn)換成謝謝閱讀凹凸表形式的赫夫曼樹(shù)HuffmanTreeHT; //全局變量intn=0; //全局變量,存放赫夫曼樹(shù)葉子結(jié)點(diǎn)的數(shù)目感謝閱讀intmain(){charselect;while(1){Menu();scanf("%c",&select);switch(select) //選擇操作,根據(jù)不同的序號(hào)選擇不同的操作感謝閱讀_{case'1':Init();break;case'2':Coding();break;case'3':Decoding();break;case'4':Print_code();break;case'5':Print_tree();break;case'0':exit(1);default:printf("Inputerror!\n");感謝閱讀}getchar();_}return0;}voidMenu()//操作選擇界面{printf("-----------------------------------------------------\n");printf("--請(qǐng)選擇操作--\n");printf("-----------------------------------------------------\n");printf("\n");printf("---------------------1初始化赫夫曼樹(shù)---------------\n");printf("---------------------2編碼---------------\n");printf("---------------------3譯碼---------------\n");printf("---------------------4打印代碼文件---------------\n");printf("---------------------5打印赫夫曼樹(shù)---------------\n");printf("---------------------0退出---------------\n");printf("-----------------------------------------------------\n");}//初始化函數(shù),輸入n個(gè)字符及其對(duì)應(yīng)的權(quán)值,根據(jù)權(quán)值建立哈夫曼樹(shù),并將其存于文件hfmtree感謝閱讀中_voidInit(){FILE*fp;inti,n,w[52]; //數(shù)組存放字符的權(quán)值感謝閱讀charcharacter[52]; //存放n個(gè)字符謝謝閱讀printf("\n輸入字符個(gè)數(shù)n:");scanf("%d",&n); //輸入字符集大小謝謝閱讀printf("輸入%d個(gè)字符及其對(duì)應(yīng)的權(quán)值:\n",n);謝謝閱讀for(i=0;i<n;i++){charb=getchar();scanf("%c",&character[i]);感謝閱讀scanf("%d",&w[i]); //輸入n個(gè)字符和對(duì)應(yīng)的權(quán)值謝謝閱讀}HuffmanCoding(HT,character,w,n); //建立赫夫曼樹(shù)精品文檔放心下載if((fp=fopen("hfmtree.txt","w"))==NULL)精品文檔放心下載printf("Openfilehfmtree.txterror!\n");感謝閱讀for(i=1;i<=2*n-1;i++)精品文檔放心下載{if(fwrite(&HT[i],sizeof(HTNode),1,fp)!=1) //將建立的赫夫曼樹(shù)存入文件謝謝閱讀hfmtree.txt中_printf("Filewriteerror!\n");謝謝閱讀}printf("\n赫夫曼樹(shù)建立成功,并已存于文件hfmtree.txt中\(zhòng)n");感謝閱讀fclose(fp);}//構(gòu)造哈夫曼樹(shù)的算法voidHuffmanCoding(HuffmanTree&HT,char*character,int*w,intn)謝謝閱讀{ //w存放n個(gè)字符的權(quán)值(均>0),構(gòu)造哈夫曼樹(shù)HT感謝閱讀intm,i,x,y;HuffmanTreep;if(n<=1)return;m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));謝謝閱讀for(p=HT+1,i=1;i<=n;++i,++p,++character,++w)精品文檔放心下載{p->ch=*character;p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;感謝閱讀}for(;i<=m;++i,++p){p->ch=0;p->weight=0;p->parent=0;p->lchild=0;精品文檔放心下載p->rchild=0;}for(i=n+1;i<=m;++i)謝謝閱讀_{select(HT,i-1,&x,&y);謝謝閱讀HT[x].parent=i;HT[y].parent=i;感謝閱讀HT[i].lchild=x;HT[i].rchild=y;精品文檔放心下載HT[i].weight=HT[x].weight+HT[y].weight;精品文檔放心下載}}//從HT[1]到HT[j]中選擇parent為0,weight最小的兩個(gè)結(jié)點(diǎn),用x和y返回其序號(hào)精品文檔放心下載voidselect(HuffmanTreeHT,intj,int*x,int*y)謝謝閱讀{inti;//查找weight最小的結(jié)點(diǎn)for(i=1;i<=j;i++)if(HT[i].parent==0){*x=i;break;}for(;i<=j;i++)if((HT[i].parent==0)&&(HT[i].weight<HT[*x].weight))謝謝閱讀_*x=i;HT[*x].parent=1;//查找weight次小的結(jié)點(diǎn)for(i=1;i<=j;i++)if(HT[i].parent==0){*y=i;break;}for(;i<=j;i++)if((HT[i].parent==0)&&(i!=*x)&&(HT[i].weight<HT[*y].weight))精品文檔放心下載*y=i;}//對(duì)文件tobetrans中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile中感謝閱讀voidCoding(){FILE*fp,*fw;inti,f,c,start;char*cd;HuffmanCodeHC;_if(n==0)n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹(shù),返回葉子結(jié)點(diǎn)數(shù)謝謝閱讀//求赫夫曼樹(shù)中各葉子節(jié)點(diǎn)的字符對(duì)應(yīng)的的編碼,并存于HC指向的謝謝閱讀空間中{HC=(HuffmanCode)malloc((n+1)*sizeof(char*));謝謝閱讀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));感謝閱讀strcpy(HC[i],&cd[start]);謝謝閱讀}free(cd);}_if((fp=fopen("tobetrans.txt","rb"))==NULL)精品文檔放心下載printf("Openfiletobetrans.txterror!\n");謝謝閱讀if((fw=fopen("codefile.txt","wb+"))==NULL)精品文檔放心下載printf("Openfilecodefile.txterror!\n");感謝閱讀chartemp;fscanf(fp,"%c",&temp); //從文件讀入第一個(gè)字符精品文檔放心下載while(!feof(fp)){for(i=1;i<=n;i++)if(HT[i].ch==temp)break; //在赫夫曼樹(shù)中查找字符所在的位置感謝閱讀for(intr=0;HC[i][r]!='\0';r++) //將字符對(duì)應(yīng)的編碼存入文件精品文檔放心下載fputc(HC[i][r],fw);fscanf(fp,"%c",&temp); //從文件讀入下一個(gè)字符精品文檔放心下載}fclose(fw);fclose(fp);printf("\n已將文件hfmtree.txt成功編碼,并已存入codefile.txt中!\n\n");精品文檔放心下載}_//將文件codefile中的代碼進(jìn)行譯碼,結(jié)果存入文件textfile中謝謝閱讀voidDecoding(){FILE*fp,*fw;intm,i;char*code,*text,*p;if(n==0)n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹(shù),返回葉子結(jié)點(diǎn)數(shù)感謝閱讀if((fp=fopen("codefile.txt","rb"))==NULL)謝謝閱讀printf("Openfilecodefile.txterror!\n");感謝閱讀if((fw=fopen("textfile.txt","wb+"))==NULL)感謝閱讀printf("Openfiletextfile.txterror!\n");感謝閱讀code=(char*)malloc(sizeof(char));感謝閱讀fscanf(fp,"%c",code); //從文件讀入一個(gè)字符感謝閱讀for(i=1;!feof(fp);i++)精品文檔放心下載{code=(char*)realloc(code,(i+1)*sizeof(char)); //增加空間謝謝閱讀fscanf(fp,"%c",&code[i]); //從文件讀入下一個(gè)字符精品文檔放心下載}code[i-1]='\0';_//codefile.txt文件中的字符已全部讀入,存放在code數(shù)組中感謝閱讀text=(char*)malloc(100*sizeof(char));感謝閱讀p=text;m=2*n-1;if(*code=='0')find(HT,code,text,HT[m].lchild,m); //從根節(jié)點(diǎn)的左子樹(shù)去找精品文檔放心下載elsefind(HT,code,text,HT[m].rchild,m); //從根節(jié)點(diǎn)的右子樹(shù)去找感謝閱讀for(i=0;p[i]!='\0';i++) //把譯碼好的字符存入文件textfile.txt中感謝閱讀fputc(p[i],fw);fclose(fp);fclose(fw);printf("\n已將codefile.txt文件成功譯碼,兵已存入textfile.txt文件!\n\n");謝謝閱讀}//將文件codefi1e以緊湊格式顯示在終端上,每行50個(gè)代碼。同時(shí)將此字符形式的編碼文件寫(xiě)入文謝謝閱讀件codeprint中。voidPrint_code(){_FILE*fp,*fw;chartemp;inti;if((fp=fopen("codefile.txt","rb"))==NULL)感謝閱讀printf("Openfilecodefile.txterror!\n");精品文檔放心下載if((fw=fopen("codeprint.txt","wb+"))==NULL)精品文檔放心下載printf("Openfilecodeprint.txterror!\n");感謝閱讀printf("\n文件codefi1e顯示如下:\n");感謝閱讀fscanf(fp,"%c",&temp); //從文件讀入一個(gè)字符感謝閱讀for(i=1;!feof(fp);i++)謝謝閱讀{printf("%c",temp);if(i%50==0)printf("\n");感謝閱讀fputc(temp,fw); //將該字符存入文件codeprint.txt中感謝閱讀fscanf(fp,"%c",&temp); //從文件讀入一個(gè)字符謝謝閱讀}printf("\n\n已將此字符形式的編碼寫(xiě)入文件codeprint.txt中!\n\n");感謝閱讀fclose(fp);fclose(fw);_}//將已在內(nèi)存中的哈夫曼樹(shù)顯示在屏幕上,并將此字符形式的哈夫曼樹(shù)寫(xiě)入文件treeprint中。謝謝閱讀voidPrint_tree(){u

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論