#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 65535
typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char** HuffmanCode;
void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n)
{
int m,i,j,min1,min2,k,s1,s2,c,start,f,cdlen,q;
HuffmanTree p;
char *cd;
if(n<=1) return;
m=n*2-1;
*HT=(HuffmanTree)malloc(sizeof(HTNode)*(m+1));
p=*HT;
p++;
for(i=1;i<=m;i++,p++)
{
p->parent=p->lchild=p->rchild=0;
if(i<=n)p->weight=w[i];
else p->weight=0;
}
p=*HT;
for(i=n+1;i<=m;i++)
{
min2=min1=MAX;
s1=s2=1;
for(j=1;j<i;j++)
{
if(p[j].parent==0)
{
if(p[j].weight<min1)
{
min2=min1;
min1=p[j].weight;
s2=s1;
s1=j;
}
else if(p[j].weight<min2)
{
min2=p[j].weight;
s2=j;
}
}
}
p[s1].parent=i;
p[s2].parent=i;
if(s2<s1)
{
s1=s1+s2;
s2=s1-s2;
s1=s1-s2;
}
p[i].lchild=s1;
p[i].rchild=s2;
p[i].weight=p[s1].weight+p[s2].weight;
}
*HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
for(i=1;i<=n;i++)
{
start=n-1;
cd[n-1]='/0';
for(c=i,f=p[i].parent;f!=0;c=f, f=p[c].parent)
{
if(p[f].lchild==c)
{
cd[--start]='0';
}
else
cd[--start]='1';
}
(*HC)[i]=(char *)malloc(sizeof(char)*(n-start));
strcpy((*HC)[i],cd+start);
printf("%s/n",(*HC)[i]);
}
free(cd);
}
/*HuffmanCoding*/
int main()
{
HuffmanTree HT;
HuffmanCode HC;
int w[]={0,5,29,7,8,14,23,3,11},n=8,i;
HuffmanCoding(&HT,&HC,w,n);
for(i=1;i<=n;i++)
{
printf("%s/n",HC[i]);
}
return 0;
}