Huffman算法的构造以及Huffman树的生成(C语言)
输入:权值个数以及权值。
输出:Huffman树
源代码:
#include <stdio.h>
#include <stdlib.h>
main()
{
int n,i,t,j,k,l,m,min0,min1;
unsigned int *w; //w存放结点权值
printf("请输入权值个数:");
scanf("%d",&n);//输入字符数目
m=n;
if(n<=1)
{
printf("该数不合理!\n");
}
w=(unsigned int*)malloc(n*sizeof(unsigned int)); //开辟空间存放权值
printf("请输入权值:\n");
for(i=0;i<n;i++)
scanf("%d",&w[i]); //输入各字符出现的次数/权值
for(i=0;i<n;i++)//排序
{
for(j=0;j<n-i-1;j++)
{
if(w[j]>w[j+1])
{
t=w[j+1];
w[j+1]=w[j];
w[j]=t;
}
}
}
for(i=0;i<n;i++)
printf("%d\t",w[i]);
printf("\n");
do{
if(w[0]>w[1])//找出最小两个权值
{
min0=w[1];
min1=w[0];
k=1;
l=0;
}
if(w[0]<=w[1])
{
min1=w[1];
min0=w[0];
k=0;
l=1;
}
for (i=2;i<n;i++)
{
if(w[i]<min0)
min1=min0,l=k,min0=w[i],k=i;
else if(w[i]<=min1)
min1=w[i],l=i;
}
w[k]=min0+min1;//最小权值等于两个最小权值之和
w[l]=999;//第二小等于一个大的数,打印时忽略
for(i=0;i<n;i++)
{
if(w[i]<=500)
printf("%d\t",w[i]);
else
printf("\t");
}
printf("\n");
m--;
}while(m>0);
}