哈夫曼樹

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章