实验四、4哈夫曼树编码

来源:互联网 发布:血清甘油三酯增高 知乎 编辑:程序博客网 时间:2024/06/15 02:32

/*
  Description:哈夫曼树编码问题 创建哈夫曼树并编码
*/
#include<stdio.h>
#include<stdlib.h>
#define max 20
struct huffnode
{
 char date;//数据域
 int weight;//权值
 int parent;//双亲域
 int left;//左孩子
 int right; //右孩子
};
struct huffcode
{
 char cd[max];
 int start;
};
int main()
{
 struct huffnode ht[2*max];//存放哈夫曼结点的数组
 struct huffcode hcd[max],d;//哈夫曼编码栈类型
 int n,i;
 printf("请输入n:");//n结点个数
 scanf("%d",&n);
 for(i=1;i<=n;i++)//为每个结点负权值
 {
  //getchar();
  printf("%d:",i);
  scanf("%c",&ht[i].date);
  printf("weight:");
  scanf("%d",&ht[i].weight); //负权值
 }
 int m1,m2,l,r,k,c,f;
 for(i=1;i<=2*n-1;i++)//初始化每个结点的双亲 左右指针域
 {
  m1=32767;//设初始值无穷大 
  r=0;////l r为指向左右孩子的指针
  l=0;
  for(k=1;k<=i-1;k++)//找权值最小的两棵树,并用吗
   if(ht[k].weight==0)
   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;
    r=k; 
   }
  ht[l].parent=i;
  ht[r].parent=i;
  ht[i].left=l;
  ht[i].right=r;
 }
 for(i=1;i<=n;i++)//进行哈夫曼编码
 {
  d.start=n;
  c=i;
  f=ht[i].parent;
  while(f!=0)
  {
   if(ht[f].left==c)
    d.cd[d.start]='0';
   else
    d.start=d.start-1;
   c=f;
   f=ht[f].parent; 
  }
  hcd[i]=d; 
 }
 printf("输出哈夫曼编码:/n");
 for(i=1;i<=n;i++)
 {
  printf("%c:",ht[i].date);
  for(k=hcd[i].start;k<=n;k++)
   printf("%c",hcd[i].cd[k]);
  printf("/n"); 
 }
}
 

原创粉丝点击