构造哈夫曼树和生成哈夫曼编码

上机指导第158页的exp7-5.cpp

#include <stdio.h>

#include <string.h>

#define N 50

#define M 2*N-1

typedef struct

{

       char data[5];

       int weight;

       int parent;

       int lchild;

       int rchild;

} HTNode;

typedef struct

{

       char cd[N];

       int start;

} HCode;

void CreateHT(HTNode ht[],int n)

{

       int i,k,lnode,rnode;

       int min1,min2;

       for (i=0;i<2*n-1;i++)

              ht[i].parent=ht[i].lchild=ht[i].rchild=-1;

       for (i=n;i<2*n-1;i++)

       {

              min1=min2=32767;

              lnode=rnode=-1;

              for (k=0;k<=i-1;k++)

                     if (ht[k].parent==-1)

                     {

                            if (ht[k].weight<min1)

                            {

                                   min2=min1;rnode=lnode;

                                   min1=ht[k].weight;lnode=k;

                            }

                            else if (ht[k].weight<min2)

                            {

                                   min2=ht[k].weight;rnode=k;

                            }

                     }

              ht[lnode].parent=i;ht[rnode].parent=i;

              ht[i].weight=ht[lnode].weight+ht[rnode].weight;

              ht[i].lchild=lnode;ht[i].rchild=rnode;

       }

}

void CreateHCode(HTNode ht[],HCode hcd[],int n)

{

       int i,f,c;

       HCode hc;

       for (i=0;i<n;i++)

       {

              hc.start=n;c=i;

              f=ht[i].parent;

              while (f!=-1)

              {

                     if (ht[f].lchild==c)

                            hc.cd[hc.start--]='0';

                     else

                            hc.cd[hc.start--]='1';

                     c=f;f=ht[f].parent;

              }

              hc.start++;

              hcd[i]=hc;

       }

}

void DispHCode(HTNode ht[],HCode hcd[],int n)

{

       int i,k;

       int sum=0,m=0,j;

       printf("输出哈夫曼编码:\n");

       for (i=0;i<n;i++)

       {

              j=0;

              printf("      %s:\t",ht[i].data);

              for (k=hcd[i].start;k<=n;k++)

              {

                     printf("%c",hcd[i].cd[k]);

                     j++;

              }

              m+=ht[i].weight;

              sum+=ht[i].weight*j;

              printf("\n");

       }

       printf("平均长度=%g\n",1.0*sum/m);

}

int main()

{

       int n=15,i;

       char *str[]={"The","of","a","to","and","in","that","he","is","at","on","for","His","are","be"};

       int fnum[]={1192,677,541,518,462,450,242,195,190,181,174,157,138,124,123};

       HTNode ht[M];

       HCode hcd[N];

       for (i=0;i<n;i++)

       {

              strcpy(ht[i].data,str[i]);

              ht[i].weight=fnum[i];

       }

       CreateHT(ht,n);

       CreateHCode(ht,hcd,n);

       DispHCode(ht,hcd,n);

       return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值