实验五哈夫曼编码与译码的设计与实现.docVIP

实验五哈夫曼编码与译码的设计与实现.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验五 哈夫曼编码与译码的设计与实现 实验五 哈夫曼编码与译码的设计与实现 一、问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率, 缩短信息传输时间, 降 低传输成本。 但是, 这要求在发送端通过一个编码系统对待传数据预先编码, 在 接收端将传来的数据进行译码(复原) 。对于双工信道(即可以双向传输信息的 信道) ,每端都需要一个完整的编 /译码系统。试为这样的信息收发编写一个哈夫 曼码的编 /译码系统。 基本要求: (1)接收原始数据:从终端读入字符集大小 n,以及 n 个字符和 n 个权 值,建立哈夫曼树,并将它存于文件 nodedata.dat 中。 (2)编码: 利用已建好的哈夫曼树 (如不在内存, 则从文件 nodedata.dat 中读入) ,对文件中的正文进行编码,然后将结果存入文件 code.dat 中。 (3)译码: 利用已建好的哈夫曼树将文件 code.dat 中的代码进行译码, 结果存入文件 text 中。 (4)打印编码规则:即字符与编码的一一对应关系。 (5)打印哈夫曼树: 将已在内存中的哈夫曼树以直观的方式显示在终端 上。 二、数据结构设计 1、 构造哈夫曼树时,使用静态链表作为哈夫曼树的存储。 在构造哈夫曼树时,设计一个结构体数组 HuffNode 保存哈夫曼树中各结点 的信息,根据二叉树的性质可知,具有 n 个叶子结点的哈夫曼树共有 2n-1 个结 1 / 261 / 26 实验五 哈夫曼编码与译码的设计与实现 点,所以数组 HuffNode 的大小设置为 2n-1,描述结点的数据类型为: typedef struct { int weight; int parent; int lchild; int rchild; char inf; }HNodeType; 2. 求哈夫曼编码时使用一维结构数组 HuffCode 作为哈夫曼编码信息的存 储。 求哈夫曼编码实际上就是在已建立的哈夫曼树中, 从叶子结点开始, 沿结点 的双亲链域回退到根结点, 每回退一步, 就走过了哈夫曼的一个分支, 从而得到 一位哈夫曼编码值。 由于一个字符的哈夫曼编码就是从根结点到相应叶子结点所 经过的路径上各分支所组成的 0、 1 序列,因此先得到的分支代码为所求编码的 低位码,后得到的分支代码为所求的高位码。所以设计如下数据类型: #define MaxBit 10 struct { int int }; HcodeType bit[MaxBit]; start; 3、文件 nodedata.dat 、 code.dat 、 text 三、功能函数设计 1、初始化功能模块 此功能模块的功能为从键盘接受字符集大小 n,以及 n个字符和 n个权值。 2、建立哈夫曼编码的功能模块 此模块功能为使用 1 中得到的数据按照教材中的构造哈弗曼的算法构造哈 弗曼树,即将 HuffNode 数组中的各个位置的各个域都填上相关的值,并将这个 2 / 262 / 26 实验五 哈夫曼编码与译码的设计与实现 结构体数组存于文件 nodedata.dat 中。 函数原型为: void Creat_Haffmantree( int n) { HNodeType *HaffNode=newHNodeType[2*n-1]; int i,j; int m1,m2,x1,x2; for (i=0;i2*n-1;i++) { HaffNode[i].weight=0; HaffNode[i].parent=-1; HaffNode[i].lchild=-1; HaffNode[i].rchild=-1; HaffNode[i].inf= 0 ; } for (i=0;in;i++) { cout 请输入字符 endl; cinHaffNode[i].inf; cout 请输入该字符的权值 endl; cinHaffNode[i].weight; } for (i=0;in-1;i++) // 构造哈夫曼树 { m1=m2=Maxvalue; x1=x2=0; for (j=0;jn+i;j++) // 选取最小和次小 { if (HaffNode[j].parent==-1HaffNode[j].weightm1) { m2=m1; x2=x1; m1=HaffN

文档评论(0)

小光老师 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体赛罕区发光网络技术服务部
IP属地内蒙古
统一社会信用代码/组织机构代码
92150105MAC8HM2M1T

1亿VIP精品文档

相关文档