哈夫曼编码资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈夫曼编码译码系统
一、需求分析
1、程序的基本功能:
①构造哈夫曼树及哈夫曼编码:从终端读入字符集大小n、n个字符以及n个对应的权
值,建立哈夫曼树;利用已将建好的哈弗曼树求每个叶结点的哈夫曼编码,并保存。
②编码:利用已构造的哈弗曼编码对“明文”文件中的正文进行编码,然后将结果存
入“密文”文件中。
③译码:将“密文”文件中的0、1代码序列进行译码。
④打印“密文”文件:将文件以紧凑格式显示在终端上,同时,将此字符形式的编码
保存。
⑤打印哈夫曼树:将已在内存中的哈夫曼以凹入表形式显示在终端上。
2、输入输出要求:
①从键盘接收字符集大小n、以及n个字符和n个权值;
②构造哈夫曼树:将HFMTree数组中的各个位置的各个域都添上相关的值,并将结构
体数组存入文件HTree.txt中。
③打印哈夫曼树:从HFMTree数组读取相关的结点信息,以凹入表方式将各个结点画
出来;
④构造哈夫曼编码:先从文件HTree.txt中读入相关的字符信息进行哈夫曼编码,将字
符与其对应的编码存入文件HNode.txt中;
⑤编码:利用已构造的哈夫曼树对文件进行编码,打印结果,并将结果存入新建文件
中;
⑥译码:将密文文件中的内容利用HNode.txt中建立的编码规则进行翻译,打印结果,
并将结果存入新建文件中。
3、测试数据:
输入叶子结点个数为4,权值集合为{1,3,5,7},字符集合为{A,B,C,D},且字符集与权值集合一一对应。
二、概要设计
1、抽象数据类型的定义:
①采用静态链表作为哈夫曼树的存储结构;
②求哈夫曼编码时使用一维数组HCode作为哈夫曼编码信息的存储。
2、主模块的流程及各子模块的主要功能:
①int main()
{
主菜单;
swich语句结构选择;
return 0;
}
②in_park()
{
输入车牌号;
若停车场已满,停入便道中,否则停入停车场;
}
③output()
{
输入所要离开车辆的车牌号,以及离开时间;
停在便道内的第一辆车进入停车场;
}
③show_car()
{
依次显示停车场内的车辆信息;
}
show_queue()
{
依次显示便道内的车辆信息;
}
3、模块之间的层次关系:
主函数
Creat output show_car show_queue
judge
三、详细设计
1、定义的相关数据类型:
①哈夫曼树结点:
typedef struct
{
int weight;
int park;
int lchild;
int rchild;
char ch;
}
②哈弗曼编码结点:
typedef struct
{
Car Park[MAX_PARK];
int top;
}ParkStack;
2、函数的调用关系:
main
in_park output show_car show_queue
judge
四、调试分析
调试中遇到的问题及对问题的解决方法:
⑴遇到的问题:
①编码时最后一位总是多出一位数字;
②编码时出现无限循环;
⑵解决方法:
①改变构造哈夫曼树时的循环条件;
②改变构造哈夫曼编码的循环条件;
五、使用说明及测试结果
1、使用说明:
①进入主菜单,选择所要进行的操作;
②构造哈夫曼树:输入叶结点个数,及其字符与权值;
③选择显示哈夫曼树,哈夫曼树以凹入表形式显示;
④选择构造哈夫曼编码,即构造哈夫曼编码,若成功,则显示成功;
⑤选择编码:选择进行键盘输入或者从文件中获取。
2、测试结果:
停车场容量为5,连续有7辆车到来,牌照号分别为f001、f002、f003、f004、f005、f006、f007,前5辆车进入停车场1-5号车位,第6、7辆车停入便道的1、2号位置上。牌照号为f003的车辆从停车场开走后,f006从便道进入停车场,便道上只剩f007。
六、伪码算法
#include
#include
#include
#include
#include
#include
#include "stdlib.h"
#define N 4
#define MAXVSLUE 1000
typedef struct
{
char letter;
int weight;
int parent;
int lchild;
int rchild;
}HNodeType;
HNodeType HNode[2*N-1];
#define MAXBIT 10
typedef struct
{
char bit[MAXBIT];
int start;
}HCodeType;
HCodeType HCode[N];
void Creat_HuffMtree(HNodeType HFMTree[],int n) ; /* 构造哈夫曼
树*/
void HaffmanConde(HNodeType HFMTree[], HCodeType HuffCode[]);
void Display();