Huffman编码

#include<stdio.h>
#define MAX   21

struct HuffNode{
  char data;
  int weight;
  int parent;
  int left;
  int right;
};

struct HuffCode{
  char cd[MAX];
  int start;
};

int main( void )
{
  struct HuffNode ht[2*MAX];
  struct HuffCode d,hcd[MAX];
  int i,k,f,l,r,n,c,m1,m2;

  printf("Number of Element:");
  scanf("%d",&n);

  for(i = 1;i <= n;i ++)
  {
     getchar();
     printf("/nThe %d element=>/n/tName:",i);
     scanf("%c",&ht[i].data);
     printf("/tWeight:");
     scanf("%d",&ht[i].weight);
  }
  for(i = 1;i < 2*n-1;i ++)
    ht[i].parent=ht[i].left=ht[i].right=0;

  /*构造Huffman树*/
  for(i = n+1;i <= 2*n-1;i ++)
  {
    m1 = m2 = 32767;
    r  = l  =0;
    for(k = 1;k <= i - 1;k ++)
      if(0 == ht[k].parent)
        if(ht[k].weight <m1)       { m2 = m1;    r = l; m1 = ht[k].weight;l = k; }
        else if(ht[k].weight < m2) { m2 = ht[k].weight; l = k;  }

    ht[l].parent = i;
    ht[r].parent = i;
    ht[i].weight = ht[l].weight + ht[r].weight;
    ht[i].left = l;
    ht[i].right = r;
  }

  /*根据Huffman树求编码*/
  for(i = 1;i <= n;i ++)
  {
    d.start = n + 1;
    c = i;
    f =ht[i].parent;
    while(f != 0 )
    {
      if(ht[f].left == c)   d.cd[--d.start] = '0';
      else                  d.cd[--d.start] = '1';
      c = f;
      f = ht[f].parent;
    }
    hcd[i] = d;
  }

  /*输出Huffman编码*/
  printf("Huffman Code:/n");
  for(i = 1;i <= n;i ++)
  {
    printf("%c:",ht[i].data);
    for(k = hcd[i].start;k <= n;k ++)
      printf("%c",hcd[i].cd[k]);
    printf("/n");
  }

  getch();
  return 0;
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值