数据结构课程设计之哈夫曼编码.doc_第1页
数据结构课程设计之哈夫曼编码.doc_第2页
数据结构课程设计之哈夫曼编码.doc_第3页
数据结构课程设计之哈夫曼编码.doc_第4页
数据结构课程设计之哈夫曼编码.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

哈夫曼编码与解码的实现一、设计思想 (一) 哈夫曼树的设计思想对于一组具有确定权值的叶子结点可以构造出多个具有不同带权路径长度的二叉树,其中具有最小带权路径长度的二叉树称作哈夫曼树或最优二叉树。首先给定n个权值制造n个只含根结点的二叉树,得到一个二叉树林;再在这二叉树林里面找根结点的权值最小和次小的两棵树作成新的二叉树,其中新的二叉树的根结点的权值为左右子根结点权值之和;最后在二叉树林中把组合过的二叉树删除,再重复第二步,直到最后就剩一颗二叉树的时候得到的这棵二叉树就是哈夫曼树。(二)哈夫曼编码与解码的设计思想在数据通讯中,经常要将传送的文字转换为二进制字符0和1组成的二进制串,称这个过程为编码。与子相对的是解码或是译码,就是用与编码相同的方式将二进制串转换称编码前的文字的过程称作解码。在这里是通过哈夫曼树实现编码与解码的,所以称作是哈夫曼编码与解码。首先输入一个字符串,还有相应的在哈夫曼树里的权值,这样用哈夫曼树把字符串用二进制串代替它,这个过程要注意树和编码问题,其中树的问题在上面已经解决,主要看编码的问题,就是根据我们输入的字符串和权值建立相应的树模型,这一步完成那编码就已经完成了,最后打印就行了;然后就是解码,完成编码相应的解码就相对简单了,就是先找到在编码的时候建的那个模型树,将编码中的二进制串再根据权值转换为相应的字符串,这样一步步解码就行了。以上就是通过用哈夫曼树进行哈夫曼编码与解码如何实现的主要设计思想。二、算法流程图(一)哈夫曼树的流程图图1哈夫曼树的流程图(二)编码的流程图(三)解码的流程图三、源代码下面给出的是用中缀转后缀算法实现的程序的源代码:#include stdio.h#include string.h#define MAX 100/*定义常量*/struct HaffNode int weight;/*权值*/ int parent;/*双亲结点下标*/ char ch; int lchild; int rchild;*myHaffTree; /*构造哈夫曼树*/struct Coding char bitMAX;/*定义数组*/ char ch; int weight;/*字符的权值*/*myHaffCode;/*定义结构体*/void Haffman(int n)/*定义哈夫曼函数*/ int i,j,x1,x2,s1,s2; for (i=n+1;i=2*n-1;i+)/*树的初始化*/ s1=s2=10000; x1=x2=0; for (j=1;j=i-1;j+)/*构造哈夫曼树的非叶子结点*/ if(myHaffTreej.parent=0&myHaffTreej.weights1)/*分配左右结点*/ s2=s1;x2=x1; s1=myHaffTreej.weight;x1=j; else if(myHaffTreej.parent=0&myHaffTreej.weights2) s2=myHaffTreej.weight;x2=j; myHaffTreex1.parent=i; myHaffTreex2.parent=i; myHaffTreei.weight=s1+s2;/*左右子组合为新树*/ myHaffTreei.lchild=x1; myHaffTreei.rchild=x2; void HaffmanCode(int n)/*构造n个结点哈夫曼编码*/ int start,c,f,i,j,k; char *cd; cd=(char *)malloc(n*sizeof(char); myHaffCode=(struct Coding *)malloc(n+1)*sizeof(struct Coding); cdn-1=0; for(i=1;i=n;+i)/*n个叶子结点的哈夫曼编码*/ start=n-1; for(c=i,f=myHaffTreei.parent;f!=0;c=f,f=myHaffTreef.parent) if(myHaffTreef.lchild=c) cd-start=0; else cd-start=1; for(j=start,k=0;jn;j+) myHaffCodei.bitk=cdj; k+; myHaffCodei.ch=myHaffTreei.ch; /*取编码对应的权值*/ myHaffCodei.weight=myHaffTreei.weight; free(cd);Init()/*定义有返回值的函数*/ int i,n,m; printf(please input the number of words:); scanf(%d,&n); m=2*n-1; myHaffTree=(struct HaffNode *)malloc(sizeof(struct HaffNode)*(m+1); for(i=1;i=n;i+) printf(please input the word and the equal:); scanf(%s%d,&myHaffTreei.ch,&myHaffTreei.weight); myHaffTreei.parent=0; myHaffTreei.lchild=0; myHaffTreei.rchild=0; for(i=n+1;i=m;i+) myHaffTreei.ch =#; myHaffTreei.lchild=0; myHaffTreei.parent=0; myHaffTreei.rchild=0; myHaffTreei.weight=0; Haffman(n); HaffmanCode(n); for(i=1;i=n;i+) printf(%c %d,myHaffCodei.ch,myHaffCodei.weight); printf(n); printf(init success!n); return n;void Caozuo_C(int m)/* 编码函数 */ int n,i,j; char string50,*p; printf(please input the words:); scanf(%s,string); n=strlen(string);/*计算字符串长度*/ for(i=1,p=string;i=n;i+,p+)/*进行编码*/ for(j=1;j=m;j+) if(myHaffCodej.ch=*p) printf(%sn,myHaffCodej.bit); void Caozuo_D(int n)/*解码函数*/ int i,c; char code1000,*p; printf(please input the coding:);/*输入二进制编码*/ scanf(%s,code); for(p=code,c=2*n-1;*p!=0;p+) /*进行解码*/ if(*p=0) /*结束条件*/ c=myHaffTreec.lchild;/*赋值*/ if(myHaffTreec.lchild=0) /* 扫描*/ printf(%c,myHaffTreec.ch); c=2*n-1; continue;/*结束*/ else if(*p=1) c=myHaffTreec.rchild; if(myHaffTreec.lchild=0) printf(%c,myHaffTreec.ch); c=2*n-1;/*赋值*/ continue; printf(n);void main() int n; char char1;/*定义字符*/ n=Init();/*函数的调用*/ printf(A.coding B.codeprinting C.exitnplease input the process:n); while(1) scanf(%c,&char1); if(char1=c) /*判断字符*/ break; switch(char1) caseA:Caozuo_C(n);break; /*执行编码操作*/ caseB:Caozuo_D(n);break; /*执行解码操作*/ caseC:;break; 四、运行结果(一)中缀转后缀算法的运行结果:五、遇到的问题及解决这部分我主要遇到了如下三个问题,其内容与解决方法如下所列:l 问题1: 刚开始不知道如何建一个好树,因为我开始试着建了几个二叉树,不知道什么原因运行的时候那编码总是不对,跟在草稿纸上自己画的那个二叉树总是不相符,就找原因。解决方法: 开始时总是编码出错,就试着找错,树的初始化不可能出错,所以首先看那叶子结点的for函数,没什么错误,接着看非叶子结点的for函数,非叶子结点不好弄,找起来麻烦一些,就是费时间,盘查到最后也没什么错,最后就是左右子结点重生结点的一块了,这也比较好查,可是结果却是错处在这儿了,没想到最放心的一块出了错,得好好反省反省了,以后绝不能在这些问题上出错了,还好不是很严重,还可以补回来。l 问题2: 由于前一个问题的解决,后面小心意义的写,尽量放慢写的速度,省的再花时间找错,可是最后能运行,运行的结果却是错的不容乐观啊,还出现一些不认识的乱码,这样的问题最难了,也是最不想遇到的问题,逻辑问题和一些代码输入有误。解决方法: 刚开始改的时候不知哪儿错,就是乱改一通,结果还是找不到哪儿出错了,只能请高手了,不过还是问了两个人才解决这个问题的。最后还是不是怎么懂,马马虎虎吧。l 问题3:这个问题是写到前面才想起来的,就是哈夫曼编码与解码这个作业的原理不是很懂,刚开始在课上听的就不是很懂很透,结果过了两天忘了。解决方法:这个问题跟别人讨论了一下,然后给我讲了一下就懂了,也没什么难的,就这么轻松的解决了。六、心得体会 通过这次的作业我充分的认识到了自己的不足,特别是对写程序代码这方面,一个程序从算法到用程序把它实现出来,这一整个过程是很不容易的,你懂得它的算法,不一定就能写的出来,通过这次我也深深的了这一点。对于一个新手来说,小的错误出现的太多,而且一个小的错误就能让我束手无策,因为想不通错在哪,所以就一直在乱改,逻辑错误就更难了,有时候程序运行语法没有错误,但只要输入表达式计算结果时,出来的结果要不是错的,要不就不出现结

温馨提示

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

评论

0/150

提交评论