当年数据结构与算法的实验报告,难了我好几天
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int weight;
int parent;
int Lchild;
int Rchild;
}HTNode,*HuffmanTree;
void select(HuffmanTree *ht,int n,int *s1,int *s2)
{
int i,min1=100,min2=100;
for(i=1,*s1=0,*s2=0;i<=n;i++)
{
if((*ht)[i].parent==0)
{
if((*ht)[i].weight<=min1)
{
min2=min1;
min1=(*ht)[i].weight;
*s2=*s1;
*s1=i;
}
else if((*ht)[i].weight<min2)
{
*s2=i;
min2=(*ht)[i].weight;
}
}
}
}
void CrtHuffmanTree(HuffmanTree *ht,char ***hc,int *w,int n)
{
int m,i,s1,s2,start,c,p;char *cd;
m=2*n-1;
*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;i++)(*ht)[i]=(HTNode){w[i],0,0,0};
for(i=n+1;i<=m;i++)(*ht)[i]=(HTNode){0,0,0,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;
}
(*hc)=(char**)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,p=(*ht)[i].parent;p!=0;c=p,p=(*ht)[p].parent)
{
if((*ht)[p].Lchild==c)cd[--start]='0';//左分支标0
else cd[--start]='1';//右分支标1
}
(*hc)[i]=(char*)malloc((n-start)*sizeof(char));
strcpy((*hc)[i],&cd[start]);
}
free(cd);
}
int main()
{
HuffmanTree *ht;char **hc;int a,i;
int w[10];
printf("请输入叶子节点个数:");
scanf("%d",&a);
for(i=1;i<=a;i++)
{
printf("请输入第%d个叶子结点的值:",i);
scanf("%d",&w[i]);
}
CrtHuffmanTree(ht,&hc,w,a);
for(i=1;i<=a;i++)
{
printf("第%d个叶子节点的哈夫曼编码为:",i);
puts(hc[i]);
}
return 0;
}