霍夫曼树的几个问题
霍夫曼树的几个小问题
[code=C/C++][/code]#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define n 100
#define m 2*n-1
typedef struct
{
int weight;
char ch;
int parent,lchild,rchild;
}HTNode;
typedef struct{
char ch;
char bits;
}CodeNode;
typedef struct
{
char cha;
int number;
}COUNTER;
int Init(HTNode ht[])
{
int i,s=1;
COUNTER counter[26];
char ch;
printf("请输入一段字符来确定权值:(限大写字母,以'!'号为结束标志)\n");
scanf("%c",&ch);
counter[1].cha='A';
counter[2].cha='B';
counter[3].cha='C';
counter[4].cha='D';
counter[5].cha='E';
counter[6].cha='F';
counter[7].cha='G';
counter[8].cha='H';
counter[9].cha='I';
counter[10].cha='J';
counter[11].cha='K';
counter[12].cha='L';
counter[13].cha='M';
counter[14].cha='N';
counter[15].cha='O';
counter[16].cha='P';
counter[17].cha='Q';
counter[18].cha='R';
counter[19].cha='S';
counter[20].cha='T';
counter[21].cha='U';
counter[22].cha='V';
counter[23].cha='W';
counter[24].cha='X';
counter[25].cha='Y';
counter[26].cha='Z';
for(i=1;i<=26;i++)
counter[i].number=0;
while(ch!='!')
{
switch(ch)
{
case 'A':counter[1].number++;break;
case 'B':counter[2].number++;break;
case 'C':counter[3].number++;break;
case 'D':counter[4].number++;break;
case 'E':counter[5].number++;break;
case 'F':counter[6].number++;break;
case 'G':counter[7].number++;break;
case 'H':counter[8].number++;break;
case 'I':counter[9].number++;break;
case 'J':counter[10].number++;break;
case 'K':counter[11].number++;break;
case 'L':counter[12].number++;break;
case 'M':counter[13].number++;break;
case 'N':counter[14].number++;break;
case 'O':counter[15].number++;break;
case 'P':counter[16].number++;break;
case 'Q':counter[17].number++;break;
case 'R':counter[18].number++;break;
case 'S':counter[19].number++;break;
case 'T':counter[20].number++;break;
case 'U':counter[21].number++;break;
case 'V':counter[22].number++;break;
case 'W':counter[23].number++;break;
case 'X':counter[24].number++;break;
case 'Y':counter[25].number++;break;
case 'Z':counter[26].number++;break;
}
scanf("%c",&ch);
}
for(i=1;i<=26;i++)
{
if(counter[i].number!=0)
{
ht[s].weight=counter[i].number;
ht[s].ch=counter[i].cha;
s++;
}
}
s=s-1;
return s;
}
void select(HTNode ht[],int q,int *p1,int *p2) //select函数,选出HT树到s为止,权值最小且parent为0的2个节点
{
int i,j,x,y;
for(j=1;j<=q;++j)
{
if(ht[j].parent==0)
{
x=j;
break;
}
}
for(i=j+1;i<=q;++i)
{
if(ht[i].weight<ht[x].weight&&ht[i].parent==0)
{
x=i; //选出最小的节点
}
}
for(j=1;j<=q;++j)
{
if(ht[j].parent==0&&x!=j)
{
y=j;
break;
}
}
for(i=j+1;i<=q;++i)
{
if(ht[i].weight<ht[y].weight&&ht[i].parent==0&&x!=i)
{
y=i; //选出次小的节点
}
}
if(x>y)
{
*p1=y;
*p2=x;
}
else
{
*p1=x;
*p2=y;
}
}
void huffman_setup(HTNode ht[],int s) //构建赫夫曼树HT,并求出n个字符的赫夫曼编码HC
{
int i,a;
int p1,p2;
a=2*s-1;
for(i=1;i<=a;i++)
{
if(i<=s)
{
ht[i].weight=ht[i].weight;
}
else
{
ht[i].weight=0;
}
ht[i].parent=ht[i].lchild=ht[i].rchild=0;
}
for(i=s+1;i<=m;++i) //建立赫夫曼树
[code=C/C++][/code]#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define n 100
#define m 2*n-1
typedef struct
{
int weight;
char ch;
int parent,lchild,rchild;
}HTNode;
typedef struct{
char ch;
char bits;
}CodeNode;
typedef struct
{
char cha;
int number;
}COUNTER;
int Init(HTNode ht[])
{
int i,s=1;
COUNTER counter[26];
char ch;
printf("请输入一段字符来确定权值:(限大写字母,以'!'号为结束标志)\n");
scanf("%c",&ch);
counter[1].cha='A';
counter[2].cha='B';
counter[3].cha='C';
counter[4].cha='D';
counter[5].cha='E';
counter[6].cha='F';
counter[7].cha='G';
counter[8].cha='H';
counter[9].cha='I';
counter[10].cha='J';
counter[11].cha='K';
counter[12].cha='L';
counter[13].cha='M';
counter[14].cha='N';
counter[15].cha='O';
counter[16].cha='P';
counter[17].cha='Q';
counter[18].cha='R';
counter[19].cha='S';
counter[20].cha='T';
counter[21].cha='U';
counter[22].cha='V';
counter[23].cha='W';
counter[24].cha='X';
counter[25].cha='Y';
counter[26].cha='Z';
for(i=1;i<=26;i++)
counter[i].number=0;
while(ch!='!')
{
switch(ch)
{
case 'A':counter[1].number++;break;
case 'B':counter[2].number++;break;
case 'C':counter[3].number++;break;
case 'D':counter[4].number++;break;
case 'E':counter[5].number++;break;
case 'F':counter[6].number++;break;
case 'G':counter[7].number++;break;
case 'H':counter[8].number++;break;
case 'I':counter[9].number++;break;
case 'J':counter[10].number++;break;
case 'K':counter[11].number++;break;
case 'L':counter[12].number++;break;
case 'M':counter[13].number++;break;
case 'N':counter[14].number++;break;
case 'O':counter[15].number++;break;
case 'P':counter[16].number++;break;
case 'Q':counter[17].number++;break;
case 'R':counter[18].number++;break;
case 'S':counter[19].number++;break;
case 'T':counter[20].number++;break;
case 'U':counter[21].number++;break;
case 'V':counter[22].number++;break;
case 'W':counter[23].number++;break;
case 'X':counter[24].number++;break;
case 'Y':counter[25].number++;break;
case 'Z':counter[26].number++;break;
}
scanf("%c",&ch);
}
for(i=1;i<=26;i++)
{
if(counter[i].number!=0)
{
ht[s].weight=counter[i].number;
ht[s].ch=counter[i].cha;
s++;
}
}
s=s-1;
return s;
}
void select(HTNode ht[],int q,int *p1,int *p2) //select函数,选出HT树到s为止,权值最小且parent为0的2个节点
{
int i,j,x,y;
for(j=1;j<=q;++j)
{
if(ht[j].parent==0)
{
x=j;
break;
}
}
for(i=j+1;i<=q;++i)
{
if(ht[i].weight<ht[x].weight&&ht[i].parent==0)
{
x=i; //选出最小的节点
}
}
for(j=1;j<=q;++j)
{
if(ht[j].parent==0&&x!=j)
{
y=j;
break;
}
}
for(i=j+1;i<=q;++i)
{
if(ht[i].weight<ht[y].weight&&ht[i].parent==0&&x!=i)
{
y=i; //选出次小的节点
}
}
if(x>y)
{
*p1=y;
*p2=x;
}
else
{
*p1=x;
*p2=y;
}
}
void huffman_setup(HTNode ht[],int s) //构建赫夫曼树HT,并求出n个字符的赫夫曼编码HC
{
int i,a;
int p1,p2;
a=2*s-1;
for(i=1;i<=a;i++)
{
if(i<=s)
{
ht[i].weight=ht[i].weight;
}
else
{
ht[i].weight=0;
}
ht[i].parent=ht[i].lchild=ht[i].rchild=0;
}
for(i=s+1;i<=m;++i) //建立赫夫曼树