数据结构课程设计-赫夫曼编码 联系客服

发布时间 : 星期一 文章数据结构课程设计-赫夫曼编码更新完毕开始阅读

3、译码

21

时间复杂度:

min(HfmTeee &t,int x) O(n) CreateHfmTree(HfmTeee H,HuffCode code,int leaves) O(n) Decoding(HfmTeee h,HuffCode code,int leaves) O(n) Encoding(HfmTeee H,HuffCode code,int leaves) O(n)

Print() O(1)

调试分析:

1、写完运行,有很多细节错误。 解决方法:

根据错误提示依次修正。

2、第一次成功运行,因为有字符的输入,没有注意,导致在建树的时候,第一个字符变成了回车符。 解决方法:

在输入n之后补加了一句getchar();语句以解决错误。

3、运行时,提示警告n,h,code未初始化。 解决方法:

对n初始化为0,h,code为NULL。

4、从文件中读入时出现错误,以及对code和h的申请动态有误。

22

问题解决:

因为通过”>>”文件读取时,以空格作为结束符,因此,通过get读取,iFile.get(ch)读取时可以读取所以字符,包括空格和换行符,因此,iFile.get(ch)要运行两次,第一次,目的是接受换行符,第二次,接收的才是相应的字符。

5、运行时提示错误:无法写入! 问题解决:

设定断点后找到,在编码、译码函数中,在从文件中读取哈夫曼码时,二阶字符指针code只进行了依次申请二维数组空间,将代码复制给code[i]时,未对code[i]进行申请动态。code[i]=(char*)malloc((l+1)*sizeof(char));

六、总结

首先要说的是,题意的不明确,或者说是不合理:

“在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入。每次执行中不一定执行I命令,因为文件hfmTree可能早

已建好。”

此句话有歧义。

本次课程设计,主要是为了熟悉对哈夫曼树的建立以及哈夫曼码的使用,在建树的时候,可以通过构建一个节点:

typedef struct { char ch; int parent; int lchild; int rchild; int weight; }HtNode,*HfmTeee;

以存储树节点的信息,在通过一个二阶字符指针: typedef char **HuffCode; 来存储经过编译后的代码。

我在写的时候,刚开始考虑到I:初始化 操作每次运行exe时,可能不一定运行,可以从hfmTree文件中读入个字符的哈夫曼码值,因此在定义结构体数组的时候,打算把 HfmTeee H;H[0].weight用来存储n,从而在从hfmTree文件中读取的时候,可以得到字符的数目n,以申请相应的数组空间。因此,H的存储,从H[1]开始!从文件中读取字符的哈夫曼码值的时候,要注意空格字符的读取要用get(c)函数,同时注意接收换行符’\\n’。

23

在初始化的时候,本来是按书上写的,但是后来发现,书上的不是很简便,会对前n个节点重复初始化操作,因此先输入n个字符的信息,然后再对剩下n+1到2*n-1的节点进行初始化。

在输入字符时,不能使用cin输入,因为cin是不能接收空格的,必须用scanf。 对哈夫曼树的打印,首先我想到的是建立一个大的字符数组tree[10000][10000],根据每个字符的哈夫曼码值来确定相应字符的位置,例如111对应的位置是tree[3][7];但是这样虽然很简单,却容易暴栈,当树深超过15时便会暴栈。

其实很多细节,只有在去写的时候才会发现,才会暴露出来,书本上的知识是很少的,很多东西,要靠自己平时多去练习,在练习中产生错误,通过上网查找等途径解决错误,以增长自己的知识点和调试能力。

程序这种东西,就是写出来就感觉很简单,想着也不能,但是实现的时候,有时候会有这里那里的小错误阻碍程序的正确运行,很多时候,与其说是写程序不如说是对细节的检测。

24