哈夫曼树

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值