回 帖 发 新 帖 刷新版面

主题:关于哈夫曼编码

这是一个关于哈夫曼编码的程序,但是其中的select函数该怎么弄啊!
那位能帮忙谢谢啊!
就是这个函数:
Select(HT,i-1,s1,s2);
 //在HT[1…i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2

/////////////////////////////////////////////////
typedef  char  **HuffmanCode; 

typedef struct  
{
   int  weight;
   int  parent, lchild, rchild;
}HTNode, *HuffmanTree; //动态分配一维数组存储哈夫曼树

void  HuffmanCoding(HuffmanTree  &HT,HuffmanCode  &HC,int *w,int n)//n为叶子结点
{      
      int s1,s2;
      int i,m,start;
      int c,f;
      char *cd;
      HuffmanTree p;
           if (n<=1)    
          return  ;
      m=2*n-1;//有n个叶子结点的哈夫曼树共有2n-1个结点
      HT=(HuffmanTree)malloc(m*sizeof(HTNode));//初始化
       for(p=HT,i=0;i<n;++i,++p,w++)//初始化叶子节点
       {
           p->weight=*w;
           p->parent=0;
           p->lchild=0;
           p->rchild=0;
       }
       for(;i<m;++i,++p) //初始化其他节点 
       {
           p->weight=0;
           p->parent=0;
           p->lchild=0;
           p->rchild=0;
       }
       for(i=n;i<m;++i)//建赫夫曼树
       { //不包括叶子节点
             [color=FF0000][b] Select(HT,i-1,s1,s2);
       //在HT[1…i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2[/b][/color]
              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;
       }
      HC=(HuffmanCode)malloc((n+1)*sizeof(char * ));
      //分配n个字符编码的头指针向量
      cd=(char * )malloc(n * sizeof(char)); //分配求编码的工作空间
      cd[n-1]='\0'; //编码结束符
      for(i=0;i<n;++i)
      {//逐个字符求赫夫曼编码
       start=n-1; //编码结束符位置
           for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)  
          //从叶子到根逆向求编码
                if(HT[f].lchild==c)  
                    cd[--start]='0';
                else  
                    cd[--start]='1';
           HC[i]= (char * )malloc(n * sizeof(char));
          //为第i个字符编码分配空间
           strcpy(HC[i],&cd[start]);    //从cd复制编码(串)到HC
      }
      free(cd);
}
-----------------------------------------------------

[fly][color=00FF00][size=5]学海无涯[/size][/color][/fly]

回复列表 (共2个回复)

沙发


我也正在写这个程序。关于这个函数,已经回答过一个朋友了。可参考
[url=http://www.programfan.com/club/showbbs.asp?id=231361]http://www.programfan.com/club/showbbs.asp?id=231361[/url]

板凳


//我写了一个求最小两个的下标

#include <stdio.h>
#include <conio.h>

#define N 13

void index_2ndMax(int a[],int n,int &min1,int &min2);

int main()
{
 int a[N]={1,5,4,3,2,8,9,7,0,12,6,11,0};
 int s1,s2;
 index_2ndMax(a,N,s1,s2);
 printf("The index of the first and the second min element is: a[%d]--a[%d]\n",s1,s2);
 printf("Press any key to continue.");
 getch();
 return 0;
}

void index_2ndMax(int a[],int n,int &min1,int &min2)//1,5,4,3,2,8,9,7,0,12,6,11
{
 int i;
 min1=0,min2=1; 
 for(i=2;i<n;i++)
 {
  if(a[i]<a[min2])
  {
      if(a[i]>a[min1])
        min2=i;   
      else
      {
          min2=min1;
          min1=i;
         }
  }  
 }//for
}


====================================================

[fly][color=00FF00][size=5]努力就会有成果!![/size][/color][/fly]


我来回复

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