c实现哈夫曼树和哈夫曼编码

typedef struct HaffTree{
   int parent,lchild,rchild;
   int data;
   int weight;
}HaffTree,*Htree;

typedef char* *Ch;

//得到每个叶子结点的haffman编码值
void get_haff_code(Htree T,Ch *ch,int n){
       int c,f;
       char * chpoint=(char*)malloc(n*sizeof(char));  //分配一串字符空间
       chpoint[start]='/0';                           //最后一个字符设置为空格,便于在控制台输出更清晰。
       for(int i=1;i<=n;i++){                         //从第一个叶子结点开始循环读取haff编码
        int start=n-1;                                   
        for(c=1,f=T[c].parent;f!=0;c=f;f=T[f].parent)  //
        {     if(T[f].lchild==c)
                chpoint[--start]='0';                  //若为左孩子则设置为0
            else
                chpoint[--start]='1';                   //否则设置为1
       }         
       ch[i]=(char*)malloc((n-start)sizeof(char));     //分配得到的编码的长度的字符空间。
       strcopy(ch[i],&chpoint[start]);                 //复制。
       }
       free(chpoint);                                  //最后释放空间。
}
 
 
 //创建一个Haffmantree,传递的参数为:T 树的首地址,s1为左孩子的序号,s2为右孩子序号,n为叶子结点数
void create_haff_tree(Htree T,int n,int &s1,int&s2){
     for(int i=n+1;i<2*n-1;i++){
         select_max_node(T,i-1,&s1,&s2);
         T[s1].parent=i;
         T[s2].parent=i;
         T[i].lchild=s1;
         T[i].rchild=s2;
         T[i].weight=T[s1].weight+T[s2].weight;        
     }
}

Ch* init_tree(Htree T,Data *v,int n)
{
      Ch *ch;
      int m= 2*n-1;
      T=(Htree)malloc((m+1)*sizeof(HaffTree));//分配m+1个结点的HaffTree,从1开始计数
      ch=(Ch)malloc((m+1)sizeof(Ch));         //分配m+1个字符串指针数组,每个指针值指向一串字符编码
      
     //***************初始化叶子结点值
      for(int i=1;i<=m;i++)
      {
           T[i]->parent=0;
           T[i]->lchild=0;
           T[i]->rchild=0;
           T[i]->data=v.data;
           T[i]->weight=v.weight;
      }
      //*****************初始化父节点的值
      for(int i=n+1;i<=2*n-1;i++)
      {
            T[i].parent=0;
            T[i].lchild=0;
            T[i].rchild=0;
            T[i].weight=0;
      }
      return ch;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒徒词客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值