哈夫曼编码/译码器设计与实现

设计要求

设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。
基本要求:
(1)将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中)
(2)分别采用动态和静态存储结构
(3)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;
(4)编码:利用建好的哈夫曼树生成哈夫曼编码;
(5)输出编码;
(6)设字符集及频度如下表:
字符 空格 A B C D E F G H I J K L M
频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20
字符 N O P Q R S T U V W X Y Z
频度 57 63 15 1 48 51 80 23 8 18 1 16 1
(7)译码功能;
(8)显示哈夫曼树;
(9)界面设计的优化。

设计思路

哈夫曼树的建立由赫夫曼算法的定义可知,初始森林中共有n棵只含有根结点的二叉树。算法的第二步是:将当前森林中的两棵根结点权值最小的二叉树,合并成一棵新的二叉树;每合并一次,森林中就减少一棵树,产生一个新结点。显然要进行n-1次合并,所以共产生n-1个新结点,它们都是具有两个孩子的分支结点。所以,最终求得的哈夫曼树中一共有2n-1个结点,其中n个结点是初始森林的n个孤立结点,剩余n-1结点为新合成节点。并且哈夫曼树中没有度数为1的分支结点。因此我们利用一个大小为2n–1的一维结构体数组来存储哈夫曼树中的结点。
哈夫曼编码是可变字长编码。编码时借助哈夫曼树,也即带权路径长度最小的二叉树,来建立编码。
译码的思想是:输入译码码值,并与原先生成的哈夫曼编码表比较,遇到相等时,就取出与之相对应的字符存入一个新串中。

数据结构设计

2)数据结构设计:
全局变量:number 作用:用来打印哈夫曼树每个节点前空格数量。
数组:HTNode HFT[26] 作用:静态存储哈夫曼树。
结构体:

typedef struct
{
	char character; 
	int weight;		//权重
	int parent,lchild,rchild;	//双亲,左、右孩子 
}HTNode, *HuffmanTree;		//哈夫曼树(动态分配数组)
typedef char * *HuffmanCode;	//哈夫曼编码表 

作用:动态建立哈夫曼树。
文件:据文件data.txt。作用:将权值数据存放在数据文件中。
类:class Huffman 作用:创建哈夫曼树。

总体设计

软件结构设计:本程序主要分为4个模块(功能模块图见下图):主模块、编码模块、译码模块、显示哈夫曼树模块。程序的主体部分,分别调用各个模块,实现各项功能。编码模块:对每个出现的字符进行编码。译码模块:将已有编码译成字符,使之可以直接被读出。显示模块:将建立的哈夫曼书打印出来。

原文地址:https://download.csdn.net/download/zjb18741809273/12518635

你可能感兴趣的:(实验报告)