//第九章第14题;
//假设十个符号为ABCDEFGHIJ,权值为8,21,37,24,6,18,23,41,56,14;
//输入权值:8回车;
//输入数据:A(不用回车);
//输入十个权值和数据后,输出为:A 11001 ;B 1011 ;C 101 ;D 100 ;E 01001 ;(E权值最小编码最长)
//F 0011;G 000 ;H 111
//I 10 ;(I权值最大,编码最短)J 0001;
//由于不知道编码是否正确,因此不能保证本程序的正确性,但是从编码输出来看,
//满足了权值最大,编码最长,权值最小,编码最短的条件;
#include "stdio.h"
#include "conio.h"
typedef char datatype;
#define n 10 //叶子数;
#define m 2*n-1 //结点总数;
typedef struct
{
char bits[n];
int start;
datatype data;
}codetype;//编码数组的数据结构;
codetype code[n];
typedef struct
{
float weight;
datatype data;
int lchild,rchild,parent;
}hufmtree;
hufmtree tree[m]; //哈夫曼树数据结构;
void printHuffman(hufmtree tree[])
{
for(int i=0;i<m;i++)
{
printf("%c %f/n",tree[i].data,tree[i].weight);
}
} //打印哈夫曼树的函数;
void printHuffmancode(codetype code[])
{
for(int i=0;i<n;i++)
{
printf("%c/n",code[i].data);
for(int j=n-1;j>=code[i].start;j--)
{
printf("%c",code[i].bits[j]);
}
printf("/n");
}
} //打印哈夫曼树编码的函数
void humffman(hufmtree tree[])
{
printf("开始建立哈夫曼树.../n");
int i,j;
int p1,p2;
char ch;
float small1,small2,f;
for(i=0;i<m;i++)
{
tree[i].parent=0;
tree[i].lchild=0;
tree[i].rchild=0;
tree[i].weight=0.0;
tree[i].data='0';
}
for(i=0;i<n;i++)
{
printf("输入权值:");
scanf("%f",&f);
tree[i].weight=f;
printf("输入数据:");
ch=getche();
printf("/n");
tree[i].data=ch;
}
printHuffman(tree);
printf("创建ing.../n");
for(i=n;i<m;i++)
{
p1=p2=0;
small1=small2=999999.0;
for(j=0;j<=i-1;j++)
if(tree[j].parent==0)
if(tree[j].weight<small1)
{
small2=small1;
small1=tree[j].weight;
p2=p1;
p1=j;
}
else if(tree[j].weight<small2)
{
small2=tree[j].weight;
p2=j;
}
tree[p1].parent=i;
tree[p2].parent=i;
tree[i].lchild=p1;
tree[i].rchild=p2;
tree[i].weight=tree[p1].weight+tree[p2].weight;
}
printHuffman(tree);
printf("创建完毕.../n");
} //创建哈夫曼树;
void huffmancode(codetype code[],hufmtree tree[])
{
printf("编码开始.../n");
int i,c,p;
codetype cd;
for(i=0;i<n;i++)
{
cd.start=n;
c=i;
p=tree[c].parent;
cd.data=tree[c].data;
while(p!=0)
{
cd.start--;
if(tree[p].lchild==c)
cd.bits[cd.start]='0';
else
cd.bits[cd.start]='1';
c=p;
p=tree[c].parent;
}
code[i]=cd;
}
printHuffmancode(code);
printf("编码完成.../n");
} //创建哈夫曼树编码函数;
int main()
{
humffman(tree);
huffmancode(code,tree);
return 0;
} //main函数主要调用了两个主要的哈夫曼树创建与编码函数,其中tree和code是全局变量的数组;