您的位置:首页 > 其它

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

2013-12-06 15:52 302 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: