哈夫曼树 实验报告
- 格式:doc
- 大小:46.00 KB
- 文档页数:5
计算机科学与技术学院数据结构实验报告
班级2014级计算机1班学号20144138021 姓名张建华成绩
实验项目简单哈夫曼编/译码得设计与实现实验日期2016、1、5
一、实验目得
本实验得目得就是进一步理解哈夫曼树得逻辑结构与存储结构,进一步提高使用理论知识指导解决实际问题得能力。
二、实验问题描述
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但就是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来得数据进行译码,此实验即设计这样得一个简单编/码系统。系统应该具有如下得几个功能:
1、接收原始数据。
从终端读入字符集大小n,以及n个字符与n个权值,建立哈夫曼树,并将它存于文件hfm tree、dat中。
2、编码。
ﻩ利用已建好得哈夫曼树(如不在内存,则从文件hfmtree、dat中读入),对文件中得正文进行编码,然后将结果存入文件code中。
3、译码。
利用已建好得哈夫曼树将文件code中得代码进行译码,结果存入文件text中。
4、打印编码规则。
即字符与编码得一一对应关系。
5、打印哈夫曼树,
将已在内存中得哈夫曼树以直观得方式显示在终端上。
三、实验步骤
1、实验问题分析
1、构造哈夫曼树时使用静态链表作为哈夫曼树得存储。
在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点得信息,根据二叉树得性质可知,具有n个叶子结点得哈夫曼树共有2n-1个结点,所以数组HuffNode得大小设置为2n -1,描述结点得数据类型为:
Typedef strcut
{
ﻩInt weight;/*结点权值*/
Int parent;
Int lchild;
Int rchild;
}HNodeType;
2、求哈夫曼编码时使用一维结构数组HuffCode作为哈夫曼编码信息得存储。
求哈夫曼编码,实质上就就是在已建立得哈夫曼树中,从叶子结点开始,沿结点得双亲链域回退到根结点,没回退一步,就走过了哈夫曼树得一个分支,从而得到一位哈夫曼码值,由于一个字符得哈夫曼编码就是从根结点到相应叶子结点所经过得路径上各分支所组成得0、1序列,因此先得到得分支代码为所求编码得低位码,后得到得分支代码位所求编码得高位码,所以设计如下数据类型:
#define MAXBIT 10
Typedef struct
{
Int bit[MAXBIT];
ﻩIntstart;
}HCodeType;
3、文件hfmtree、dat、code与text。
2、功能(函数)设计
(1)、初始化功能模块。
此功能模块得功能为从键盘接收字符集大小n,以及n个字符与n个权值。
(2)、建立哈夫曼树得功能模块。
此模块功能为使用1中得到得数据按照教材中得构造哈夫曼树得算法构造哈夫曼树,即将Huf fNode数组中得各个位置得各个域都添上相关得值,并将这个结构体数组存于文件hfmtree、dat中。(3)、建立哈夫曼编码得功能模块。
此模块功能为从文件hfmtree、dat中读入相关得字符信息进行哈夫曼编码,然后将结果存入code 中,同时将字符与0、1代码串得一一对应关系打印到屏幕上。
(4)、译码得功能模块。
此模块功能为接收需要译码得0、1代码串,按照3中建立得编码规则将其翻译成字符集中字符所组成得字符串形式,存入文件text,同时将翻译得结果在屏幕上打印输出。
(5)、打印哈夫曼树得功能模块。
此模块功能为从HuffNode数组中读入相关得结点信息,以图形得方式将各个结点以及叶子结点得权值与左分支上得0与右分支上得1画出来。
四、实验结果(程序)及分析
1、实验主要代码
typedef struct/*结点结构体*/
{
string hfmstr; /*结点内容*/
ﻩint weight; /*结点权值*/
int parent;
int lchild;
int rchild;
}HNodeType;
typedef struct /* 编码结构体 */
{
intbit[MAXBIT];
int start;
}HCodeType;
void Create_HuffMTree(HNodeType HFMTree[],int n) /*创建哈夫曼树*/
{
ﻩintm1,x1,m2,x2;
ﻩint i,j;
ﻩfor(i=0;i<2*n-1;i++)
ﻩ{
ﻩHFMTree[i]、hfmstr="";
HFMTree[i]、weight=0;
ﻩHFMTree[i]、parent=-1;
HFMTree[i]、lchild=-1;
HFMTree[i]、rchild=-1;
ﻩ}
ﻩfor(i=0;i ﻩ{ cout<<"请输入第"<<i+1<<"个权值"<<endl; ﻩcin>>HFMTree[i]、weight; ﻩcout<<"请输入对应字符"<<endl; ﻩcin>>HFMTree[i]、hfmstr; ﻩ} for(i=0;i ﻩ{ ﻩx1=x2=MAXVALUE; ﻩm1=m2=0; for(j=0;j ﻩﻩ{ ﻩﻩif(HFMTree[j]、parent==-1&&HFMTree[j]、weight ﻩﻩ{ ﻩx2=x1; ﻩﻩﻩm2=m1; ﻩx1=HFMTree[j]、weight; m1=j; ﻩ} ﻩﻩﻩelse if(HFMTree[j]、parent==-1&&HFMTree[j]、weight ﻩ{ x2=HFMTree[j]、weight; ﻩm2=j; ﻩ} ﻩﻩ} ﻩHFMTree[m1]、parent=n+i; HFMTree[m2]、parent=n+i; ﻩﻩHFMTree[n+i]、weight=HFMTree[m1]、weight+HFMTree[m2]、weight; ﻩHFMTree[n+i]、lchild=m1; ﻩHFMTree[n+i]、rchild=m2; } ﻩcout<<"创建哈夫曼树成功!"< } void HaffmanCode(HNodeType HFMTree[],HCodeType HuffCode[],int n) /*构建哈夫曼编码*/ { ﻩHCodeType cd; int i,j,c,p; for(i=0;i { cd、start=n-1; c=i; p=HFMTree[c]、parent; while(p!=-1) { if(HFMTree[p]、lchild==c) cd、bit[cd、start]=0; else