




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、综合实验四 哈夫曼码编、译码器的实现一、 实验名称哈夫曼码编、译码器的实现二、 实验目的1、熟练哈夫曼树的定义,掌握构造哈夫曼树的方法。2、掌握哈夫曼编码和译码方法。3、掌握文本文件的读写方法。三、 实验内容1、 实验内容:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编码、译码系统。试为这样的信息收发站写一个哈夫曼码的编码、译码系统。一个完整的系统应以下功能: (1 从终端读入字符集大小n,以及n个字符和n个权值,
2、建立哈夫曼树,并将它存放在文件hfmTree中。 (2 利用已建立好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果代码存(传输到文件CodeFile中. (3 译码(Decoding。利用已建好的哈夫曼树,对传输到达的CodeFile中的数据代码进行译码,将译码结果存入文件TextFile。(4 将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。 (5 打印印哈夫曼树(TreePrinting。将已在内存中的哈夫曼树以直观的方式(树或凹入表的形式显示在终端上,同时将此字
3、符形式的哈夫曼树写入文件TreePrint中。 (6数据结构设计根据下面给出的存储结构定义typedef struct / 定义哈夫曼树中每个结点结构体类型char ch; /结点字符信息int weight; / 定义一个整型权值变量int lchild; / 定义左、右孩子及双亲指针int rchild;int parent; HTNode;typedef HTNode HFMTMAXLEN; /用户自定义HFMT数组类型 typedef char* HfCode;/动态分配字符数组存储哈夫曼编码表 (7)基本操作的函数设计void InitHFMT(HFMT T;/初始化哈夫曼树 voi
4、d InputWeight(HFMT T,char* weightFile;/ 输入权值void SelectMin(HFMT T,int i,int *p1,int *p2;/选择所有结点中较小的结点void CreatHFMT(HFMT T;/ 构造哈夫曼树,T2*n-1为其根结点void PrintHFMT (HFMT T;/ 输出向量状态表void printHfCode(HfCode hc;/输出字符的哈夫曼编码序列HfCode hfEnCoding(HFMT T;/利用构成的哈夫曼树生成字符的编码void print_HuffmanTree(HFMT HT,int t,int i/
5、按树形形态输出哈夫曼树的形态void Encoder(char* original,char* codeFile,HfCode hc,HFMT HT;/利用已建好的哈夫曼树,对original文件中要传输的原始数据进行编码,/将编码结果存入文件codeFile中void Decoder(char* codeFile ,char* textFile,HFMT HT;/利用已建好的哈夫曼树,对传输到达的codeFile中的数据代码进行译码, /将译码结果存入文件textFile中 2、 实验要求(1)、用C语言编程实现上述实验内容中的结构定义和算法。(2)、要有main(函数,并且在main(函数
6、中使用检测数据调用上述算法。(3)、实验完成后撰写实验报告,实验报告的具体格式参见实验报告须知。(4)、实验完成后把打印好的实验报告以及电子版的实验报告和源程序一并上交。四、 参考源代码:#include #include #include #include #define MAXLEN 100typedef struct / 定义哈夫曼树中每个结点结构体类型char ch; /结点字符信息int weight; / 定义一个整型权值变量int lchild; / 定义左、右孩子及双亲指针int rchild;int parent; HTNode;typedef HTNode HFMTMAXL
7、EN; /用户自定义HFMT数组类型 typedef char* HfCode;/动态分配字符数组存储哈夫曼编码表int n;void InitHFMT(HFMT T/初始化哈夫曼树 int i;printf ("ntt请输入共有多少个权值 (小于100:"scanf ("%d",&n;getchar(;for (i=0; i<2*n-1; i+Ti.weight=0; Ti.lchild=-1;Ti.rchild=-1; Ti.parent=-1; void InputWeight(HFMT T,char* weightFile/ 输入权
8、值int w;int i;int n;char ch;FILE *fp;if (fp = fopen(weightFile, "r" != NULL fscanf(fp,"%dn",&n;for (i=0;i ch=fgetc(fp;fscanf(fp,"%dn",&w;Ti.ch=ch;Ti.weight=w; fclose(fp;void SelectMin(HFMT T, int i, int *p1,int *p2/ 选择所有结点中两个结点较小的结点long min1=999999; / 预设两个值,并使它大于
9、可能出现的最大权值long min2=999999; int j;for (j=0;j<=i;j+ if (Tj.parent=-1if (min1>Tj.weightmin1=Tj.weight; / 找出最小的权值*p1=j; / 通过*p1带回序号for (j=0;j<=i;j+ if (Tj.parent=-1 if (min2>Tj.weight && j!=(*p1 min2=Tj.weight; / 找出次最小的权值*p2=j; / 通过*p2带回序号 void CreatHFMT(HFMT T / 构造哈夫曼树,T2*n-1为其根结点in
10、t i,p1,p2;InitHFMT (T;InputWeight (T,"weight.txt"for (i=n;i<2*n-1;i+ SelectMin (T,i-1,&p1,&p2;Tp1.parent=Tp2.parent=i;/Ti.lchild=Tp1.weight;/Ti.rchild=Tp2.weight;Ti.lchild=p1;Ti.rchild=p2;Ti.weight=Tp1.weight+Tp2.weight;void PrintHFMT (HFMT T / 输出向量状态表 int i,k=0;for (i=0; i<2
11、*n-1; i+while (Ti.lchild!= -1 if (!(k%2printf ("n"printf ("tt(%d%d,(%d%d",Ti.weight,Ti.lchild,Ti.weight,Ti.rchild;k+;break;void printHfCode(HfCode hc/输出字符的哈夫曼编码序列for (int i=0;i printf("%s",hci;HfCode hfEnCoding(HFMT T/利用构成的哈夫曼树生成字符的编码int start;HfCode hc=new char*(n+1*si
12、zeof(char*;/分配n个字符编码char* cd=new charn*sizeof(char;/分配求编码的工作空间cdn-1='0'/编码结束符int c;int f;for (int i=0;i start=n-1;for (c=i,f=Ti.parent;f!=-1;c=f,f=Tf.parent/从叶子结点到根逆向求编码if (Tf.lchild=ccd-start='0'elsecd-start='1'hci=new char(n-start*sizeof(char;/为第i个编码分配空间strcpy(hci,&cdst
13、art;printf("n%c:%s",Ti.ch,hci;return hc;void print_HuffmanTree(HFMT HT,int t,int i/按树形形态输出哈夫曼树的形态if (HTt.rchild!=-1 /先打印出右子树print_HuffmanTree(HT,HTt.rchild,i+1;for (int j=1;j<=3*i;j+/打印空格表示结点所在的层次printf(" "/再输出根结点if (HTt.lchild!=-1 | HTt.rchild!=-1printf("%dn",HTt.we
14、ight;elseprintf("%c(%dn",HTt.ch,HTt.weight;/最后输出左子树if (HTt.lchild!=-1 print_HuffmanTree(HT,HTt.lchild,i+1;void Encoder(char* original,char* codeFile,HfCode hc,HFMT HT/利用已建好的哈夫曼树,对original文件中要传输的原始数据进行编码, /将编码结果存入文件codeFile中. char *str; /用于存储需编码内容 int i=0; char ch; int k=0; FILE* fin;FILE*
15、fout; if (fin = fopen(original, "r" != NULL fscanf(fin,"%c",&ch;while(!feof(fin k+; /计算CodeFile中代码长度 fscanf(fin,"%c",&ch; fclose(fin; str=new chark+1; k=0;if (fin = fopen(original, "r" != NULL fscanf(fin,"%c",&ch;while(!feof(fin strk+=ch;
16、 fscanf(fin,"%c",&ch; fclose(fin; strk='0' /结束标志符printf("要编码的数据是:n"printf("%sn",str; k=0;if (fout = fopen(codeFile, "w" != NULL while (strk!='0' /将字符编码for (i=0;i if (strk=HTi.chfprintf(fout,"%s",hci;break;k+;printf("已编码!且存到文件
17、CodeFile.dat中!nn" fclose(fout;void Decoder(char* codeFile ,char* textFile,HFMT HT /利用已建好的哈夫曼树,对传输到达的codeFile中的数据代码进行译码, /将译码结果存入文件textFile中. int i=0,k=0; int j=n*2-1-1; /表示从根结点开始往下搜索 char* bitStr; FILE* fin;/读取codeFile文本文件指针FILE* fout;printf("经译码的内容为:n" char ch;if (fin = fopen(codeFil
18、e, "r" != NULL fscanf(fin,"%c",&ch;while(!feof(fin k+; /计算CodeFile中代码长度 fscanf(fin,"%c",&ch; fclose(fin; bitStr=new chark+1; k=0;if (fin = fopen(codeFile, "r" != NULL fscanf(fin,"%c",&ch;while(!feof(fin bitStrk+=ch; fscanf(fin,"%c",&ch; fclose(fin; bitStrk='0' /结束标志符 if(HT=NULL /还未建哈夫曼树 printf("请先编码!n" return; if (fout = fopen(textFile, "w" != NULL /将字符形式的编码文件写入文件CodePrin中 while(bitStri!='0' if(bitStri='0' j=HTj.lchild; /往左走 else j=HTj.r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环保型土壤固化剂的研发与应用考核试卷
- 竹纤维增强复合材料界面改性考核试卷
- 漆器工艺品的生命周期可持续性评估考核试卷
- 电气设备网络营销策略考核试卷
- 传统手工艺品保护与传承考核试卷
- 矿山环境保护法规与案例分析-石墨滑石考核试卷
- 全面解读2024年项目管理专业人士资格考试试题及答案
- 硅灰石应用开发考核试卷
- 2023年中国能建陕西院勘测工程公司招聘笔试参考题库附带答案详解
- 微生物检验过程及评估试题及答案
- C语言期末考试试题南昌航空大学
- 取消订单协议模板(5篇)
- 东风天锦5180勾臂式垃圾车的改装设计
- 浦发银行个人信用报告异议申请表
- 高考试卷命题设计的技巧 课件24张
- 施工进度计划网络图-练习题知识讲解
- 防孤岛测试报告
- 按摩常用英语
- 食品公司规章制度
- midas NFX使用指南(八)
- 成都高新区小学数学五年级下册半期考试数学试卷
评论
0/150
提交评论