哈夫曼编解码完整c程序代码_第1页
哈夫曼编解码完整c程序代码_第2页
哈夫曼编解码完整c程序代码_第3页
哈夫曼编解码完整c程序代码_第4页
哈夫曼编解码完整c程序代码_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、1)内容:利用 Huffman编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据进行预先编码,在接收端进行解码。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编 / 解码系统。2)要求:一个完整的 huffman 编解码系统应该具有以下功能:初始化( Initialization)。从终端读入字符集大小n,以及 n个字符和 n个权值,建立Huffman 树,并将它存入 hfmTree 中。编码( Encoding )。利用已经建好的Huffman 树(如果不在内存,则应从文件 hfmTree中读取),对文件 To

2、BeTran中的正文进行编码, 然后将结果存入文件hfmTree 中读取),对文件 ToBeTran中的正文进行编码,然后将结果存入文件CodeFile 中。解码( Decoding )。利用已经建立好的Huffman 树将文件 CodeFile 中的代码进行解码,结果存入 TextFile中。打印代码文件( Print)。将文件 CodeFile 以紧凑的格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint 中。打印 Huffman 树( Tree Printing)。将已经在内存中的Huffman 树以直观的形式 (树或者凹入的形式) 显示在终端上, 同时

3、将此字符形式的Huffman 树写入文件 TreePrint中。3)测试数据 :用下表给出的字符集和频度的实际统计数据建立Huffman 树,并对以下报文进行编码和译码: “THIS PROGRAM IS MY FAVORITE”。字符ABCDEFGHIJKLM频度1866413223210321154757153220字符NOPQRSTUVWXYZ频度5763151485180238181161完整代码如下:#include#include#include#define N 100int *w;char *c,stackN,codeNN;int s1,s2;typedef struct Hu

4、ffmanTreeint weight;int parent;int lchild;int rchild;HuffmanTree,*Huff;void menu(void);void Select(struct HuffmanTree HT,int i);void HuffmanTree(Huff &HT,int *w,int n);void visite(Huff HT,int i,int flag,int rear);void translatef(char *scource,char *save,int n);bool uncodef(FILE *fp1,FILE *fp2,Huff H

5、T,int n);int inputHuff();void screanio(int n);void fileio(int n);int initHuff();void Print_tree(int n,Huff HT);void Convert_tree(Huff HT,unsigned char T100100,int tt100100,int s,int *i,int j); void decoding(int n);void coding(int n);void main()int n=0;menu();Huff HT;char state;dostd:coutstate;fflush

6、(stdin);/ 读取状态switch(state)caseI:n=inputHuff();HuffmanTree(HT,w,n);std:coutnHuffmanTree初始化完毕n;break;caseC:coding(n);break;caseD:decoding(n);break;caseP:Print_tree(n,HT);break;caseQ:break;while(state!=Q);void menu()/ 显示菜单函数std:cout=HuffmanCoding=n;std:coutinput tt don;std:coutI ttInit_HUffTreen;/ 初始化

