数据结构课程设计-哈夫曼编码实验报告.doc
文本预览下载声明
数据结构课程设计报告
实验二 哈夫曼编码
目录
问题描述及分析 p1
1.问题描述 p1
2.需求分析 p1
功能模块及数据结构描述 p1
1.数据结构描述 p1
2.模块描述 p2
三.主要算法流程描述 p2
1.编码流程图 p3
2.译码流程图 p4
四.使用说明 p5
五.调试分析说明 p6
问题描述及分析
1.问题描述
设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件(后缀名.cod);反过来,可将一个编码文件还原为一个文本文件(.txt)。
2.需求分析
(1)输入一个待压缩的文本文件名,统计文本文件中各字符的个数作为权值,生成哈夫曼树;
(2)将文本文件利用哈夫曼树进行编码,生成编码文件(后缀名cod);
(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码;
(4)显示指定的编码文件和文本文件;
3.运行要求
.Windows xp/2003
.VC++6.0(或以上)运行库
功能模块及数据结构描述
1.数据结构描述
typedef struct
{
long weight;
long lchild,rchild,parent;
}hfmt;
hfmt t[2*256-1];
存放哈夫曼树结构体,weight为节点权值,lchild,rchild为节点的左右孩子在向量中的下标(为叶节点时,两值为:-1),parent为节点的双亲在向量中的下标(用来区别根与非根节点,值为-1与非-1)。
typedef struct
{
char bits[256];
long s;
}hfmcc;
hfmcc cc[256];
存放哈夫曼编码结构体,s用来指示编码在位串bits[n]中的起始位置。
2.模块描述
图2.1 系统函数
copy函数:根据s的值在位串bits[n]中提取有效编码位数。
HFM函数:对读入的节点权值,生成哈夫曼树。
HFMBM函数:对生成的哈夫曼树进行零一编码,对应于原文件字符。
三.主要算法流程描述
1.编码流程图
图2.2 编码流程图
2.译码流程图
图2.3 译码流程图
四.使用说明
图2.4 生成的文件
本软件默认生成的编码文件名为:a.cod
默认生成的译码文件名为:b.txt
执行提示:输入所要编码的文本文件。
图2.5 编码过程
编码完成,默认生成a.cod文件,等待译码。
输入所要译码的cod文件:
图2.6 译码过程
译码完成,默认生成b.txt文档文件。
五.调试分析说明
表2.1 调试遇到的问题及解决方案
遇到的问题 分类 解决方法 根据所提供的权值不能正确生成哈夫曼树 数据结构基础 哈夫曼树结构体的lchild,rchild,parent用-1初始化,因为0也可能是节点,防止造成冲突
根据生成的哈夫曼树不能有效的生成哈夫曼编码,编码文件中会存在乱码
数据结构基础 所给存储编码的位串数组bits[256]空间大小固定,权值较大的编码长度较短,后半数组空间会有乱码产生,引入函数copy(),根据编码起始位s来截取编码有效位写入文件。
根据编码文件,无法还原生成文本文件,并提示编码错误。
数据结构基础 开始节点i=256*2-1为空节点,其左右孩子指向未知地址空间,无法进入哈夫曼树的扫描,将开始节点改为i=256*2-2,此节点才是哈夫曼树的根节点,问题得以解决。 哈夫曼编码无法与原文本字符对应,在编码结构体添加字符变量去存储相应字符,得不到期望的效果。
C语言基础 构造哈夫曼树时,将其字符的ASCLL码的值与哈夫曼树结构体数组的下标相对应,译码时,直接将其下标当作字符写入文件,问题得以解决。
六.参考文献
严蔚敏,吴伟民,《数据结构》(C语言版)[
显示全部