版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
XXX學(xué)院本科數(shù)據(jù)結(jié)構(gòu)課程設(shè)計總結(jié)報告設(shè)計題目:實驗一、哈夫曼編/譯碼器學(xué)生姓名:XXX系 別:XXX專 業(yè):XXX班 級:XXX學(xué) 號:XXX指導(dǎo)教師:XXXXXX_2012年6月21日學(xué)院程設(shè)計任務(wù)書題目 一、赫夫曼編譯碼器專業(yè)、班級xxx學(xué)號 xxx 姓名 xxx主要內(nèi)容、基本要求、主要參考資料等:主要內(nèi)容利用哈夫曼編碼進(jìn)行信息通信可大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼;在接收端將傳來的數(shù)據(jù)進(jìn)行譯碼(復(fù)原)。對于雙工信道(既可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼的編/譯碼系統(tǒng)。精品文檔放心下載基本要求系統(tǒng)應(yīng)具有以下功能:(1)C:編碼(Coding)。對文件tobetrans中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile中,將以此建好的哈夫曼樹存入文件HuffmanTree中感謝閱讀(2)D:解碼(Decoding)。利用已建好的哈夫曼樹將文件codefile中的代碼進(jìn)行譯碼,結(jié)果存入textfile中。精品文檔放心下載_(3)P:打印代碼文件(Print)。將文件codefile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件codeprint中。精品文檔放心下載(4)T:打印哈夫曼樹(TreePrinting)。將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件treeprint中。感謝閱讀3.參考資料:數(shù)據(jù)結(jié)構(gòu)(C語言版)嚴(yán)蔚敏、吳偉民編著;謝謝閱讀數(shù)據(jù)結(jié)構(gòu)標(biāo)準(zhǔn)教程胡超、閆寶玉編著完 成 期 限:2012年6月21 日指導(dǎo)教師簽名:課程負(fù)責(zé)人簽名:2012年 6月 21日一、設(shè)計題目(任選其一)實驗一、哈夫曼編/譯碼器二、實驗?zāi)康撵柟毯图由顚?shù)據(jù)結(jié)構(gòu)的理解,提高綜合運用本課程所學(xué)知識的能力;感謝閱讀深化對算法課程中基本概念、理論和方法的理解;鞏固構(gòu)造赫夫曼樹的算法;設(shè)計試驗用程序?qū)嶒灪辗蚵鼧涞臉?gòu)造。三、運行環(huán)境(軟、硬件環(huán)境)Windowsxpsp3,VisualC++6.0英文版精品文檔放心下載_四、算法設(shè)計的思想(1)初始化赫夫曼樹,輸入文件tobetrans.txt中各字符及其權(quán)值,并保存于hfmtree.txt文件中謝謝閱讀(2)編碼(Coding)。對文件tobetrans中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile中精品文檔放心下載(3)D:解碼(Decoding)。利用已建好的哈夫曼樹將文件codefile中的代碼進(jìn)行譯碼,結(jié)果存入textfile中。感謝閱讀(4)P:打印代碼文件(Print)。將文件codefile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件codeprint中。感謝閱讀(5)T:打印哈夫曼樹(TreePrinting)。將已在內(nèi)存中的哈夫曼樹以直觀的方式顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件treeprint中。感謝閱讀五、流程圖_六、算法設(shè)計分析1.赫夫曼樹節(jié)點的數(shù)據(jù)類型定義為:typedefstruct{//赫夫曼樹的結(jié)構(gòu)體charch;感謝閱讀intweight; //權(quán)值intparent,lchild,rchild;}HTNode,*HuffmanTree;voidHuffmanCoding(HuffmanTree&,char*,int*,int);建立赫夫曼樹的算法,此函數(shù)塊調(diào)用了Select()函數(shù)。voidselect(HuffmanTreeHT,intj,int*x,int*y);從已建好的赫夫曼樹中選擇parent為0,weight最小的兩個結(jié)點。感謝閱讀3.利用已建好的哈夫曼樹從文件hfmtree.txt中讀入,對文件中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile.txt中。精品文檔放心下載coding編碼功能:對輸入字符進(jìn)行編碼Decoding譯碼功能:利用已建好的哈夫曼樹將文件codefile.txt中的代碼進(jìn)行譯碼,結(jié)果存入文件textfile.txt中。謝謝閱讀Print()打印功能函數(shù):輸出哈夫曼樹以及對應(yīng)的編碼。精品文檔放心下載七、源代碼//////////////////////////////////////////////////////////////////////////////感謝閱讀_////////////#include<stdio.h>#include<stdlib.h>#include<string.h>//定義赫夫曼樹結(jié)點的結(jié)構(gòu)體typedefstruct{charch; //增加一個域,存放該節(jié)點的字符intweight;intparent,lchild,rchild;}HTNode,*HuffmanTree;typedefchar**HuffmanCode; //指向赫夫曼編碼的指針謝謝閱讀voidtips(); //打印操作選擇界面voidHuffmanCoding(HuffmanTree&,char*,int*,int); //建立赫夫曼精品文檔放心下載樹的算法voidselect(HuffmanTreeHT,intj,int*x,int*y); //從已建好的赫夫曼謝謝閱讀樹中選擇parent為0,weight最小的兩個結(jié)點精品文檔放心下載voidInit();voidCoding(); //編碼voidDecoding(); //譯碼voidPrint_code(); //打印譯碼好的代碼謝謝閱讀_voidPrint_tree(); //打印哈夫曼樹感謝閱讀intRead_tree(HuffmanTree&);//從文件中讀入赫夫曼樹精品文檔放心下載voidfind(HuffmanTree&HT,char*code,char*text,inti,intm); //譯碼感謝閱讀時根據(jù)01字符串尋找相應(yīng)葉子節(jié)點的遞歸算法voidConvert_tree(unsignedcharT[100][100],ints,int*i,intj); //將內(nèi)謝謝閱讀存中的赫夫曼樹轉(zhuǎn)換成凹凸表形式的赫夫曼樹HuffmanTreeHT; //全局變量intn=0; //全局變量,存放赫夫曼樹葉子結(jié)點的數(shù)目感謝閱讀intmain(){charselect;while(1){tips();scanf("%c",&select);switch(select) //選擇操作,根據(jù)不同的序號選擇不同的操作精品文檔放心下載{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("--請選擇操作--\n");printf("-----------------------------------------------------\n");printf("\n");printf("---------------------1初始化赫夫曼樹---------------\n");printf("---------------------2編碼---------------\n");printf("---------------------3譯碼---------------\n");printf("---------------------4打印代碼文件---------------\n");printf("---------------------5打印赫夫曼樹---------------\n");printf("---------------------0退出---------------\n");printf("-----------------------------------------------------\n");}//初始化函數(shù),輸入n個字符及其對應(yīng)的權(quán)值,根據(jù)權(quán)值建立哈夫曼樹,并謝謝閱讀將其存于文件hfmtree中voidInit(){FILE*fp;_inti,n,w[52]; //數(shù)組存放字符的權(quán)值謝謝閱讀charcharacter[52]; //存放n個字符謝謝閱讀printf("\n輸入字符個數(shù)n:");scanf("%d",&n); //輸入字符集大小printf("輸入%d個字符及其對應(yīng)的權(quán)值:\n",n);精品文檔放心下載for(i=0;i<n;i++){charb=getchar();scanf("%c",&character[i]);精品文檔放心下載scanf("%d",&w[i]); //輸入n個字符和對應(yīng)的權(quán)值感謝閱讀}HuffmanCoding(HT,character,w,n); //建立赫夫曼樹精品文檔放心下載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)//將建立的赫夫曼樹存入文件hfmtree.txt中感謝閱讀printf("Filewriteerror!\n");精品文檔放心下載}printf("\n赫夫曼樹建立成功,并已存于文件hfmtree.txt中\(zhòng)n");精品文檔放心下載_fclose(fp);}//建立赫夫曼樹的算法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最小的兩個結(jié)點,用x和y返回其序號謝謝閱讀voidselect(HuffmanTreeHT,intj,int*x,int*y)感謝閱讀{inti;//查找weight最小的結(jié)點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é)點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;}//對文件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中讀入赫夫曼樹,返回葉子結(jié)點數(shù)感謝閱讀//求赫夫曼樹中各葉子節(jié)點的字符對應(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);//從文件讀入第一個字符while(!feof(fp))謝謝閱讀_{for(i=1;i<=n;i++)if(HT[i].ch==temp)break; //在赫夫曼樹中查找字符所在的位置感謝閱讀for(intr=0;HC[i][r]!='\0';r++) //將字符對應(yīng)的編碼存入文件精品文檔放心下載fputc(HC[i][r],fw);fscanf(fp,"%c",&temp); //從文件讀入下一個字符謝謝閱讀}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中讀入赫夫曼樹,返回葉子結(jié)點數(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); //從文件讀入一個字符謝謝閱讀for(i=1;!feof(fp);i++){code=(char*)realloc(code,(i+1)*sizeof(char)); //增加空間感謝閱讀fscanf(fp,"%c",&code[i]); //從文件讀入下一個字符感謝閱讀}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é)點的左子樹去找else感謝閱讀find(HT,code,text,HT[m].rchild,m); //從根節(jié)點的右子樹去找謝謝閱讀_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個代碼。同時將此字符形式的編碼文件寫入文件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); //從文件讀入一個字符謝謝閱讀for(i=1;!feof(fp);i++){printf("%c",temp);if(i%50==0)printf("\n");fputc(temp,fw); //將該字符存入文件codeprint.txt中謝謝閱讀fscanf(fp,"%c",&temp); //從文件讀入一個字符精品文檔放心下載}printf("\n\n已將此字符形式的編碼寫入文件codeprint.txt中!\n\n");感謝閱讀fclose(fp);fclose(fw);}//將已在內(nèi)存中的哈夫曼樹顯示在屏幕上,并將此字符形式的哈夫曼樹寫入文感謝閱讀件treeprint中。voidPrint_tree(){_unsignedcharT[100][100];謝謝閱讀inti,j,m=0;FILE*fp;if(n==0)n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結(jié)點數(shù)感謝閱讀Convert_tree(T,0,&m,2*n-1);//將內(nèi)存中的赫夫曼樹轉(zhuǎn)換成凹凸表形式的樹,存于數(shù)組T中感謝閱讀if((fp=fopen("treeprint.txt","wb+"))==NULL)printf("Openfiletreeprint.txterror!\n");printf("\n打印已建好的赫夫曼樹:\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已將該字符形式的哈夫曼樹寫入文件treeprint.txt中!\n\n");精品文檔放心下載}//從文件hfmtree.txt中讀入赫夫曼樹,返回葉子節(jié)點數(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);//讀入一個節(jié)點信息謝謝閱讀}fclose(fp);n=(i-1)/2;returnn;_}//譯碼時根據(jù)01字符串尋找相應(yīng)葉子節(jié)點的遞歸算法感謝閱讀voidfind(HuffmanTree&HT,char*code,char*text,inti,intm)謝謝閱讀{if(*code!='\0') //若譯碼未結(jié)束{code++;if(HT[i].lchild==0&&HT[i].rchild==0) //若找到葉子節(jié)點精品文檔放心下載{*text=HT[i].ch; //將葉子節(jié)點的字符存入text中精品文檔放心下載text++;if((*code=='0'))find(HT,code,text,HT[m].lchild,m); //從根節(jié)點的左子樹找謝謝閱讀elsefind(HT,code,text,HT[m].rchild,m); //從根節(jié)點的右子樹找謝謝閱讀}else //如果不是葉子節(jié)點_if(*code=='0')find(HT,code,text,HT[i].lchild,m);//從該節(jié)點的左子樹去找else精品文檔放心下載find(HT,code,text,HT[i].rchild,m); //從該節(jié)點的右子樹去找感謝閱讀}else*text='\0';//譯碼結(jié)束}//將文件中的赫夫曼樹轉(zhuǎn)換成凹凸表形式的赫夫曼樹打印出來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';}//////////////////////////////////////////////////////////////////////////////謝謝閱讀////////////////////八、運行結(jié)果分析截圖說明:1、運行后界面如圖(1):圖(1)選擇要選擇的操作序號可以運行各個步驟;2、初始化赫夫曼樹:輸入tobetrans.txt中各元素及其出現(xiàn)頻率,如圖(2)感謝閱讀_圖(2)3、編碼及譯碼,如圖(3)圖(3)4、打印編碼文件,如圖(4)_圖(4)5、打印赫夫曼樹,如圖(5)圖(5)6、各步驟所存的文件內(nèi)容如圖(6)_圖(6)九、收獲及體會課程設(shè)計是讓我們充分利用我們專業(yè)課程所學(xué)知識的機(jī)會,也是我們邁向社謝謝閱讀會,從事工作前一個必不少的過程。通過這次課程設(shè)計,我深深體會到將知識運謝謝閱讀用到實踐中的重要作用。我這兩天的課程設(shè)計,是讓我學(xué)會腳踏實地邁開這一步,精品文檔放心下載也是為明天能穩(wěn)健地在社會大潮中奔跑打下堅實的基礎(chǔ)。我的課程設(shè)計題目是赫夫曼編譯碼器。最初做這個程序的時候,讓我覺得完謝謝閱讀成這次程序設(shè)計真的是太難了,然后我查閱了課本,并去圖書館借了資料,在寫精品文檔放心下載這個程序的時候也參考了網(wǎng)上的設(shè)計流程,寫完剛運行時出現(xiàn)了很多問題。尤其精品文檔放心下載是編碼錯誤,導(dǎo)致內(nèi)存無法read,通過同組人員的交流請教,逐漸明白過來,精品文檔放心下載然后經(jīng)過不知道多少次修改才順利運行。本次試驗也讓我明白了理論與實際相結(jié)精品文檔放心下載合的重要性,并提高了自己組織數(shù)據(jù)及編寫大型程序的能力,培養(yǎng)了基本的、良謝謝閱讀_好的程序設(shè)計技能以及合作能力。通過對各個步驟各個流程的控制,逐漸讓我精品文檔放心下載產(chǎn)生了興趣,在實際編寫過程中,和同學(xué)們相互討論讓我學(xué)到的不僅僅是一些解精品文檔放心下載決問題的方法,更是解決問題的思想。課程設(shè)計本身也是一種相互學(xué)習(xí)的過謝謝閱讀程,//////////////////////////////////////////////////////////////////////////////謝謝閱讀/////////////////////////////////////////////////////////感謝閱讀#include<stdio.h>#include<stdlib.h> //為exit()提供原型謝謝閱讀#include<string.h>//哈夫曼樹結(jié)點的結(jié)構(gòu)typedefstruct{charch;
//該字符域用于存放節(jié)點的關(guān)鍵字intweight;intparent,lchild,rchild;感謝閱讀}HTNode, *HuffmanTree;
//動態(tài)分配數(shù)組存儲哈夫曼樹typedefchar**HuffmanCode; //動態(tài)分配數(shù)組存儲哈夫曼編碼表感謝閱讀voidMenu(); //顯示菜單voidHuffmanCoding(HuffmanTree&HT,char*character,int*w,intn); //建立哈夫曼樹謝謝閱讀voidselect(HuffmanTreeHT,intj,int*x,int*y); //從已建好的赫夫曼樹中選擇parent為0,謝謝閱讀weight最小的兩個結(jié)點voidInit();_voidCoding(); //編碼voidDecoding(); //譯碼voidPrint_code(); //打印譯碼好的代碼感謝閱讀voidPrint_tree(); //打印哈夫曼樹精品文檔放心下載intRead_tree(HuffmanTree&);//從文件中讀入赫夫曼樹謝謝閱讀voidfind(HuffmanTree&HT,char*code,char*text,inti,intm); //譯碼時根據(jù)01字符串尋找謝謝閱讀相應(yīng)葉子節(jié)點的遞歸算法voidConvert_tree(unsignedcharT[100][100],ints,int*i,intj); //將內(nèi)存中的赫夫曼樹轉(zhuǎn)換成謝謝閱讀凹凸表形式的赫夫曼樹HuffmanTreeHT; //全局變量intn=0; //全局變量,存放赫夫曼樹葉子結(jié)點的數(shù)目感謝閱讀intmain(){charselect;while(1){Menu();scanf("%c",&select);switch(select) //選擇操作,根據(jù)不同的序號選擇不同的操作感謝閱讀_{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("--請選擇操作--\n");printf("-----------------------------------------------------\n");printf("\n");printf("---------------------1初始化赫夫曼樹---------------\n");printf("---------------------2編碼---------------\n");printf("---------------------3譯碼---------------\n");printf("---------------------4打印代碼文件---------------\n");printf("---------------------5打印赫夫曼樹---------------\n");printf("---------------------0退出---------------\n");printf("-----------------------------------------------------\n");}//初始化函數(shù),輸入n個字符及其對應(yīng)的權(quán)值,根據(jù)權(quán)值建立哈夫曼樹,并將其存于文件hfmtree感謝閱讀中_voidInit(){FILE*fp;inti,n,w[52]; //數(shù)組存放字符的權(quán)值感謝閱讀charcharacter[52]; //存放n個字符謝謝閱讀printf("\n輸入字符個數(shù)n:");scanf("%d",&n); //輸入字符集大小謝謝閱讀printf("輸入%d個字符及其對應(yīng)的權(quán)值:\n",n);謝謝閱讀for(i=0;i<n;i++){charb=getchar();scanf("%c",&character[i]);感謝閱讀scanf("%d",&w[i]); //輸入n個字符和對應(yīng)的權(quán)值謝謝閱讀}HuffmanCoding(HT,character,w,n); //建立赫夫曼樹精品文檔放心下載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) //將建立的赫夫曼樹存入文件謝謝閱讀hfmtree.txt中_printf("Filewriteerror!\n");謝謝閱讀}printf("\n赫夫曼樹建立成功,并已存于文件hfmtree.txt中\(zhòng)n");感謝閱讀fclose(fp);}//構(gòu)造哈夫曼樹的算法voidHuffmanCoding(HuffmanTree&HT,char*character,int*w,intn)謝謝閱讀{ //w存放n個字符的權(quán)值(均>0),構(gòu)造哈夫曼樹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最小的兩個結(jié)點,用x和y返回其序號精品文檔放心下載voidselect(HuffmanTreeHT,intj,int*x,int*y)謝謝閱讀{inti;//查找weight最小的結(jié)點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é)點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;}//對文件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中讀入赫夫曼樹,返回葉子結(jié)點數(shù)謝謝閱讀//求赫夫曼樹中各葉子節(jié)點的字符對應(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); //從文件讀入第一個字符精品文檔放心下載while(!feof(fp)){for(i=1;i<=n;i++)if(HT[i].ch==temp)break; //在赫夫曼樹中查找字符所在的位置感謝閱讀for(intr=0;HC[i][r]!='\0';r++) //將字符對應(yīng)的編碼存入文件精品文檔放心下載fputc(HC[i][r],fw);fscanf(fp,"%c",&temp); //從文件讀入下一個字符精品文檔放心下載}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中讀入赫夫曼樹,返回葉子結(jié)點數(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); //從文件讀入一個字符感謝閱讀for(i=1;!feof(fp);i++)精品文檔放心下載{code=(char*)realloc(code,(i+1)*sizeof(char)); //增加空間謝謝閱讀fscanf(fp,"%c",&code[i]); //從文件讀入下一個字符精品文檔放心下載}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é)點的左子樹去找精品文檔放心下載elsefind(HT,code,text,HT[m].rchild,m); //從根節(jié)點的右子樹去找感謝閱讀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個代碼。同時將此字符形式的編碼文件寫入文謝謝閱讀件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); //從文件讀入一個字符感謝閱讀for(i=1;!feof(fp);i++)謝謝閱讀{printf("%c",temp);if(i%50==0)printf("\n");感謝閱讀fputc(temp,fw); //將該字符存入文件codeprint.txt中感謝閱讀fscanf(fp,"%c",&temp); //從文件讀入一個字符謝謝閱讀}printf("\n\n已將此字符形式的編碼寫入文件codeprint.txt中!\n\n");感謝閱讀fclose(fp);fclose(fw);_}//將已在內(nèi)存中的哈夫曼樹顯示在屏幕上,并將此字符形式的哈夫曼樹寫入文件treeprint中。謝謝閱讀voidPrint_tree(){u
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 語文高一迎期末系列專欄001期-名篇名句默寫(學(xué)生版)
- 感恩節(jié)活動方案(集錦15篇)
- 愚人節(jié)個人心得
- 賓館年終工作總結(jié)(匯編15篇)
- 初級會計實務(wù)-《初級會計實務(wù)》模考試卷651
- 智研咨詢發(fā)布:2024年中國高壓電纜行業(yè)競爭格局及發(fā)展前景研究報告
- 2024年中國食品安全檢測行業(yè)市場現(xiàn)狀、前景分析研究報告(智研咨詢發(fā)布)
- 基于眼動數(shù)據(jù)和視覺信息的自閉癥篩查算法研究
- 基于車輛邊緣計算的車-邊協(xié)同跨區(qū)任務(wù)卸載與資源分配技術(shù)研究
- 二零二五年度家校共建教育創(chuàng)新實驗區(qū)協(xié)議范本3篇
- 2024年公安機(jī)關(guān)理論考試題庫附答案【考試直接用】
- 課題申報參考:共同富裕進(jìn)程中基本生活保障的內(nèi)涵及標(biāo)準(zhǔn)研究
- 2025中國聯(lián)通北京市分公司春季校園招聘高頻重點提升(共500題)附帶答案詳解
- 康復(fù)醫(yī)學(xué)科患者隱私保護(hù)制度
- 紅色中國風(fēng)2025蛇年介紹
- 2024年安徽省高考地理試卷真題(含答案逐題解析)
- 高中學(xué)校開學(xué)典禮方案
- 產(chǎn)程中的人文關(guān)懷護(hù)理
- 2024年黑龍江農(nóng)業(yè)職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 基于數(shù)據(jù)驅(qū)動的鋰離子電池剩余使用壽命預(yù)測方法研究
- 《內(nèi)臟疾病康復(fù)》課件
評論
0/150
提交評論