#include<string.h>
#include<stdlib.h>
#include<stdio.h>
typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树
typedef char * *HuffmanCode;
int min(HuffmanTree t,int i)
{
int j,flag;
unsigned int k = 1000;
for(j=1; j<=i; j++)
{
if(t[j].weight<k && t[j].parent==0)
{
k = t[j].weight;
flag = j;
}
}
t[flag].parent = 1;
return flag;
}
void select(HuffmanTree t,int i,int &s1,int &s2)
{
int j;
s1 = min(t,i);
s2 = min(t,i);
if(s1>s2)
{
j = s1;
s1 = s2;
s2 = j;
}
}
void HuffmanCoding(HuffmanTree& HT,HuffmanCode& HC,int *w,int n)
{
int m = 0;
int i = 0;
int s1 = 0;
int s2 = 0;
int start = 0;
char *cd;
HuffmanTree p;
unsigned int c,f;
if(n<=1) return;
m = 2*n - 1;
HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1; i<=n; ++i,++p,++w)
{
(*p).weight = *w;
(*p).lchild = 0;
(*p).rchild = 0;
(*p).parent = 0;
}
for(; i<=m; ++i,++p)
{
(*p).parent = 0;
}
for(i=n+1; i<=m; ++i)
{
select(HT,i-1,s1,s2);
HT[s1].parent = HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HuffmanCode)malloc((n+1)*sizeof(char*));
cd = (char*)malloc(n*sizeof(char));
cd[n-1] = '