哈弗曼编码
程序代码:#include "stdio.h"
#define MAXVALUE 10000
typedef struct
{
int weight;
int lchild;
int rchild;
int flag;
int parent;
}HuffNode;
typedef struct
{
int weight;
int len;
char code[100];
}Code;
void Create(int weight[],HuffNode huff[],int n)
{
for(int i=0;i<2*n-1;i++) //n个叶子结点有2n-1个结点
{
huff[i].weight=(i<n)?weight[i]:0;
huff[i].lchild=-1;
huff[i].rchild=-1;
huff[i].flag=0;
huff[i].parent=-1;
}
}
void Huffman(HuffNode huff[],int n)
{
int m1,m2;
int x1,x2;
for(int i=0;i<n;i++)
{
m1=m2=MAXVALUE;
x1=-1;
x2=-1;
for(int j=0;j<n+i;j++)
{
if(huff[j].flag==0)
{
if(huff[j].weight<m2)
{
m1=m2;
x1=x2;
m2=huff[j].weight;
x2=j;
}
else if(huff[j].weight<m1)
{
m1=huff[j].weight;
x1=j;
}
}
}
huff[n+i].weight=huff[x1].weight+huff[x2].weight;
huff[n+i].lchild=x1;
huff[n+i].rchild=x2;
huff[x1].parent=n+i;
huff[x2].parent=n+i;
huff[x1].flag=1;
huff[x2].flag=1;
}
}
void HuffCode(HuffNode huff[],int n,Code code[])
{
int parent;
int child;
Code cd;
int t;
for(int i=0;i<n;i++)
{
code[i].weight=huff[i].weight;
code[i].len=0;
child=i;
cd.len=0;
parent=huff[child].parent;
t=0;
while (parent!=-1)
{
cd.code[cd.len++]=(huff[parent].lchild==child)?'1':'0';
child=parent;
parent=huff[child].parent;
}
for(int j=0;j<cd.len;j--)
{
code[i].code[j]=cd.code[t];
t++;
}
code[i].len=cd.len;
}
}
void Print(Code code[],int n)
{
printf("Output Code:");
for(int i=0;i<n;i++)
printf("%s",code[i].code);
}
void main()
{
int weight[5]={27,3,76,99,12};
HuffNode huff[100];
Code code[100];
Create(weight,huff,5);
Huffman(huff,5);
HuffCode(huff,5,code);
}








