哈夫曼编码译码的设计与实现..docx

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1 软件学院 课程设计报告 设计名称: 数据结构课程设计 选题名称:  哈夫曼编码  / 译码的设计与实现 姓 名:  学 号: 专业班级: 移动 一班 系 (院): 软件学院 设计时间: 2014.6.1~2014.6.4 2 目 录 一、需求分析 ----------------------------------3 二、系统设计 ----------------------------------3 三、程序流程图 -------------------------------10 四、实现代码 ----------------------------------13 五、总结 ----------------------------------------23 六 、 参 考 书 目 ----------------------------------23 数据结构课程设计报告 第 3 页 共 23 页 一、需求分析 哈夫曼编码是一种应用广泛且非常有效的数据压缩技术,哈夫曼编码是一种编码方式,以哈夫曼树,带权路径长度最小的二叉树,经常应用于数据压缩。哈夫曼编码使用一张特殊的编码表将源字符进行编码。这张编码表的特殊在于,它是根据每一个源字符出现的估算概率而建立起来的。哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码成为哈夫曼编码,树中从根到每个叶子都有一条路径,对路径 上的各分支约定:指向左子树的分支表示“ 0”码,指向右子树的分支表示“ 1”码,取每条路径上的“ 0” 或“ 1”的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。哈夫曼译码输入字符串可以把它编 译成二进制代码。输入二进制代码时可以编译成字符串。 二、系统设计 构造哈夫曼树时,使用静态链表作为哈夫曼树的存储。 在构造哈夫曼树时,设计一个结构体数组 HuffNode 保存哈夫曼树中各结点的信息,根据二叉 树的性质可知, 具有 n 个叶子结点的哈夫曼树共有 2n-1 个结点,所以数组 HuffNode 的大小设 置为 2n-1, 求哈夫曼编码时使用一维结构数组 HuffCode 作为哈夫曼编码信息的存储。 求哈夫曼编码实际上就是在已建立的哈夫曼树中, 从叶子结点开始, 沿结点的双亲链域回退到 根结点,每回退一步,就走过了哈夫曼的一个分支,从而得到一位哈夫曼编码值。由于一个字 符的哈夫曼编码就是从根结点到相应叶子结点所经过的路径上各分支所组成的 0、 1 序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码为所求的高位码 1、初始化功能模块 此功能模块的功能为从键盘接受字符集大小 n,以及 n 个字符和 n 个权值。 2、建立哈夫曼编码的功能模块 此模块功能为使用 1 中得到的数据按照教材中的构造哈弗曼的算法构造哈弗曼树,即将 HuffNode 数组中的各个位置的各个域都填上相关的值,并将这个结构体数组存于文件nodedata.dat中。 函数原型为: void Creat_Haffmantree(int n) { HNodeType *HaffNode=new HNodeType[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; 数据结构课程设计报告 第 4 页 共 23 页 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=HaffNode[j].weight; x1=j; } else { if(HaffNode[j].parent==-1HaffNode[j].weightm2) { m2=HaffNode[j].weight; x2=j; } } } //将找出的最小和次小合并,创造其父母结点 HaffNode[x1].parent=n+i; HaffNode[x2].parent=n+i; HaffNode[n+i].weight=HaffNode[x1].weight+HaffNode[x

文档评论(0)

153****8736 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档