一.实验任务
在一个加密应用中,要处理的信息来自下面的字符集,各个字符的相关使用频度如下:
字符空格 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]; //存放哈夫曼编码