//哈夫曼编码程序
#include <stdio.h>
#define MAXSIZE 50
#define MAXWEIGHT 1000
#define MAXNODE 50
#define MAXLEAF 50
typedef struct {
int weight;
char letter;
int parent,lchild,rchild;
}HNode;
typedef struct { //编码信息结构体
int start;
int bit[10];
}HCode;
//****************构造哈夫曼树的函数**********************
void HuffmanTree(HNode HN[MAXNODE],int n)
{
int i,j,x1=0,x2=0,min1,min2;
int num=2*n-1;
for(i=0;i<num;i++)//结点初始化
{
HN[i].weight=0;
HN[i].parent=-1;
HN[i].lchild=-1;
HN[i].rchild=-1;
}
for(i=0;i<n;i++)
{
fflush(stdin);
printf("please input the %d letter and weight:/n",i+1);
scanf("%c%d",&HN[i].letter,&HN[i].weight);
fflush(stdin);
}
for(i=0;i<n-1;i++) //合成的结点
{
min1=MAXWEIGHT,min2=MAXWEIGHT;
for(j=0;j<n+i;j++)
{
if(HN[j].weight<min1&&HN[j].parent==-1){
min1=HN[j].weight;
x1=j;
} //if与else if 的区别???????????????
else if(HN[j].weight<min2&&HN[j].parent==-1){
min2=HN[j].weight;
x2=j;
}
}
HN[x1].parent=n+i;
HN[x2].parent=n+i;
HN[n+i].lchild=x1;
HN[n+i].rchild=x2;
HN[n+i].weight=HN[x1].weight+HN[x2].weight;
}
}
void Message()
{
printf("*****************************************/n");
printf(" This is Huffman code program./n");
printf(" Please input like the eg :a10 ./n");
printf("*****************************************/n");
}
//*********************主函数**************************
int main()
{
HNode HN[2*MAXNODE-1];
HCode HC[MAXLEAF],code;
int c,i,j,n,p;
Message();
printf("please input leaf node n :/n");
scanf("%d",&n);
HuffmanTree(HN,n); //用 HN[2*MAXNODE-1]出错
for(i=0;i<n;i++)
{
code.start=n-1;
c=i;
p=HN[c].parent; //父节点的值
while(p!=-1)
{
if(HN[p].lchild==c)
code.bit[code.start]=0;
else
code.bit[code.start]=1;
code.start--;//最后多减一次
c=p;
p=HN[c].parent;
}
for(j=code.start+1;j<n;j++)
HC[i].bit[j]=code.bit[j];
HC[i].start=code.start;
}
for(i=0;i<n;i++)
{
printf("The %c huffman code is :",HN[i].letter);
for(j=HC[i].start+1;j<n;j++)
printf("%d",HC[i].bit[j]);
printf(
"/n");
}
getch();
return 0;
}