一.实验任务
在一个加密应用中,要处理的信息来自下面的字符集,各个字符的相关使用频度如下:
字符空格 A B C D E F G H I J K L M
频度 180 64 13 23 32103 2215 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 8025 7 18 2 16 1
现请编写程序你实现如下功能:
(1)运行时,由用户输入来初始化字符集大小和相应用字符。
(2)输入一个要加密的字符串,将其加密。
(3)输出解密字符串。
二.功能
(1)输入一串字符,建立哈夫曼树
(2)得到哈夫曼编码
(3)实现哈夫曼译码
三.基本思想
(1)初始化:输入字符以及其频度
构造哈夫曼树
构造哈夫曼树基本思想:
(2)加密:输入字符,输出哈夫曼编码
(3)解密::输入哈夫曼编码,输出字符代码
(4)退出
四.数据结构与算法分析
应用哈夫曼树
该哈夫曼树采用双亲孩子表示法存储,构造哈夫曼树的叶子结点有n个,合并次数n-1,则森林中公有2n-1棵树
1.哈夫曼树结点构造
定义节点结构体,结构体类型名为huffnode
typedef struct {
char data; //节点值
int weight; //结点的权重
int parent; //双亲结点
int lchild; /保存该结点的左孩子结点右孩子结点在数组中的位置
int rchild; //保存该结点的右孩子结点右孩子结点在数组中的位置
} huffnode;
2.哈夫曼编码结构,结构体类型名为huffcode
typedef struct {
charcd[MAX]; //存放哈夫曼编码
intstart; //编码的起始下标
}huffcode;
3.主函数
五.完整程序代码
#include<iostream.h>
#include<stdio.h>
#include<malloc.h>
#define MAX 26 //节点允许的最大数量26
/*哈夫曼树结点结构*/
typedef struct { //定义一个新数据类型即结点结构
char data; //节点值
int weight; //结点的权重
int parent; //保存该结点的双亲结点在数组中的下标
int lchild; //保存该结点的左孩子结点在数组中的位置
int rchild; //保存该结点的右孩子结点右孩子结点在数组中的位置
} huffnode; //定义结构体类型名为huffnode
/*哈夫曼编码结构*/
typedef struct { //定义保存一个叶子结点的哈夫曼树编码的结构
char cd[MAX]; //存放哈夫曼编码
int start; //编码的起始下标
} huffcode; //编码结构体类型名为huffcode
/*主函数*/
int main() {
huffnode ht[2*MAX]; //定义一个数组,用于存放哈夫曼树的各个节点信息
huffcode hcd[MAX], d; //定义huffmancode类型的hcd【】数组和huffmancode类型的变量d,用于保存每个结点到根节点路径所对应的编码
int i, j, f, l, r, n, c, s1, s2;
cout<<"* * * * * * * * * * * * * * * * * * * * * ** * * * * * \n" <<"\n加密应用:对字符串进行加密与解密\n" <<"* * * * * * * * * * * * * * ** * * * * * * * * * * * * \n";
/*用户输入来初始化字符集大小和相应用字符及其频度*/
cout<<"\n请输入元素个数:";
cin>>n;
cout<<"请输入各个元素的结点值与频度:\n";
for(i=1;i<=n;i++) {
cout<<" 第"<<i<<"个元素-->\n\t结点值:";
cin>>&ht[i].data;
cout<<"\t频 度:";
cin>>ht[i].weight;
}
/*构造叶子节点个数为n权值为weight的哈夫曼树*/
for(i=1;i<=2*n-1;i++) /*初始化,所有结点均没有双亲和孩子*/