#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define MAXVALUE 10000
typedef struct{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,int *w,int n);
void Select(HuffmanTree t, int k, int *s1, int *s2);
void main()
{
HuffmanTree HT;HTNode t;
HuffmanCode HC;
int n,w[8] ={5, 29, 7, 8, 14, 23, 3, 11};
HT = &t;
n = 8;
HuffmanCoding(HT,&HC,w,n);
}
void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,int *w,int n){
HuffmanTree p;
int i,m,s1,s2,start,c,f,j;
char *cd;
if(n<=1) return;
m = 2 * n -1;
HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode));
p = HT;
for(i = 1;i<=n;++i,++w){
p[i].weight = *w;
p[i].parent=p[i].lchild=p[i].rchild = 0;
}
for( ;i<=m;++i)
p[i].weight=p[i].parent=p[i].lchild=p[i].rchild = 0;
for(i = n+1;i<=m;++i){
Select(HT,i-1,&s1,&s2);
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
printf(" weight parent lchild rchild");
for(i = 1;i<=m;i++)
printf("\n%8d %8d %8d %8d",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
*HC = (HuffmanCode)malloc((n+1)*sizeof(char*));
cd = (char*)malloc(n*sizeof(char));
cd[n-1] = '\0';
for(i = 1;i<=n;++i){
start = n-1;
for(c = i,f = HT[i].parent;f!=0;c = f, f = HT[f].parent)
if(HT[f].lchild == c) cd[--start] = '0';
else cd[--start] = '1';
(*HC)[i] = (char*)malloc((n-start)*sizeof(char));
strcpy((*HC)[i],&cd[start]);
}
for(i = 1;i<=n;i++){
printf("\n %4d 的哈夫曼编码为: ",HT[i].weight);
printf("%s ",(*HC)[i]);
}
free(cd);
}
void Select(HuffmanTree t, int k, int *s1, int *s2)
{
int small1, small2,i;
*s1 = *s2 = 0;
small1 = small2 = MAXVALUE;
for (i = 0; i <= k; i++)
{
if (t[i].parent == 0)
{
if (t[i].weight < small1)
{
small2 = small1;
small1 = t[i].weight;
*s2 = *s1;
*s1 = i;
}
else if (t[i].weight < small2)
{
small2 = t[i].weight;
*s2 = i;
}
}
}
}