赫夫曼树及赫夫曼编码.doc_第1页
赫夫曼树及赫夫曼编码.doc_第2页
赫夫曼树及赫夫曼编码.doc_第3页
赫夫曼树及赫夫曼编码.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

数据结构实验报告一一、 上机实验的问题:在调试过程中,如何运用编程软件发现并修改程序的非语法错误。二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)程序的基本思想:1、 利用Select函数选出权值最小的两个结点;2、 利用CreatHT函数构的建赫夫曼树:先将所有的叶子结点的父结点和左右孩子结点均赋值为0,并将输入的权值依次赋给叶子结点的weight域。从树的最底部开始,循环Select函数共n-1次,将最小权的结点赋给中间结点的左孩子,将次小权的结点赋给中间结点的右孩子。3、 从叶子到根逆向求每个字符的赫夫曼编码:开辟字符串空间,从叶子结点开始,逆向寻找每个中间结点的左右孩子,开辟字符空间,为左孩子赋值为字符0,为右孩子赋值为字符1,运用strcpy函数将所得字符依次从右到左连接于所开辟的字符串空间,所得字符串即为赫夫曼编码。数据结构: typedef struct unsigned int weight; unsigned int parent,lchild,rchild;HTNode,*HuffmanTree; /动态分配数组存储赫夫曼树typedef char* HuffmanCode; /动态分配存储赫夫曼编码表三、源程序及注释:#include#include#includetypedef struct unsigned int weight;unsigned int parent,lchild,rchild;HTNode,*HuffmanTree; /动态分配数组存储赫夫曼树typedef char* HuffmanCode; /动态分配存储赫夫曼编码表void Select(HuffmanTree *ht,int n,int *s1,int *s2)/选择parent为0,并且weight最小的两个结点,其序号由变量s1、s2返回 int i;for(i=1;i=n&(*ht)i.parent!=0;i+);*s1=i;for(i=1;i=n;i+)if(*ht)i.parent=0&(*ht)i.weight(*ht)*s1.weight) *s1=i;for(i=1;i=n;i+)if(*ht)i.parent=0&i!=*s1) break;*s2=i;for(i=1;i=n;i+)if(*ht)i.parent=0&i!=*s1&(*ht)i.weight(*ht)*s2.weight) *s2=i;void CreatHT(HuffmanTree *ht,int *w,int n)/构建赫夫曼树htint i,m,s1,s2;m=2*n-1;*ht=(HuffmanTree)malloc(m+1)*sizeof(HTNode);for(i=1;i=n;i+)(*ht)i.weight=wi;(*ht)i.lchild=(*ht)i.rchild=(*ht)i.parent=0;for(i=n+1;i=m;i+)(*ht)i.weight=(*ht)i.parent=(*ht)i.lchild=(*ht)i.rchild=0;for(i=n+1;i=m;i+)Select(ht,i-1,&s1,&s2);(*ht)s1.parent=(*ht)s2.parent=i;(*ht)i.lchild=s1;(*ht)i.rchild=s2;(*ht)i.weight=(*ht)s1.weight+(*ht)s2.weight;void HuffmanCoding(HuffmanTree *ht,HuffmanCode *hc,int n)/从叶子到根逆向求每个字符的赫夫曼编码int i,start,p;unsigned int c;char *cd;hc=(HuffmanCode*)malloc(n+1)*sizeof(char *); /分配n个编码的头指针cd=(char *)malloc(n*sizeof(char); /分配当前编码的工作空间cdn-1=0; /从右向左存放编码,首先存放末尾的编码结束符for(i=1;i=n;i+)/求每个结点的赫夫曼编码start=n-1; for(c=i,p=(*ht)i.parent;p!=0;c=p,p=(*ht)p.parent)if(*ht)p.lchild=c) cd-start=0; /左分支标记为0else cd-start=1; /右分支标记为1hci=(char *)malloc(n-start)*sizeof(char); /为第i个编码分配空间strcpy(hci,&cdstart);free(cd);for(i=1;i=n;i+)printf(%d-%sn,(*ht)i.weight,hci);void main()int *w;int i,n,m,j;HuffmanTree ht;HuffmanCode hc;printf(请输入赫夫曼树的结点个数:);scanf(%d,&n);w=(int *)malloc(n+1)*sizeof(int);printf(请输入结点的权值:n);for(i=1;i=n;i+)printf(第%d个结点的权值为:,i);scanf(%d,&j);wi=j;m=2*n-1;CreatHT(&ht,w,n);printf(赫夫曼编码为:n);HuffmanCoding(&ht,&hc,n);四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:1、产生的语法问题:在程序的调试过程中,出现某些变量在使用过程中未定义,以及出现“=”左右两个变量或常量的类型不匹配。 采取的措施:根据调试结果显示,修改相应的错误代码。2、产生的算法问题:在程序调试结果无误,但却无法运行。 采取的措施:在老师的帮助下,寻找并修改错误的算法代码。六、对算法的程序的讨论、分析,改进设想,其它经验教训:算法的讨论、分析:整个算法由三个函数构成:Select函数、CreatHT函数和HuffmanCoding函数。Select函数用于寻找weight最小的两个结点,时间复杂度约为O(n);CreatHT函数函数用于建造赫夫曼树,时间复杂度约为O(n);HuffmanCoding函数用于赫夫曼编码,时间复杂度约为O(n*n)。整个算法的时间复杂度约为O(n*n)。改进设

温馨提示

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

评论

0/150

提交评论