赫夫曼树编码

来源:互联网 发布:ubuntu shadowsock 编辑:程序博客网 时间:2024/05/17 23:29

 /*赫夫曼树编码*/


#include<stdio.h>
#include<malloc.h>
#define MAX 1000
typedef struct
{
 unsigned int weight;  /*存放权*/
    unsigned int parent,lchild,rchild;/*指向双亲树,左子树,右子树*/
}htnode,*huffmantree;
typedef char * *huffmancode; /*存储已知树的权*/
typedef struct
{
 int a[MAX];
 int b,t;
}stack;   /*定义一个栈存放和输出赫夫曼编码*/
stack sta;
huffmantree htree;
huffmancode hcode;
int weight[9]={8,5,29,7,8,14,23,3,11};/*用于给数传递初始值*/
int t1=1,t2=0;

/*构造栈的函数*/
void initstack(stack *s)
{
 s->b=0;
 s->t=0;
}

/*入栈的函数*/
void push(stack *s,int e)
{
 s->a[s->t]=e;
 ++(s->t);
}

/*出栈的函数--一次输出所有栈内元素*/
void pop(stack *s)
{
 int i;
 for(i=0;i<s->t;++i)
 {
  printf("%d",s->a[i]); 
 }
 printf("/n"); 
}

/*在从1-n的权值里寻找最小和次最小的树的序号,并用s1,s2返回的函数*/
void select(huffmantree *ht,int n,int *s1,int *s2)
{
 unsigned int i,t,mid;
 t=1000;
 for(i=1;i<=n;++i)
  {
  if(t>(*ht)[i].weight&&(*ht)[i].parent==0)
  {t=(*ht)[i].weight;
  *s1=i;}
     }
 
   t=1000;
   for(i=1;i<=n;++i)
    {
    if(i==*s1)continue;
    if(t>(*ht)[i].weight&&(*ht)[i].parent==0)
    {t=(*ht)[i].weight;
    *s2=i;}
    }
  if(*s1>*s2)
  {mid=*s1;*s1=*s2;*s2=mid;}
}

/*生成赫夫曼编码的函数*/
void createhu(huffmantree *ht,huffmancode *hc,int *w,int n)
{
 int m,i,p,z;
 int sa,sb;
 void print(huffmantree *ht);
 m=n*2-1;
 *ht=(huffmantree)malloc((m+1)*sizeof(htnode));
 for(i=1;i<=n;++i)
 {
  (*ht)[i].weight=w[i];
     (*ht)[i].parent=0;
     (*ht)[i].lchild=0;
     (*ht)[i].rchild=0;
 }
 for(i=n+1;i<=m;++i)
 {
  (*ht)[i].weight=0;
     (*ht)[i].parent=0;
     (*ht)[i].lchild=0;
     (*ht)[i].rchild=0;
 }
 print(ht);
 for(i=n+1;i<=m;++i)
 {
  select(ht,i-1,&sa,&sb);
  (*ht)[sa].parent=i;
  (*ht)[sb].parent=i;
  (*ht)[i].lchild=sa;
  (*ht)[i].rchild=sb;
  (*ht)[i].weight=(*ht)[sa].weight+(*ht)[sb].weight; 
 }
 print(ht);
 printf("**HUFFMANCODE**/n");
    for(i=1;i<=8;++i)
 {
  initstack(&sta);
  z=i;
  while((*ht)[i].parent!=0)
  {
   p=(*ht)[i].parent;
   if((*ht)[p].lchild==i){push(&sta,0);}
   if((*ht)[p].rchild==i){push(&sta,1);}
   i=p;
  }
  i=z;
  printf("  %3d :",(*ht)[i].weight);
  pop(&sta);
 }
 printf("***************/n");
}

/*按表格输出结点的函数*/
void print(huffmantree *ht)
{
 int i;
 printf("*******TREE*******/n");
 for(i=1;i<16;i++)
  printf("%3d   %2d   %2d   %2d/n",(*ht)[i].weight,(*ht)[i].parent,(*ht)[i].lchild,(*ht)[i].rchild);
 printf("******************/n");
}

void main()
{
 createhu(&htree,&hcode,weight,8);
}

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 痛风脚右侧肿了怎么办 痛风引起的脚肿怎么办 老人腰闪了该怎么办 腰闪了站不起来怎么办 又怕冷又爱上火怎么办 肝上多发小囊肿怎么办 5岁宝宝咳嗽厉害怎么办 5岁宝宝咳嗽有痰怎么办 生川乌外贴中毒怎么办 7个月宝宝流鼻涕怎么办 脸上皮肤毛孔粗大有黑头怎么办 嗓子长了个囊肿怎么办 食管胃粘膜异位怎么办 狗狗肿瘤破了怎么办 婴儿胃食道反流怎么办 小儿胃食道反流怎么办 放疗后咳嗽痰多怎么办 胃息肉是恶性的怎么办 老是胃疼,胃胀怎么办 吃完饭之后胃胀怎么办 胃痛胃胀怎么办能缓解 胃胀不消化怎么办快速解决 便秘肛裂了好痛怎么办 胃消化慢还便秘怎么办 11个月婴儿便秘怎么办 80多岁老人便秘怎么办 狗狗便秘拉不出来怎么办 2个月幼犬便秘怎么办 狗狗便秘怎么办吃什么 痔疮又痛又痒怎么办 痔疮肉球特别痒怎么办 长了个小痔疮怎么办 产后4天没大便怎么办 7个月孕妇痔疮怎么办 运动完恶心想吐怎么办 跑步后恶心想吐怎么办 肠子不蠕动严重便秘怎么办 怀孕八个月严重便秘怎么办 怀孕七个月便秘严重怎么办 怀孕两个月便秘严重怎么办 3岁宝宝上火便秘怎么办