#include<stdio.h>
#define MAX 21
struct HuffNode{
char data;
int weight;
int parent;
int left;
int right;
};
struct HuffCode{
char cd[MAX];
int start;
};
int main( void )
{
struct HuffNode ht[2*MAX];
struct HuffCode d,hcd[MAX];
int i,k,f,l,r,n,c,m1,m2;
printf("Number of Element:");
scanf("%d",&n);
for(i = 1;i <= n;i ++)
{
getchar();
printf("/nThe %d element=>/n/tName:",i);
scanf("%c",&ht[i].data);
printf("/tWeight:");
scanf("%d",&ht[i].weight);
}
for(i = 1;i < 2*n-1;i ++)
ht[i].parent=ht[i].left=ht[i].right=0;
/*构造Huffman树*/
for(i = n+1;i <= 2*n-1;i ++)
{
m1 = m2 = 32767;
r = l =0;
for(k = 1;k <= i - 1;k ++)
if(0 == ht[k].parent)
if(ht[k].weight <m1) { m2 = m1; r = l; m1 = ht[k].weight;l = k; }
else if(ht[k].weight < m2) { m2 = ht[k].weight; l = k; }
ht[l].parent = i;
ht[r].parent = i;
ht[i].weight = ht[l].weight + ht[r].weight;
ht[i].left = l;
ht[i].right = r;
}
/*根据Huffman树求编码*/
for(i = 1;i <= n;i ++)
{
d.start = n + 1;
c = i;
f =ht[i].parent;
while(f != 0 )
{
if(ht[f].left == c) d.cd[--d.start] = '0';
else d.cd[--d.start] = '1';
c = f;
f = ht[f].parent;
}
hcd[i] = d;
}
/*输出Huffman编码*/
printf("Huffman Code:/n");
for(i = 1;i <= n;i ++)
{
printf("%c:",ht[i].data);
for(k = hcd[i].start;k <= n;k ++)
printf("%c",hcd[i].cd[k]);
printf("/n");
}
getch();
return 0;
}