回 帖 发 新 帖 刷新版面

主题:[讨论]求助:用C++语言编写“哈夫曼编码和译码”,大哥哥大姐姐帮忙回个帖啊~~~

求助:用C++语言编写“哈夫曼编码和译码”,大哥哥大姐姐帮忙回个帖啊~~~

回复列表 (共3个回复)

沙发

我这里有一个自编的,可以参考一下

板凳

#include<stdio.h>

typedef struct{
    int weight;
    int parent,lchild,rchild;
    int mark;/* mark为标记符,标记是否有比较,若没比较则值为0,否则为1 */
    }htnode,*huffmantree;
typedef struct huffcode{
    int *code;
    }huffcode,*huffmancode;

/* ------------定义栈的结构体------------- */
typedef struct{
    int *base;
    int *top;
    int stacksize;}sqstack;

/* -----------栈的初始化----------------- */
initstack(sqstack *s)
{
 s->base=(int *)malloc(100*sizeof(int));
 if(!s->base)
    exit();
 s->top=s->base;
 s->stacksize=100;
}
/* ------------求当前栈的长度----------- */
int length(sqstack *s)
{
 return s->top-s->base;
}
/* --------------把元素e压入栈中------------------ */
push(sqstack *s,int e)
{
 if(length(s)>=s->stacksize)
    {
     s->base=(int *)realloc(s->base,(s->stacksize+10)*sizeof(int));
     if(!s->base) exit();
     s->top=s->base+s->stacksize;
     /* 为下一次插入作准备,下一次插入的时候不会出现错误追加空间 */
     s->stacksize+=10;
    }
 *s->top=e;
 s->top++;
}
/* -----------弹出当前栈顶元素------------- */
int pop(sqstack *s)
{
 int e;
 if(s->top==s->base) exit();
 e=*(--s->top);
 return e;
}

3 楼

/*-----创建一个赫夫曼树并求它的赫夫曼编码且打印出来----*/
void createhuffman(huffmantree huff)
{
 int *weight;
 int i,j,k=1,m,n,temp,x;/* m,n为赫夫曼树中两个权植最小的结点 */
 unsigned int tempa,tempb;/* 比较大小的中间变量 */
 sqstack *hc;/* 定义栈存放赫夫曼码 */
 printf("How many does the huffman's leaves?Please input a number:");
 scanf("%d",&n);
 weight=(int *)malloc(n*sizeof(int));/* 存放权值的数组 */
 /* ----------输入权值-------------- */
 for(j=1;j<=n;j++)
    {
     printf("please input the %d weight:",j);
     scanf("%d",&*(weight+j-1));
    }/* for */
 huff=(huffmantree)malloc((2*n)*sizeof(htnode));/* 分配结点空间,0结点不用 */
 if(!huff)exit();
 /* ------------赫夫曼树初始化及生成所给权值叶子的双亲------- */
 for(i=1;i<=n;i++)
    {
     huff[i].weight=*(weight+i-1);
     huff[i].lchild=huff[i].rchild=huff[i].parent=0;
     huff[i].mark=0;/* 给叶子初始化 */
    }/* for */
 for(i=n+1;i<=(2*n-1);i++)
    {
     huff[i].weight=huff[i].lchild=huff[i].rchild=huff[i].parent=0;
     huff[i].mark=0;/* 给非叶子初始化 */
    }/* for */
 for(j=n+1;j<=(2*n-1);j++)
    {/* -------查找第一个最小权值-------- */
     while(huff[k].mark==1)
        k++;/* 定位到没有比较的权值 */
     tempa=huff[k].weight;/* 作下面的比较之用 */
     m=k;
     for(k=1;k<=j-1;k++)
        if(huff[k].mark!=1)
          if(tempa>huff[k].weight)
             {
              tempa=huff[k].weight;
              m=k;
             }/* if */
     huff[m].mark=1;/* 标记为已比较过的 */
     k=1;/* 为下一步作准备 */
     /* -------查找第二个最小权值--------- */
     while(huff[k].mark==1)
        k++;/* 定位到没有比较的权值 */
     tempb=huff[k].weight;/* 作下面的比较之用 */
     x=k;
     for(k=1;k<=j-1;k++)
        if(huff[k].mark!=1)
          if(tempb>huff[k].weight)
             {
              tempb=huff[k].weight;
              x=k;
             }/* 选择两个最小结点,分别赋给m,n */
     huff[x].mark=1;/* 标记为已比较过的 */
     k=1;/* 为下一步作准备 */

     huff[m].parent=j;huff[x].parent=j;
     huff[j].lchild=m;
     huff[j].rchild=x;
     huff[j].weight=tempa+tempb;
    }/* for */
    /* ---------打印出赫夫曼树的所有结点值--------- */
    printf("number  weight   parent   lchild   rchild\n");
    for(i=1;i<=(2*n-1);i++)
        {
         printf("%3d %8d %8d %8d %8d\n",i,huff[i].weight,huff[i].parent,huff[i].lchild,huff[i].rchild);
        }

    hc=(sqstack *)malloc((n)*sizeof(sqstack));/* 定义栈数组 */
    for(i=0;i<n;i++)
         initstack(&hc[i]);/* 栈数组初始化 */
    for(i=1;i<=n;i++)
        {
     /* ------把逆的赫夫曼码压入栈中-------- */
            m=i;
            while(huff[m].parent!=0)
            {
             if(huff[huff[m].parent].lchild==m)
               k=0;
             if(huff[huff[m].parent].rchild==m)
               k=1;
             push(&hc[i-1],k);
             m=huff[m].parent;
            }/* while */
        }/* for */
     if(n==1)/* 若只有一个叶子则无赫夫曼码 */
        printf("no huffmancode\n");
     else
     {
     for(i=1;i<=n;i++)
       {
     /* -------打印出赫夫曼码--------- */
         printf("the %d's huffmancode is:",huff[i].weight);
         while(length(&hc[i-1])!=0)
         {
          /* m=pop(&hc[i-1]); */
          printf("%d",pop(&hc[i-1]));
         }/* while */
        printf("\n");
       }/* for */
     }/* else */
}/* createfuffman */

void main()
{
 htnode h;
 createhuffman(&h);

 getch();
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册