#include<stdio.h>
#include<stdlib.h>
#define M 100
typedef struct hufTree{
char symbol ;
int weight;
struct hufTree *llink,*rlink;
int plink;
}HTNode,*HFtree;
struct hufCode{
int bits[M];
int start;
}code[M];
void select(struct hufTree *hf,int s,int *x1,int *x2)
{
int i;
int v1,v2;
v1=v2=32767;
*x1=*x2=0;
for(i=1;i<=s;i++)
if(hf[i].plink==0)
if(hf[i].weight<v1)
{
v2=v1;*x2=*x1;
v1=hf[i].weight;
*x1=i;
}
else if(hf[i].weight<v2)
{
v2=hf[i].weight;
*x2=i;
}
}
void Create_hufTree(HFtree hf,int n)
{
int i,s1,s2;
for(i=1;i<=2*n-1;i++)
{
hf->llink=hf->rlink=NULL;
hf[i].plink=0;
}
for(i=n+1;i<=2*n-1;i++)
{
select(hf,i-1,&s1,&s2);
hf[s1].plink=hf[s2].plink=i;
hf[i].llink=&hf[s1];
hf[i].rlink=&hf[s2];
hf[i].weight=hf[s1].weight+hf[s1].weight;
}
}
void Set_hufCode(struct hufTree hf[],struct hufCode code[],int n)
{
int i,j;
int f;
for(i=1;i<=n;i++)
{
code[i].start=n+1;
j=i;
f=hf[j].plink;
while(f)
{
code[i].start--;
if(hf[f].llink==&hf[j])
code[i].bits[code[i].start]=0;
else
code[i].bits[code[i].start]=1;
j=f;
f=hf[j].plink;
}
}
}
void Output_hufTree(struct hufTree hf[],struct hufCode code[],int n)
{
int i,j;
for(i=1;i<=n;i++)
{
printf("\n%3c%7d%:",hf[i].symbol,hf[i].weight);
printf(" ");
for(j=code[i].start;j<=n;j++)
printf("%d",code[i].bits[j]);
}
}
int main(void)
{
int i,n;
HFtree hf;
printf("输入节点数:\n");
scanf("%d",&n);
hf=(HFtree)malloc(2*n*sizeof(HTNode));
printf("依次输入各节点及其权值:\n");
for(i=1;i<=n;i++)
{
scanf("%s",&hf[i].symbol);
scanf("%d",&hf[i].weight);
}
Create_hufTree(hf,n);
Set_hufCode(hf,code,n);
printf("输出各叶子结点的哈夫曼编码:\n");
printf("节点 权值 哈夫曼编码\n");
Output_hufTree(hf,code,n);
printf("\n");
return 0;
}
哈夫曼树
最新推荐文章于 2023-05-17 21:59:40 发布