一、要解决的问题
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
二、算法基本思想描述:
根据给定的字符和其中每个字符的频度,构造哈夫馒树,并输出字符集中每个字符的哈夫曼编码.将给定的字符串根据其哈夫曼编码进行编码,并进行相应的译码.
三、设计
1. 数据结构的设计
(1)哈夫曼树的表示
设计哈夫曼树的结构体(htnode),其中包含权重、左右孩子、父母和要编码的字符。用这个结构体(htnode)定义个哈夫曼数组(hfmt[])。
迷宫定义如下:
typedef struct
{
int weight;
int lchild;
int rchild;
int parent;
char key;
}htnode;
typedef htnode hfmt[MAXLEN];
(2)对原始字符进行编码
初始化哈夫曼树(inithfmt)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
并显示出每个字符的编码。
1.void inithfmt(hfmt t)//对结构体进行初始化
2.void inputweight(hfmt t)//输入函数
3.void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数
4.void creathfmt(hfmt t)//创建哈夫曼树的函数
5.void phfmnode(hfmt t)//对字符进行初始编码
(3)对用户输入的字符进行编码
void encoding(hfmt t)//对用户输入的电文进行编码
{
char r[1000];//用来存储输入的字符串
int i,j;
printf("\n\n请输入需要编码的字符:");
gets(r);
printf("编码结果为:");
for(j=0;r[j]!='\0';j++)
for(i=0;i
if(r[j]==t[i].key)
hfmtpath(t,i,j);
printf("\n");
}
(4)对用户输入的字符进行编码
void decoding(hfmt t)//对用户输入的密文进行译码
{
char r[100];
int i,j,len;
j=2*n-2;//j初始从树的根节点开始
printf("\n\n请输入需要译码的字符串:");
gets(r);
len=strlen(r);
printf("译码的结果是:");
for(i=0;i
{
if(r[i]=='0')
{
j=t[j].lchild;
if(t[j].lchild==-1)
{
printf("%c",t[j].key);
j=2*n-2;
}
}
else if(r[i]=='1')
{
j=t[j].rchild;
if(t[j].rchild==-1)
{
printf("%c",t[j].key);
j=2*n-2;