1 / 35
文档名称:

《哈夫曼编译码器》实验报告.doc

格式:doc   大小:683KB   页数:35页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

《哈夫曼编译码器》实验报告.doc

上传人:ogthpsa 2020/4/25 文件大小:683 KB

下载得到文件列表

《哈夫曼编译码器》实验报告.doc

文档介绍

文档介绍:哈夫曼编/译码器作者:田正英联系方式:目录一、实验目的二、实验内容三、语言四、环境五、功能设计概述六、详细设计七、测试结果八、收获与心得九、程序代码哈夫曼编/、实验内容根据哈夫曼编码原理,设计一个程序,在已知相关字符和字符对应权值(文件中存在或者用户输入)的情况下,根据用户要求对相应内容进行编码、译码等相应操作。语言C语言四、编译环境MicrosoftVisualC++,,则默认为指定文件中已纯在该哈夫曼树,并将其读入到内存(因此未初始化前一定要确定指定文件中存在哈夫曼树,否则会将空树读入内存)(哈夫曼树存储内容、代码、译码后内容){ intlchild,rchild,parent; floatweight; chardata;}Htnode;:分别存储该节点左右孩子、双亲节点、该节点权值、以及该节点对应字符。typedefstructHcode{ charcd[size]; intstart;}Hcode;分别存储相应字符对应代码以及代码开始位置。此处size宏定义为128。——Input getchar(); printf("请输入初始化字符和权值,输入'#'结束\n"); do //输入字符及权值 { (*n)++; scanf("%c",&t[*n].data); //注意空格也要算字符,也要输入权值 if(t[*n].data!='#')scanf("%f",&t[*n].weight); getchar(); }while(t[*n].data!='#'); 用户根据相关提示输入需要字符和权值(输入‘#’结束)。函数中两处用到getchar()函数,第一处是为吸收从调用方可能引进的回车,第二处是为吸收每次输入完成后的回车。第一处可视情况添加(为保证健壮性,最好添加),第二处必须添加。——CreatHt、CreatHcode、Initializationfor(intj=n;j<2*n-1;j++) { floatmin1=32000; floatmin2=32000; intnode1=-1; intnode2=-1; for(intk=0;k<j;k++) { if(b[k].parent==-1) { if(b[k].weight<min1) { min2=min1; node2=node1; min1=b[k].weight; node1=k; } elseif(b[k].weight<min2) { min2=b[k].weight; node2=k; } } } b[j].lchild=node1; b[j].rchild=node2; b[node1].parent=b[node2].parent=j; b[j].weight=min1+min2; }以上为CreatHt函数部分代码。找出叶子节点中(0~n-1)最小的一个和第二小的一个节点,由这两个节点生成双亲节点(n~2*n-1),双亲节点伪权值为该两节点权值(或伪权值)之和。重复以上操作直到所有节点(2*n-1个)都确定了父子关系。 Hcodech; for(inti=0;i<n;i++) { =n; intf=b[i].parent; intc=i; while(f!=-1) { if(b[f].rchild==c) { [--]='1'; } [--]='0'; c=f; f=b[f].parent; } ++; cd[i]=ch; }以上为CreatHcode函数部分代码。从叶子节点(存储字符的节点)倒序找双亲节点,判断是双亲左孩子还是右孩子,若是左孩子则在字符代码数组最后一位填0(start标记前移一位),若是右孩子则在字符代码数组最后一位填1(start标记前移一位)。重复以上操作直到找到根结点。注意start标记的处理,此处一错满盘皆输,而且难发现错误原因。FILE*fp=fopen(op,"wb+"); for(inti=0;i<2*n-1;i++) { if(i<n)fprintf(fp,"%c\t",t[i].data); elsefprintf(fp,"#\t",t[i].data); fp