数据结构课程设计-哈夫曼树

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

嘉应学院计算机学院

实验报告

课程名称:数据结构课程设计

开课学期:2017-2018学年第2学期

班级:

指导老师:

实验题目:哈夫曼树

学号:

姓名:

上机时间:

一、实验目的

本实验的目的是通过对简单的哈夫曼编/译码系统的设计与实现来熟练掌握树形结构在实际问题中的应用。

二、实验问题描述

利用哈夫曼编码进行通信可以大大提高通信利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此试验即设计这样的一个简单的编/译码系统。系统应该具备如下的几个功能。

1、求出各个叶子节点的权重值

输入一个字符串,统计其中各个字母的个数和总的字母个数。

2、构造哈夫曼树

统计出的字母种类为叶子结点个数,每个字母个数为相应的权值,建立哈夫曼树。

3、打印哈弗曼树的功能模块

按照一定形式打印出哈夫曼树。

4、编码

利用已经建立好的哈夫曼树进行编码。

5、译码

根据编码规则对输入的代码进行翻译并将译码。

三、实验步骤

1、实验问题分析

(1)设计一个结构体数组保存字母的类型和个数。

{

; 字母的种类

; 字母的个数

};

(2)在构造哈夫曼树时,设计一个结构体数组保存哈夫曼树中各结点

的信息,根据二叉树的性质可知,具有n个结点的哈夫曼树共有21个结点,所以数组大小设置为21,描述结点的数据类型为:

{

; 权值

; 双亲

; 左孩子

; 右孩子

};

[]; 定义此类型的数组

(3)求哈夫曼编码,实质上是在已经建立的哈夫曼树中,从叶子结点开始,沿着结点的双亲链表域退回到根节点,每退回一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼值,由于一个字符的哈夫曼编码是从根结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所以设计如下的数据类型:

10;

{

[]; 每个结点的哈夫曼编码

; 开始位置

};

(4)设置全局变量。

s; 为输入的字符串

0; 记录输入的字符串中字母的种类,即叶子结点个数

0; 记录字符串中字母的总个数

[]叶子结点类型

2、功能(函数)设计

(1)统计字母种类和个数模块

此模块的功能为从键盘接受一个字符串,统计字符串中字母种类即结

点个数,每种字母出现次数即各叶子结点的权值。全局变量s保存输

入的字符串,将种类和个数保存到[]中。

函数原型:()

如输入的字符串是“”则显示如下。

(2)哈夫曼树的建立模块

此模块的功能为从(1)中计算出的结点个数和各个叶子结点的权值

构造一棵哈弗曼树。

函数原型:* ()函数返回结点类型的数组

(3)打印哈弗曼树的功能模块

此模块的功能是将由(2)建立的哈弗曼树按照一定规则<>打印在屏幕

上。

函数原型: ( *)

如输入的字符串是””,则构造的哈夫曼树为

(4)建立哈夫曼编码的功能模块

此模块功能为将(2)中建立的哈夫曼树进行哈弗曼编码,然后将字符

与对应的0、1代码串打印到屏幕上。

函数原型: ( *)

如输入的字符串是“”,则每个字母的代码和输入的字符串的哈夫曼编

码是

(5)译码的功能模块

此模块的功能为接收需要译码的0和1代码串,按照(4)中建立的编

码规则将其翻译成字符集中字符所组成的字符串形式,并将翻译的结

果在屏幕上打印出来。

函数原型: ( *)

如输入的代码串是“110111100”,则对应的字符串是“”

四、实验结果(程序)及分析

1、实验主要模块代码

(一)函数功能:统计字母种类和个数模块

()

{

;

<<"请输入字符串"<<;

>>s; 为输入的字符串

(s[v]){;}

<<"共有字符"<

[0][0][0]1;

(1<) 统计s中字母种类和个数{

(0<)

{([m][k]){[m];}}

(m>n){[][k][n]1;}

}

(0<) 输出种类和个数

<<"字符"<<[m]<<"有"<<[m]<<"个"<<;

}

(二)函数功能:哈弗曼树的建立模块

* (){

* ;

1212; 1记录最小的重权值,m2为次小

(0<2*1){ 结点初始化

[i]1;

[i]0;

[i]1;

[i]1;

}

(0<) 将每个字母的个数当做叶子结点的权值

[i][i];

(0<1){

m12;

x12=0;

(0<){

([j]1 [j]

m21;

x21;

m1[j];

x1; 1记录最小重权值在数组中的下标 }

([j]1 [j]

m2[j];

x2; 2记录次小重权值在数组中的下标

}

}

[x1];

[x2];

[]12;

[]1;

相关文档
最新文档