赫夫曼编码c++中的实现

来源:互联网 时间:1970-01-01

发现自己写程序的问题很多,对着算法实现代码,也花费了不短的时间才把问题搞定,很是郁闷。

问题多多。

现将代码贴出,以备查询。

#include<cctype>
#include<cstdlib>
#include<cstdio>
#include<cstring>

typedef struct {
    unsigned int weight;
    unsigned int parent, lchild,rchild;
}HTNode, *HuffmanTree;
typedef char ** HuffmanCode;


//find the min value of two item in Tree
void Select(HuffmanTree &HT,unsigned int i, unsigned int &min1,unsigned int &min2)
{  
    unsigned int tmp=HT[1].weight,j=0,t=1;
  //  for(t=1;HT[t].parent!=0;t++);
    while(HT[t].parent>0)
        t++;
    for( j=1,min1=t;j<= i; j++){
    if(HT[j].parent==0&&HT[j].weight<HT[min1].weight)
        min1=j;
    }
for(j=1,min2=t;j<=i;j++)
{
if((HT[j].parent==0)&&(HT[j].weight<HT[min2].weight)&&(!(j==min1)))
          min2=j;
}
if(min1==min2)
{
    do
   {  t++;
   }while(HT[t].parent>0);
   for(j=1,min2=t;j<=i;j++)
    {
     if((HT[j].parent==0)&&(HT[j].weight<HT[min2].weight)&&(!(j==min1)))
          min2=j;
     }
   }
 }
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, unsigned int *w,unsigned int n)
{
  unsigned  int i,s1=1,s2=1;
  unsigned  int m ,start;
  unsigned int k;
  HuffmanTree p;
  //*p={ *w,0,0,0};
    char *cd;
    if(n<=1) return;
    m=2*n-1;
   
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    HTNode HN;
      //  HN={*w,0,0,0};
    p=HT;
    for(p=p+1,i=1;i<=n;++i,++p,++w)
    {
        p->weight=*w;
        p->lchild=0;
        p->parent=0;
        p->rchild=0;
        //*p={*w,0,0,0};
    }
    for(;i<=m;++i,++p)
         {
        p->weight=0;
        p->lchild=0;
        p->parent=0;
        p->rchild=0;
        //*p={*w,0,0,0};
    }
       // *p={0,0,0,0};
    for(i=n+1;i<=m;++i)//Create HuffmanTree
    {
    Select(HT,i-1,s1,s2);
    HT[s1].parent=i;
    HT[s2].parent=i;
    HT[i].lchild=s1;
    HT[i].rchild=s2;
    HT[i].weight=HT[s1].weight+HT[s2].weight;
     printf("%6d  %6d   %6d   %6d %d/n",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild,i);
    }
//get the Huffman code
    HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
    cd=(char *)malloc(n*sizeof(char));
    cd[n-1]='/0';

    for(k=1;k<=m;++k)
    {
    printf("%6d  %6d   %6d   %6d   %7d/n",HT[k].weight,HT[k].parent,HT[k].lchild,HT[k].rchild,k);
    }
    for(k=1;k<=n;++k)
    {
        unsigned int c,f;
        start = n-1;
        for(c=k, f=HT[k].parent;f != 0;c=f, f=HT[f].parent)
        {
            if(HT[f].lchild==c)
                cd[--start]='0';
            else cd[--start]='1';
        }
            HC[k] = (char *)malloc((n-start)*sizeof(char));
        //    printf("cd is %s/n", cd);
            strcpy(HC[k],&cd[start]);
            printf("k %6d is %s  /n", k,HC[k]);
    }
   
    free(cd);
}

void main()
{
    unsigned int a[]={5,29,7,8,14,23,3,11};
    unsigned int *w=a;
   /* for(int i=1;i<=8;i++,w++)
        printf("%d/n",*w);
    w=a;*/
    HuffmanTree HT;
    HuffmanCode HC;
HuffmanCoding(HT,HC, w,  8);
for(int i=1;i<=8;i++)
        printf("%S  %6d",HC[i],HT[i].weight);

//printf("%d/n",*(w+1));
system("pause");

}

总结:1,cpp用的并不熟,内部变量,局部变量与函数变量不熟悉。

2,逻辑算法能力有待提高,加强训练。


相关阅读:
Top