




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1)内容: 利用 Huffman 编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据进行预先编码,在接收端进行解码。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/解码系统。 2)要求: 一个完整的huffman编解码系统应该具有以下功能: 初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立Huffman 树,并将它存入hfmTree 中。 编码(Encoding)。利用已经建好的Huffman树(如果不在内存,则应从文件hfmTree中读取),对文件ToBeTran中的正文进行编码,然后将结果存入文件hfmTree中读取),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 解码(Decoding)。利用已经建立好的Huffman树将文件CodeFile中的代码进行解码,结果存入TextFile中。 打印代码文件(Print)。将文件CodeFile以紧凑的格式显示在终端上,每行 50 个代码。同时将此字符形式的编码文件写入文件CodePrint中。 打印Huffman树(Tree Printing)。将已经在内存中的Huffman树以直观的形式(树或者凹入的形式)显示在终端上,同时将此字符形式的Huffman 树写入文件TreePrint中。3) 测试数据: 用下表给出的字符集和频度的实际统计数据建立Huffman树,并对以下报文进行编码和译码:“THIS PROGRAM IS MY FAVORITE”。字符 A B C D E F G H I J K L M 频度 186 64 13 22 32 10321 15 47 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1 完整代码如下:#include#include#include#define N 100int *w;char *c,stackN,codeNN;int s1,s2;typedef struct HuffmanTreeint 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 HT,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(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; /初始化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(input # 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(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 HuffmanTree 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 *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); else printf(%d,ttij);fprintf(fp,%dnnn,ttij); printf(n); fclose(fp); printf(n此字符形式的哈夫曼树已写入文件treeprint.txt中.nn); printf(n文件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_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) /对文件ToBeTran.txt编码到CodeFile.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编码已写入文件treeprint.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解码已写入文件TextFile.txt中.n);fclose(fp1);fclose(fp2);void visite(Huff 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+)codeij=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;else
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年春季中国邮政储蓄银行云南省分行校园招聘模拟试卷含答案详解
- 2025广西贵港市覃塘区黄练镇储备村“两委”后备干部人选130人考前自测高频考点模拟试题及一套答案详解
- 2025年度上饶市广信区公安局面向社会公开招聘编制外聘用人员考前自测高频考点模拟试题及完整答案详解一套
- 2025年江西省中小学教师及特岗教师招聘笔试九江考区考前自测高频考点模拟试题及答案详解(考点梳理)
- 2025福建农信春季招聘声明考前自测高频考点模拟试题及参考答案详解
- 2025年春季中国邮政储蓄银行陕西省分行校园招聘考前自测高频考点模拟试题及完整答案详解
- 2025年嘉兴市秀洲区王江泾医院公开招聘编外合同制人员5人模拟试卷完整答案详解
- 2025年潍坊工商职业学院人才引进计划(70人)考前自测高频考点模拟试题及一套参考答案详解
- 2025广东中山市城市管理和综合执法局招聘雇员5人模拟试卷及答案详解一套
- 2025华东理工大学材料科学与工程学院高分子材料人工智能研发创新团队招聘(上海)考前自测高频考点模拟试题参考答案详解
- 风机叶片吊装安全培训课件
- 2025年第一期反洗钱专题培训测试题及答案
- 2026中国十九冶集团有限公司校园招聘笔试备考试题及答案解析
- 2025年保安员考试经典例题附完整答案详解(典优)
- 网络安全宣传周网络安全知识竞答考试题及答案
- 新能源电厂培训课件
- 司法局社区矫正工作汇报
- 生物安全培训上岗证课件
- 超声医疗安全风险培训课件
- 蜜蜂科普知识教学课件
- 矿山运营成本控制-洞察及研究
评论
0/150
提交评论