主题:关于哈夫曼编码
这是一个关于哈夫曼编码的程序,但是其中的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]
那位能帮忙谢谢啊!
就是这个函数:
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]