哈夫曼树及哈夫曼编码译码.doc_第1页
哈夫曼树及哈夫曼编码译码.doc_第2页
哈夫曼树及哈夫曼编码译码.doc_第3页
哈夫曼树及哈夫曼编码译码.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验2哈夫曼树及哈夫曼编码译码的实现一、实验目的和要求通过本实验使学生深刻理解二叉树的性质和存储结构。认识哈夫曼树、哈夫曼编码的作用和意义。能够建立一个哈夫曼树,并输出哈夫曼编码,正确调程序。二、实验内容和原理哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。哈夫曼树又称做最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉数。是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+.+Wn*Ln),N个权值Wi(i=1,2,.n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,.n)。树中每个节点的左分支标记0,而右分支标记1.则每个结点代表的字符的编码为从根结点到叶子结点的路径上分支所标记的数组的串。三、实验环境惠普计算机,WindowsXP操作系统,Turbo C+四、算法描述及实验步骤#includestdio.h/*头文件*/#define maxbit 10/*定义哈夫曼编码最大长度*/#define maxvalue 10000/*定义最大权值常量*/#define maxnodenumber 100/*定义结点最大数目常量*/typedef struct/*定义结点结构*/ int weight;/*权重域值为整型*/ char character; int parent,lchild,rchild;/*3个指针域为整型值,即静态指针*/ htnode;/*定义结点类型标识符*/typedef struct/*定义保存一个叶子结点哈曼编码的结构*/int bitmaxbit;/*哈曼编码域为一维数组*/ int start;/*开始位置域为整型*/ hcodetype;/*定义哈曼编码类型*/void main()/*主函数*/void gethuffmancode(htnode ht,int n);/*函数声明*/ htnode htmaxnodenumber;/*定义链表存储结构区数组*/ int i,j,m1,m2,k1,k2,n,a; printf(Please input n:);/*提示输出叶子结点个数*/ scanf(%d,&n); printf(Please input character and weight:n);/*提示输出各叶子结点的权值*/ for(i=0;i2*n-1;i+)/*数组ht初始化*/ hti.weight=0;/*权重初始化为0*/ hti.character=0; hti.parent=-1;/*3个指针域初始化为-1,即NULL*/ hti.lchild=-1; hti.rchild=-1; for(i=0;in;i+)/*读入n个叶子结点的权重值*/ fflush(stdin); scanf(%c %d,&hti.character,&hti.weight); for(i=0;in-1;i+)/*控制n-1趟生成新结点构造哈夫曼树*/ m1=maxvalue;/*预置最小权值变量为最大权值*/ m2=maxvalue;/*预置次小权值变量为最大权值*/ k1=0;k2=0;/*预置最小和次小权值结点位置为下标0处*/ for(j=0;jn+i;j+)/*控制一趟中找出两个最小权值的结点*/ if(htj.parent=-1&htj.weightm1) m2=m1;k2=k1;/*若第j个结点权小于当前最小的m1改为次小的*/ m1=htj.weight;k1=j;/*并记下新的当前最小权值及位置*/ else if(htj.parent=-1&htj.weightm2) m2=htj.weight;k2=j;/*否则若小于当前次小的m2则更新m2及其位置*/ htk1.parent=n+i;/*修改最小权值结点的双亲为刚才生成的新结点*/ htk2.parent=n+i;/*修改次小权值结点的双亲为刚才生成的新结点*/ htn+i.weight=htk1.weight+htk2.weight;/*填新生成结点的权重值*/ htn+i.lchild=k1;/*新生成结点的左孩子指针指向k1*/ htn+i.rchild=k2;/*新生成结点的右孩子指针指向k2*/ printf(The character and the code is as follows:n); gethuffmancode(ht,n);/*调用函数*/ void gethuffmancode(htnode ht,int n)/*对具有n个叶子结点的哈夫曼树ht,求所有叶子结点的哈夫曼编码并输出*/int i,j,c,p,m,k;/*定义局部变量*/ char ch100; hcodetype cd100;/*定义存放哈曼编码的数组cd*/ for(i=0;in;i+)/*对n个结点逐一求哈夫曼编码*/ c=i;j=maxbit;/*为求一个结点的哈夫曼编码初始化c和j*/ do j-;/*j指向bit中存放编码位的正确位置*/p=htc.parent;/*p指向c的双亲结点*/if(htp.lchild=c)/*如果c是p的左孩子*/ cdi.bitj=0;/*编码位上赋0*/else cdi.bitj=1;/*否则c是p的右孩子,编码位上赋1*/c=p;/*更新c为p,为求下一个编码位做准备*/ while(p!=-1);/*当未到达根结点继续做do循环*/ cdi.start=+j;/*求完一个叶子结点的哈夫曼编码时,记下编码开始位置*/ for(i=0;in;i+)/*输出n个叶子结点的哈夫曼编码*/ printf(Character:%c Code:,hti.character);/*显示排版需要*/ for(j=cdi.start;jmaxbit;j+)/*逐位输出一个编码*/ printf(%d,cdi.bitj); printf(n);/*输出完一个哈夫曼编码后换行*/ printf(Please input ch:); scanf(%s,ch);/*输入被译码的字符*/ printf(The decode is:); for(i=0;chi!=0;i+)/*三个循环实现译码*/ for(j=0;jn;j+) if(htj.character=chi) for(k=cdj.start;kmaxbit;k+)/*第三个循环输出译码*/ printf(%d,cdj.bitk); 五、调试过程1、有部分输入错误了,改正后就能正常运行了。六、实验结果经调试程序正确后,输入n=8个权重值如下:h 6;e 4;l 13;o 24;k 17;i 3;t 9;y 29.再输入被译码的字符串:helloki

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论