哈夫曼树的构造和应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机软件技术基础》实验报告

实验名称:实验三哈夫曼树的应用和实现

实验目的:掌握哈夫曼树的基本构造,并能运用哈夫曼树实现前缀编码。

实验内容:完成下述功能:

(1)根据输入的字符和相应的权重建立哈夫曼树,并输出已经建立的相应内容作为检查;

(2)运用哈夫曼树实现前缀编码,并输出各字符的编码串;

(3)输入一组二进制报文,进行译码,并输出译文。

实验要求:

(1)数据元素为字符,其相应的权值为float;

(2)对实验内容进行算法设计,将编制的程序输入计算机,编译运行;

(3)程序的实际功能与上述所列功能不完全相符,调试程序,找出问题所在,并纠正。

(4)以教材中P162的例为数据,验证结果,并给出相应的说明。

实验原理:哈夫曼树的构造和应用(流程图)。

1,建立哈夫曼树

,2,构建哈夫曼编码表

,3,译码过程是编码的逆过程,算法流程图此处省略。

编译环境:PC中C++

实验调试及分析处理:

1,实验调试过程中出现以下错误:

分析处理:程序运行出现上述错误,调试很久后发现,此问题主要是在调用译码函数时出错,原因是译码函数与主函数之间数据传递出现问题,修改后问题得到解决。

2,实验调试过程中出现以下错误:

分析处理:程序运行出现上述错误,明显与书本上的例题运行结果不一致,程序也没发现什么大的错误,与同学讨论后发现原因,if(ht[j].parent==0&&m1>ht[j].weight)

{m2=m1;k2=k1;

m1=ht[j].weight;k1=j;

}

else

if(ht[j].parent==0&&m2>ht[j].weight)

这段程序应该改成if(ht[j].parent==0&&(m1-ht[j].weight)>=0.000001)

{m2=m1;k2=k1;

m1=ht[j].weight;k1=j;

}

else

if(ht[j].parent==0&&(m2-ht[j].weight)>=0.000001)。改完以后运行结果与课本一致。3,实验调试过程中出现以下错误:

分析处理:程序运行中出现错误,主要是未理解scanf函数的应用,输入时若是一串二进制数字相邻输入,会当成一个数字读入,导致出错,修改输入方式后,再次运行这个错误消除。

实验结果:

1,哈夫曼树的构造,并输出已经建立的相应内容作为检查;2,运用哈夫曼树实现前缀编码,并输出各字符的编码串

3.输入一组二进制报文,进行译码,并输出译文。

实验结果分析及总结

这次实验的收获主要是对哈夫曼树的结构有了更深入的理解,以及利用哈夫曼树的前缀编码,这是本课程的重点,应该注重学习。本次实验结果基本正确,能完全实现实验要求的功能,但也存在不足的地方,如运行界面不美观,程序语句不精练,有些地方可以更加简单等等。这些都需要我在以后的实验中着重注意并加以学习,另外,这次实验编程个人所花时间较长,这说明我对知识点不够熟悉,掌握程度不够,在今后的学习中应该更加严谨,虚心向同学学习,不懂的地方应该先自己理解再交流。

参考资料:《计算机软件技术基础教程》,刘彦明;《C语言设计》。

附:实验三哈夫曼树的应用和实现源程序。

#include"stdio.h"

#define maxbit 10 /*定义哈夫曼编码最大长度*/ #define maxvalue 10000 /*定义最大权值常量*/ #define maxnodenumber 100 /*定义结点最大数目常量*/

typedef struct /*定义结点结构*/ {float weight;

char data;

int parent,lchild,rchild;

}htnode;

typedef struct /*定义保存一个叶子结点哈曼编码的结构*/ {int bit[maxbit];

int start;

}hcodetype;

hcodetype cd[maxbit];

void main() /*主函数*/

{void huffmancode(htnode ht[],int n);

void huffmandecode(hcodetype cd[],htnode ht[],int n);

htnode ht[maxnodenumber];

int i,j,k1,k2,n,a;

float m1,m2;

printf(" 哈夫曼树的构造及应用\n");

printf("请输入叶子数目n: "); /*提示输出叶子结点个数*/

scanf("%d",&n);

printf("Please input data and weight:\n"); /*提示输出各叶子结点的权值*/ for(i=0;i<2*n-1;i++)

{ht[i].weight=0.00000;

ht[i].data='0';

ht[i].parent=0;

ht[i].lchild=0;

ht[i].rchild=0;

}

for(i=0;i

{fflush(stdin);

scanf("%c %f",&ht[i].data,&ht[i].weight);}

for(i=0;i

{m1=maxvalue;

m2=maxvalue;

k1=0;k2=0;

for(j=0;j

相关文档
最新文档