#include <stdio.h>
#inlucde <stlib.h>
//定义结构体数组类型
typedef struct
{
char word;//字符域;
int weight;//字符对应的权值域;
int left,right,parent;//分别是左子女,右子女,双亲结点域;
int * code;//编码域;
}HuffNode;
//CreateHuffmanTree
oid CreateHuffmanTree(HuffNode * F,int n)
{
int loop;
int k1,k2;
int i;
for(loop=0;loop<n-1;loop++)
{
for(k1=0;k1<n+loop&&F[k1].parent!=-1;k1++);//找第一个还未挂上去的结点;
for(k2=k1+1;k2<n+loop&&F[k2].parent!=-1;k2++);//找第二个还未挂上去的结点;
//for循环,出来k1指weight最小,k2指weight次小;
for(i=k2;i<n+loop;i++)
{
if(F[i].parent==-1)
{
if(F[i].weight<F[k1].weight)
{
k2=k1;
k1=i;
}
else if(F[i].weight<F[k2].weight)
k2=i;
}
}
//初始化新生成的双亲结点;
F[i].word='x';
F[i].weight=F[k1].weight+F[k2].weight;
F[i].left=k1;
F[i].right=k2;
F[i].parent=-1;
//初始化k1,k2的双亲域;
F[k1].parent=F[k2].parent=i;
}
}
//CreateHuffmanCode
void CreateHuffmanCode(HuffNode * F,int n)
{
int c,pa,i;
int * p;
for(i=0;i<n;i++)
{
F[i].code=p=(int *)malloc(n*sizeof(int));//初始化code域;
p[0]=0;//p[0]作编码数组的岗哨,永远指向最后一位码,因此初始化0;
c=i;//c表示当前结点下标;
while(F[c].parent!=-1)//循环终止条件:当前结点为根结点;
{
pa=F[c].parent;
//左子女赋0,右子女赋1;
if(F[pa].left==c)
p[++p[0]]=0;
else
p[++p[0]]=1;
c=pa;
}
}
}
//PrintHuffmanCode
void PrintHuffmanCode(HuffNode * F,int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("%s",F[i].word);
printf("-----");
for(j=F[i].code[0];j>0;j--)
printf("%d",F[i].code[j]);
printf("\n");
}
}
//main函数体
int main(void)
{
HuffNode * F;
int n,w,i;
char ch;
printf("请输入叶子结点个数n:");
scanf("%d",&n);
//创建森林
F=(HuffNode *)malloc((2*n+1)*sizeof(HuffNode));
for(i=0;i<n;i++)
{
printf("请输入word的值:");
scanf("%s",&ch);
F[i].word=ch;
printf("请输入weight的值:");
scanf("%d",&w);
F[i].weight=w;
F[i].left=F[i].right=F[i].parent=-1;
}
//创建HuffmanTree
CreateHuffmanTree(F,n);
//创建HuffmanCode
CreateHuffmanCode(F,n);
//输出
PrintHuffmanCode(F,n);
return 0;
}
希望能帮到大家!
我的希望是:世界和平!
嘻嘻!