假设一串由大写字母构成的电文,采用霍夫曼规则对其进行编码,以菜单方式设计并完成功能任务:建立霍夫曼树、霍夫曼编码生成、编码文件译码。
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#define MAXBIT 100
#define MAXVALUE 1000
#define MAXLEAF 26
#define MAXNODE 2*MAXLEAF-1
struct Hnodetype
{
int weight;
int lson;
int rson;
int parent;
char ch;
};
struct Hcodetype
{
int bit[MAXBIT];
int start;
};
int main()
{
void mune();
void creatHuff(struct Hnodetype Huffnode[],int a[]);
void coding(struct Hnodetype Huffnode[],int a[]);
void decoding(struct Hnodetype Huffnode[],int a[]);
struct Hnodetype Huffnode[MAXNODE];
int i,choice;
char ch;
int a[26];
mune();
printf("请输入选择:\n");
scanf("%d",&choice);
while(1)
{
switch(choice)
{
case 1:
{
for(i=0;i<26;i++)
a[i]=0;
printf("输入字符串:\n");
do
{
scanf("%c",&ch);
if(ch>='A'&&ch<='Z')
a[ch-'A']++;
}while(ch!='#');
creatHuff(Huffnode,a);
printf("霍夫曼树建立成功!\n");
break;
}
case 2:
{
printf("霍夫曼编码:\n");
coding(Huffnode,a);
break;
}
case 3:
{
decoding(Huffnode,a);
break;
}
case 4:
{
printf("谢谢使用,再见!\n");
return 0;
}
}
printf("\n请输入选择:\n");
scanf("%d",&choice);
}
}
void mune()
{
printf("****************************\n");
printf("* 1.建立霍夫曼树 *\n");
printf("* 2.霍夫曼编码生成 *\n");
printf("* 3.编码文件译码 *\n");
printf("* 4.退出系统 *\n");
printf("****************************\n");
}
void creatHuff(struct Hnodetype Huffnode[],int a[])
{
int x1,x2,m1,m2,i,j,n;
i=j=n=0;
for(i=0;i<26;i++)
if(a[i]!=0)
n++;
for(i=0;i<2*n-1;i++)
{
Huffnode[i].weight=0;
Huffnode[i].lson=-1;
Huffnode[i].rson=-1;
Huffnode[i].parent=-1;
}
for(i=0;i<26;i++)
{
if(a[i]!=0)
{
Huffnode[j].weight=a[i];
Huffnode[j].ch=i+'A';
printf("字符:%c 权值:%d\n",Huffnode[j].ch,Huffnode[j].weight);
j++;
}
}
for(i=0;i<n-1;i++)
{
m1=m2=MAXVALUE;
x1=x2=0;
for(j=0;j<n+i;j++)
{
if(Huffnode[j].weight<m1&&Huffnode[j].parent==-1)
{
m2=m1;
x2=x1;
m1=Huffnode[j].weight;
x1=j;
}
else if(Huffnode[j].weight<m2&&Huffnode[j].parent==-1)
{
m2=Huffnode[j].weight;
x2=j;
}
}
Huffnode[x1].parent=n+i;
Huffnode[x2].parent=n+i;
Huffnode[n+i].lson=x1;
Huffnode[n+i].rson=x2;
Huffnode[n+i].weight=Huffnode[x1].weight+Huffnode[x2].weight;
}
}
void coding(struct Hnodetype Huffnode[],int a[])
{
struct Hcodetype temp;
int i,j,c,p,n=0;
for(i=0;i<26;i++)
if(a[i]!=0)
n++;
for(i=0;i<n;i++)
{
c=i;
p=Huffnode[i].parent;
temp.start=n-1;
while(p!=-1)
{
if(Huffnode[p].lson==c)
temp.bit[temp.start]=0;
else
temp.bit[temp.start]=1;
temp.start--;
c=p;
p=Huffnode[c].parent;
}
printf("%c code is: ",Huffnode[i].ch);
for(j=temp.start+1;j<n;j++)
printf("%d",temp.bit[j]);
printf("\n");
}
}
void decoding(struct Hnodetype Huffnode[],int a[])
{
int i,k,m,n,temp;
char code[MAXBIT];
i=k=n=0;
for(i=0;i<26;i++)
if(a[i]!=0)
n++;
m=2*n-1;
printf("输入编码文件:\n");
getchar();
scanf("%c",&code[k]);
while(code[k]!='\n')
{
k++;
scanf("%c",&code[k]);
}
printf("译码成功:\n");
for(i=0;i<k;)
{
temp=m-1;
while(Huffnode[temp].lson!=-1&&Huffnode[temp].rson!=-1)
{
if(code[i]=='0')
temp=Huffnode[temp].lson;
else
temp=Huffnode[temp].rson;
i++;
}
printf("%c",Huffnode[temp].ch);
}
printf("\n");
}