7、huffmantreestd:coutC ttCodingn;/ 对ToBeTran.txt文件中的字符进行编码到CodeFile.txt中std:coutD ttUnCodingn;/ 对CodeFile.txt中的01 序列进行解码到TextFile.txtstd:coutP ttPrintTreen;/ 打印哈夫曼树std:coutQ ttquitn;std:cout 请初始化哈夫曼树再执行后面的操作n;int inputHuff()/ 输入各个字母及其权值int i=1,n=0;int ww28;char cc28;while(1)std:coutinput the letter(in

8、put # to stop):;cci=std:cin.get();fflush(stdin);if(cci=#)break;std:coutwwi;fflush(stdin);n+;i+;w=(int *)malloc(sizeof(int)*(n+1);c=(char *)malloc(sizeof(char)*(n+1);for(i=0;in+1;i+)wi=wwi;ci=cci;return n;void HuffmanTree(Huff &HT,int *w,int n)/ 初始化哈夫曼树int m,i;m=n*2-1;HT=(struct HuffmanTree *)malloc(

9、sizeof(struct HuffmanTree)*(m+1); HT0.lchild=0;HT0.parent=0;HT0.rchild=0;HT0.weight=0;for(i=1;im;i+)HTi.weight=i=n?wi:0;HTi.lchild=HTi.rchild=HTi.parent=0;for(i=n+1;i=m;i+)Select(HT,i);HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;HTs1.parent=HTs2.parent=i;void Select(struct Huffman

10、Tree HT,int i) / 在 HT1.i-1 中选择 parent 为 0 且 weight 为最小的两个结点int j;for(j=1;ji;j+)if(HTj.parent =0)s1=j;s2=j;goto flag;flag:for(j=s1+1;j=HTj.weight)s2=s1;s1=j;if(HTs2.weightHTj.weight&j!=s1)s2=j;if(s1=s2)s2=j;void Print_tree(int n,Huff HT)/ 以凹入法的形式打印树unsigned char T100100;int tt100100;int i,j,m=0;FILE

11、*fp;Convert_tree(HT,T,tt,0,&m,2*n-1); /将内存中的赫夫曼树转换成凹凸表形式的树,存于数组 T 中 if(fp=fopen(treeprint.txt,wb+)=NULL)printf(Open file treeprint.txt error!n);printf(n以凹凸表形式打印已建好的赫夫曼树:n);for(i=1;i=2*n-1;i+)for (j=0;Tij!=0;j+)if(Tij= ) printf( );fputc(Tij,fp);elseprintf(%d,ttij);fprintf(fp,%dnnn,ttij);printf(n);fcl

12、ose(fp);printf(nprintf(n此字符形式的哈夫曼树已写入文件treeprint.txt中 .nn);文件 treeprint.txt的打开方式要为写字板,若打开方式为记事本,则无法显示凹凸表的形式 n);void Convert_tree(Huff HT,unsigned char T100100,int tt100100,int s,int *i,int j) /将内存中的赫夫曼树转换成凹凸表形式的树,存于数组T 中int k,l;l=+(*i);for(k=0;ks;k+)Tlk= ;Tlk=#;ttlk=HTj.weight;if(HTj.lchild)Convert_

13、tree(HT,T,tt,s+1,i,HTj.lchild);if(HTj.rchild)Convert_tree(HT,T,tt,s+1,i,HTj.rchild);Tl+k=0;void coding(int n)码到 CodeFile.txt/ 对文件ToBeTran.txt编FILE *fp1;Huff HT;HuffmanTree(HT,w,n);visite(HT,2*n-1,2,0);fflush(stdin);translatef(ToBeTran.txt,CodeFile.txt,n);fp1=fopen(CodeFile.txt,r);printf(n编码已写入文件tree

14、print.txt中 .n);fclose(fp1);void decoding(int n) / 对 CodeFile.txt 中的 01 序列进行解码到 TextFile.txtFILE *fp1,*fp2;Huff HT;HuffmanTree(HT,w,n);fp1=fopen(CodeFile.txt,r);fp2=fopen(TextFile.txt,w);while(uncodef(fp1,fp2,HT,2*n-1);printf(n);printf(n解码已写入文件fclose(fp1);fclose(fp2);TextFile.txt 中 .n);void visite(Hu

15、ff HT,int i,int flag,int rear)/ 通过递归调用 visite() 函数,得到各个字母的编码,存储于全局变量 code 中int j=0,k=0;if(flag=0)stackrear=0;rear+;else if(flag=1)stackrear=1;rear+;if(HTi.lchild=0)for(j=0;jrear;j+)codeij=stackj;codeij=#;rear-;return;visite(HT,HTi.lchild,0,rear);visite(HT,HTi.rchild,1,rear);k=rear;for(j=0;jk;j+)code

16、ij=stackj;codeij=#;rear-;return;void translatef(char *scource,char *save,int n)/读取文件中的字母序列,并根据code 将其转换成 01 序列输出FILE *fp1,*fp2;char p= ;int i=0,j=0,k=0;fp1=fopen(scource,r);fp2=fopen(save,w);p=fgetc(fp1);printf(n得到的编码为:n);while(p!=EOF)for(i=0;i=n;i+)if(ci=p)for(j=0;j=50)k=0;putchar(n);p=fgetc(fp1);fclose(fp1);fclose(fp2);bool uncodef(FILE *fp1,FILE *fp2,Huff HT,int n)/通过对树的访问,把文件中01 序列转换成一个字母输出。本函数需循环调用,当读到n 时返回 falsechar p= ;if(!fp1|!fp2)printf(error);exit(0);if(HTn.lchild=0)fputc(cn,fp2);return true;elsep=fge

温馨提示

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

评论

0/150

提交评论