C语言哈夫曼编码、译码器_第1页
C语言哈夫曼编码、译码器_第2页
C语言哈夫曼编码、译码器_第3页
C语言哈夫曼编码、译码器_第4页
C语言哈夫曼编码、译码器_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include#include#include#include#include/typedefintTElemType;constintUINT_MAX=1000;typedefstructintweight;intparent,lchild,rchild;HTNode,*HuffmanTree;typedefchar*HuffmanCode;/全局变量HuffmanTreeHT;HuffmanCodeHC;int*w,i,j,n;char*z;intflag=0;intnumb=0;/求赫夫曼编码intmin(HuffmanTreet,inti)/函数voidselect()调用intj,

2、flag;intk=UINT_MAX;/取k为不小于可能的值for(j=1;j=i;j+)if(tj.weights2)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;/检测结点数是否可以构成树m=2*n-1;HT=(HuffmanTree)malloc(

3、m+1)*sizeof(HTNode);/0号单元未用for(p=HT+1,i=1;iweight=*w;p-parent=0;p-lchild=0;p-rchild=0;for(;iparent=0;for(i=n+1;i=m;+i)/建赫夫曼树/在HT1i-1中选择parent为0且weight最小的两个结点,其序号分别为si和s2select(HT,i-1,s1,s2);HTs1.parent=HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;/从叶子到根逆向求每个字符的赫夫曼编码HC

4、=(HuffmanCode)malloc(n+1)*sizeof(char*);/分配n个字符编码的头指针向量(0不用)cd=(char*)malloc(n*sizeof(char);/分配求编码的工作空间cdn-1=0;/编码结束符for(i=1;i=n;i+)/逐个字符求赫夫曼编码start=n-1;/编码结束符位置for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent)/从叶子到根逆向求编码if(HTf.lchild=c)cd-start=0;elsecd-start=1;HCi=(char*)malloc(n-start)*sizeof(char);/为第

5、i个字符编码分配空间strcpy(HCi,&cdstart);/从cd复制编码(串)到HCfree(cd);/释放工作空间/初始化赫夫曼链表voidInitialization()flag=1;intnum;intnum2;cout下面初始化赫夫曼链表endlnum;n=num;w=(int*)malloc(n*sizeof(int);z=(char*)malloc(n*sizeof(char);coutn请依次输入n个字符(字符型)n注意:必须以回车结束:endl;charbase2;for(i=0;in;i+)cout第i+1个字符:endl;gets(base);*(z+i)=*base

6、;for(i=0;i=n-1;i+)coutsetw(6)*(z+i);coutn请依次输入n个权值(n注意:必须以回车结束):endl;for(i=0;i=n-1;i+)coutendl第i+1num2;*(w+i)=num2;HuffmanCoding(HT,HC,w,n);/打印编码cout字符对应的编码为:endl;for(i=1;i=n;i+)/coutvv字符vv*(z+i-l)vv的编码;puts(HCi);/将赫夫曼编码写入文件cout下面将赫夫曼编码写入文件endlendl;FILE*htmTree;charr=,0;if(htmTree=fopen(htmTree.txt,

7、w)=NULL)coutcannotopenfileendl;return;fputs(z,htmTree);for(i=0;in+l;i+)fprintf(htmTree,%6d,*(w+i);fputs(r,htmTree);for(i=l;i=n;i+)fputs(HCi,htmTree);fputs(r,htmTree);fclose(htmTree);cout已将字符与对应编码写入根目录下文件htmTree.txt中endlendl;/获取报文并写入文件voidInputCode()/coutvv请输入你想要编码的字符vvendl;FILE*tobetran;charstrl00;i

8、f(tobetran=fopen(tobetran.txt,w)=NULL)coutvv不能打开文件vvendl;return;cout请输入你想要编码的字符endl;gets(str);fputs(str,tobetran);cout获取报文成功endl;fclose(tobetran);/编码函数voidEncoding()cout下面对目录下文件tobetran.txt中的字符进行编码endl;FILE*tobetran,*codefile;if(tobetran=fopen(tobetran.txt,rb)=NULL)cout不能打开文件endl;if(codefile=fopen(c

9、odefile.txt,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;jn)cout字符错误,无法编码!endl;break;cout编码工作完成endl编码写入目录下的codefile.txt中endlendl;fclose(tobetran);fclose(codefile);free(tran)

10、;/译码函数voidDecoding()cout下面对根目录下文件codefile.txt中的字符进行译码endl;FILE*codef,*txtfile;if(txtfile=fopen(Textfile.txt,w)=NULL)cout不能打开文件endl;/txtfile=fopen(Textfile.txt,w);if(codef=fopen(codefile.txt,r)=NULL)cout不能打开文件endl;/codef=fopen(codefile.txt,r);char*work,*work2,i2;inti4=0,i,i3;unsignedlonglength=10000;

11、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(HTi3.lchild=0)*(work2+i4)=*(z+i3-1);i4+;i3=2*n-1;i-;elseif(i2=0)i3=HTi3.lchild;elseif(i2=1)i3=HTi3.rchild;*(work2+i4)=0;fputs(work2,txtfile);cout

12、译码完成endl内容写入根目录下的文件txtfile.txt中endlendl;coutwork2;free(work);free(work2);fclose(txtfile);fclose(codef);/打印赫夫曼树的函数voidcoprint(HuffmanTreestart,HuffmanTreeHT)if(start!=HT)FILE*TreePrint;if(TreePrint=fopen(TreePrint.txt,a)=NULL)cout创建文件失败rchild,HT);coutsetw(5*numb)weightweight);coprint(HT+start-lchild,

13、HT);numb-;fclose(TreePrint);voidTree_printing(HuffmanTreeHT,intw)HuffmanTreep;p=HT+w;cout下面打印赫夫曼树endl;coprint(p,HT);cout打印工作结束endl;/主函数voidmain()charchoice;while(choice!=q)cout赫夫曼编码解码系统endl;cout1.要初始化赫夫曼链表请输入endl;cout2.要编码请输入eendl;cout3.要译码请输入dendl;cout4.要打印编码请输入pendl;cout5.要打印赫夫曼树请输入fendl;cout6.要离开

14、请输入qchoice;switch(choice)casei:Initialization();break;casew:InputCode();break;casee:Encoding();break;cased:Decoding();break;caset:Tree_printing(HT,2*n-1);break;caseq:default:coutinputerrorendl;free(z);free(w);free(HT);运行结果:赫夫曼编码解码系统1.要初始化赫夫曼链表请输入丫2要编码请输入03要译码请输入d4要打印编码请输入p5要打印赫夫曼树请输入t6要离开请输入qi下面初始化赫

15、夫曼链表数请输入结点的个n:8请依次输入8个字符(字符型)注意:必须以回车结束:第1个字符:a第2个字符:b第3个字符:c第4个字符:d第5个字符:e第6个字符:f第7个字符:g第8个字符:habcdefgh请依次输入8个权值(注意:必须以回车结束):第1个字符的权值:5第2个字符的权值:29x第3个字符的权值:7第4个字符的权值:8第5个字符的权值:14第6个字符的权值:23第7个字符的权值:3第8个字符的权值:11字符对应的编码为:01101011101111110000111010下面将赫夫曼编码写入文件已将字符与对应编码写入根目录下文件htmTree.txt中赫夫曼编码解码系统1.要初

16、始化赫夫曼链表请输入i2要编码请输入03要译码请输入d4要打印编码请输入p5要打印赫夫曼树请输入t6要离开请输入qi下面初始化赫夫曼链表数请输入结点的个n:27请依次输入27个字符(字符型)注意:必须以回车结束:第1个字符:第2个字符:a第3个字符:bx第4个字符:c第5个字符:d第6个字符:e第7个字符:f第8个字符:g第9个字符:h第10个字符:i第11个字符:j第12个字符:k第13个字符:l第14个字符:m第15个字符:n第16个字符:o第17个字符:p第18个字符:q第19个字符:r第20个字符:s第21个字符:t第22个字符:u第23个字符:v第24个字符:w第25个字符:第26个字符:y第27个字符:zabcdefgmnopqrstz请依次输入27个权值(注意:必须以回车结束)第1个字符的权值:186第2个字符的权值:64第3个字符的权值:13第4个字符的权值:22第5个字符的权值:32第6个字符的权值:103第7个字符的权值:21第8个字符的权值:15第9个字符的权值:47第10个字符的权值:57第11个字符的权值:1第12个字符的权值:5第13个字符的权值:32第14个字符的权值:20第15个字符的权值:57第16个字符的权值:63第17个字符的权值:15第18个字符的权值:1第19个字符的权值:48第20个字符的权值:51第21个字符的权值:80第22个字符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论