ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:164.36KB ,
资源ID:6269111      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6269111.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验二哈夫曼树及哈夫曼编码译码的实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构实验二哈夫曼树及哈夫曼编码译码的实现.docx

1、数据结构实验二哈夫曼树及哈夫曼编码译码的实现福建农林大学金山学院实验报告系(教研室): 专业: 计算机科学与技术 年级: 08 实验课程: 姓名: 学号: 实验室号:_ 计算机号: 实验时间: 指导教师签字: 成绩: 实验二:哈夫曼树及哈夫曼编码译码的实现(验证性、4学时)一、 实验目的和要求构建哈夫曼树及哈夫曼编码,输出哈夫曼树及哈夫曼编码,完成编码与译码的算法。(1)掌握树的有关操作算法(2)熟悉树的基本存储方法(3)学习利用树求解实际问题二、 实验内容和原理 定义哈夫曼树的存储结构;输入要编码的字符权重,根据权重建立哈夫曼树,并进行编码,最后输出哈夫曼编码。三、 实验环境硬件:(1)学生

2、用微机(2)多媒体教室或远程教学(3)局域网环境软件:(1)Windows XP中文操作系统 (2)Turbo C 3.0四、 算法描述及实验步骤1 算法描述 (1).建立哈夫曼树的算法定义各节点类型其中应包含两类数据一是权重域weight;一是指针域而指针域中应该包括指向左右孩子和指向双亲的指针这里分别用lchild、rdhild和parent来表示因此可用静态三叉链表来实现,在实际构造中由于是叶子节点来构造新的根节点其构造过程中仅与叶子节点的权重有关而与其数据域无关所以构造过程中不用考虑其数值域,并且在链表中从叶子开始存放,让后不断的将两颗最小权值的子树合并为一颗权值为其和的较大的子树,逐

3、步生成各自内部节点直到树根。(2).哈夫曼编码的算法将建立的哈夫曼树从每个叶子节点开始沿着双亲域回到根节点,梅走一步进行编码得到一位编码值;由于每个叶子节点的哈夫曼编码是从根节点到相应的叶子的路径的各个分支的代码组成的0和1序列,所以先得到了低位编码后得到高位编码因此可用一维数组从后向前来存放各位编码值,并用start来记录编码的起始位置。2 算法流程图 构建哈夫曼树算法流程 哈夫曼编码算法流程3 代码仅作参考-redbatzero#include #include #define maxvalue 10000 /定义最大权值常量#define maxnodenumber 100 /定义节点最

4、大数#define maxbit 10 /定义哈弗曼编码最大长度typedef struct /定义新数据类型即节点结构int weight; /权重域int parent,lchild,rchild; /指针域htnode; /节点类型标识符/typedef htnode * huffmanstree; /定义哈弗曼数类型htnode htmaxnodenumber; /定义三叉链表存储数组typedef struct /定义保存一个叶子节点哈弗曼编码的结构 int bitmaxbit; /定义一维数组为编码域 int start; /定义位置域hcnodetype; /定义编码类型htno

5、de * creatstree(int n) /huffmanstree creatstree(int n) /建立哈夫曼树算法实现函数 int i,j,m1,m2,k1,k2; /局部变量 for(i=0;i2*n-1;i+) /初始化各节点 hti.weight=0; /权重初始化为0 hti.parent=-1; /根节点和给左右孩子初始化为-1 hti.lchild=-1; hti.rchild=-1; for(i=0;in;i+) /权重赋初值,由用户输入 scanf(%d,&hti.weight); for(i=0;in-1;i+) /生成新节点构造哈夫曼树 m1=maxvalue

6、; /预置最小权值变量为最大权值 m2=maxvalue; /预置次小权值变量为最大权值 k1=0; /预置最小权值节点位置为下标为0处 k2=0; /预置次小权值节点位置为下标为0处 for(j=0;jn+i;j+) /循环找出每趟最下权值和所在位置 if(htj.parent=-1&htj.weightm1) m2=m1; k2=k1; m1=htj.weight; k1=j; else /当小于当前次小m2则更新m2及其位置 if(htj.parent=-1&htj.weightm2) m2=htj.weight;k2=j; htk1.parent=n+i; /修改最小权值节点的双亲为刚

7、生成的新节点 htk2.parent=n+i; /修改次小权值节点的双亲为刚生成的新节点 htn+i.weight=htk1.weight+htk2.weight; /将新生成的权重值填入新的根节点 htn+i.lchild=k1; /新生节点左孩子指向k1 htn+i.rchild=k2; /新生节点右孩子指向k2 return ht; /返回哈夫曼树指针void getstree(htnode * ht,int n) /哈夫曼编码算法及打印函数的实现 int i,j,c,p; /局部变量的定义 hcnodetype cdmaxnodenumber; /定义存储哈夫曼编码的数组 for(i=

8、0;in;i+) /循环控制对每一个节点进行编码 c=i; /为编码各节点初始化c和j j=maxbit; do j-; /j指向bit中存放编码为的正确位置 p=htc.parent; /p指向c的双亲节点 if(htp.lchild=c) /如果c是p的左孩子 cdi.bitj=0; /编码为赋值0 else /否则即c是p的右孩子 cdi.bitj=1; /编码赋值1 c=p;/更新当前指针,为下一节点编码做准备 while(htp.parent!=-1); /判断是否编码结束即循环至最终根节点 cdi.start=j; /编码完成,记下编码开始位置 for(i=0;in;i+) /循环

9、打印各节点哈夫曼编码 for(j=cdi.start;jmaxbit;j+)/循环逐一输出 printf(%d,cdi.bitj); printf(n); /每输出一编码后换行 int main() /主函数 int n; printf(请输入节点数:); /用户输入节点数 scanf(%d,&n); htnode * p; / huffmanstree p /定义哈夫曼树类型p p=(htnode * )malloc(sizeof(htnode *);/p=(huffmanstree)malloc(sizeof(huffmanstree)/分配内存空间 p=creatstree(n);/调用

10、建立哈夫曼树函数赋返回值给p getstree(p,n); /调用编码函数读入建立的哈夫曼树p进行编码 return 0;五、 调试过程出现该错误是因为type识别不了,即定义哈夫曼树时确切的说是type并不能定义htnode *标识符为huffmanstree:type htnode * huffmanstree这个小错误可以通过连个方法来修改一是将type改为typedef,当然直接删除该定义完全不会影响程序的执行,但在定义建立哈夫曼树函数时返回值应直接用htnode *;该错原因是参数未能成功传递,其中的htp系统当做是未定义的类型可知,在getstree(htnode ht,int n

11、)时正确的应当是传递哈夫曼树的头指针即数组首地址ht因此改为getstree(htnode * ht,int n)六、 实验结果 通过改正后成功编译连接,进行数据测试5,20,12,7,47,9当然编码因为定义时大小的左右排序是不同的所以编码也不唯一,但在这里是以左小右大来分布的,所以编码结果符合预期的。所构造哈夫曼树如图所示七、 总结该实验不仅让我加深了对哈夫曼树的理解,更是让我惊叹该算法的强大,一个简单的数组类型数据加之简单的链表在实现该算法后让我理解了基础理论知识的重要性,倘若在不知道这个算法的情况下。我不知道自己得花多少的时间来实现编码,或许最终还不一定能够很好的实现编码,更别说优化了。尤其树的基本存储方法更加深了我对树的理解。附录:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1