哈夫曼树

来源:互联网 发布:java 项目中使用log4j 编辑:程序博客网 时间:2024/06/08 11:15
#include<stdio.h>#include<stdlib.h>#define M 100typedef 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;}
0 0
原创粉丝点击