计算机算法
课程设计报告
计算 1* -- * 班
第 * 组
名
成
绩
学
号
1********7
1********2
1********2
1********4
姓
***
**
**
***
课程设计报告的基本内容
1、概述
1)任务:哈夫曼编码/译码器。利用哈夫曼算法的编码和译码系统,可以接
收从键盘输入的字符集大小、字符和权值信息,创建哈夫曼树生成哈夫曼编码并
能对其进行解码。
2)设计内容:
1.存储结构:分别采用动态和静态存储结构;
2.哈夫曼编码与译码功能;
3.显示哈夫曼树。
3)分工说明:
**:哈夫曼朱初始化,编码并显示编码。
**:动态存储与静态存储,译码功能。
***:界面设计优化,将权值数据存放在数据文件中。
***:显示哈夫曼树,汇总代码。
2、总体设计
1)软件结构设计:本程序主要分为 4 个模块(功能模块图见下图):主模块、
编码模块、译码模块、显示哈夫曼树模块。程序的主体部分,分别调用各个模块,
实现各项功能。编码模块:对每个出现的字符进行编码。译码模块:将已有编码
译成字符,使之可以直接被读出。显示模块:将建立的哈夫曼书打印出来。
哈夫曼编码/译码器
主
模
块
编
码
模
块
译
码
模
块
显
示
Hufffman
树
2)数据结构设计:
全局变量:number 作用:用来打印哈夫曼树每个节点前空格数量。
数组:HTNode HFT[26] 作用:静态存储哈夫曼树。
结构体:typedef struct
{
char character;
//权重
int weight;
int parent,lchild,rchild;
}HTNode, *HuffmanTree;
typedef char * *HuffmanCode;
//双亲,左、右孩子
//哈夫曼树(动态分配数组)
//哈夫曼编码表
作用:动态建立哈夫曼树。
文件:据文件 data.txt。作用:将权值数据存放在数据文件中。
类:class Huffman 作用:创建哈夫曼树。
3、详细设计及实现
哈夫曼树的建立由赫夫曼算法的定义可知,初始森林中共有 n 棵只含有
根结点的二叉树。算法的第二步是:将当前森林中的两棵根结点权值最小的
二叉树,合并成一棵新的二叉树;每合并一次,森林中就减少一棵树,产生
一个新结点。显然要进行 n-1 次合并,所以共产生 n-1 个新结点,它们都
是具有两个孩子的分支结点。所以,最终求得的哈夫曼树中一共有 2n-1 个
结点,其中 n 个结点是初始森林的 n 个孤立结点,剩余 n-1 结点为新合成节
点。并且哈夫曼树中没有度数为 1 的分支结点。因此我们利用一个大小为
2n--1 的一维结构体数组来存储哈夫曼树中的结点。
哈夫曼编码是可变字长编码。编码时借助哈夫曼树,也即带权路径长度
最小的二叉树,来建立编码。
译码的思想是:输入译码码值,并与原先生成的哈夫曼编码表比较,遇
到相等时,就取出与之相对应的字符存入一个新串中。
程序调试情况:
程序测试情况:
程序运行首先出现的界面:
选择操作 1 后,输入相应的字符及其权值,生成哈夫曼树。系统会显示对字
符串进行哈弗曼编码,并将其进行动态和静态存储,进而将权值数据存放在数据
文件 data.txt 中。
选择步骤 2 后,将哈夫曼树生成的哈夫曼编码显示出来。
选择操作 3 后,输入字符串,系统会显示对字符串进行哈弗曼编码得到的哈
弗曼编码。
选择操作 4 后,输入哈夫曼编码,系统会对哈夫曼编码进行译码,用哈夫曼
编码翻译成的字符。
选择操作 5 后,打印哈夫曼树。
选择操作 0 后,退出系统。