问题描述
在一个加密应用中,要处理的信息来自下面的字符集,各个字符的相关使用频度如下:
字符 |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
频度 |
180 |
64 |
13 |
23 |
32103 |
22 |
15 |
47 |
57 |
1 |
5 |
31 |
20 |
字符 |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
频度 |
55 |
63 |
15 |
1 |
48 |
56 |
80 |
25 |
7 |
18 |
2 |
16 |
1 |
现请编写程序你实现如下功能:
(1)运行时,由用户输入来初始化字符集大小和相应用字符。
(2)输入一个要加密的字符串,将其加密。
(3)输出解密字符串。
问题分析
根据上述问题描述,可以看出编写的程序是通过利用二叉树结构实现哈夫曼编码和译码,并且程序需具有以下要求:
(1) 初始化:能够让用户输入字符和相应字符的频度来初始化,并建立哈夫曼树。
(2) 建立编码表:利用已经建好的哈夫曼树进行编码,并将每个字符的编码进行输出,打印哈夫曼编码表。
(3) 译码:利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。
运用哈夫曼算法的相关知识解决问题。以用户输入的字符作为需要编码的字符集合,而每个字符对应的频度则作为该字符的权值,构造一棵哈弗曼编码树,规定哈弗曼编码树的左分支代表0,右分支代表1,则从根结点到每个叶子结点所经过的路径组成的0和1的序列便为需要加密字符的编码。
本次课程设计内容涉及到哈夫曼树,哈夫曼编码,哈夫曼算法,二叉树的结构,二叉树和树的应用等等方面知识。
逻辑结构和存储结构设计
1. 逻辑结构设计
逻辑结构:数据的逻辑结构是树状结构。
2. 存储结构设计
(1) 采用静态的三叉链表存放。
算法思想:
申请存储哈夫曼编码串的头指针数组,申请一个字符型指针,用来存放临时的编码串;
从叶子节点开始向上倒退,若其为它双亲节点的左孩子则编码标0,否则标1;直到根节点为止,最后把临时存储编码复制到对应的指针数组所指向的内存中;
重复上述步骤,直到所有的叶子节点都被编码完;
(2) 设计一个结构体Element保存哈夫曼树中各结点的信息,包括:
Weight保存结点的权值;
Lchild保存结点的左孩子在数组中的下标;
Rchild保存结点的右孩子在数组中的下标;
Parent保存结点的双亲结点在数组中的下标。
struct Element //哈夫曼树结点的结构体
{
char ch; //字符