huffman编码运行输出的不是一个字符的完整编码,只是第一个编码,不知该怎么弄
求高手相助!!!不胜感激!!!
初学数据结构,希望各位高手帮帮忙!
#include<iostream.h>
#include<string.h>
#define MAX 654321 //定义权值最大的上界
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储霍夫曼树
typedef char * *HuffmanCode; //动态分配数组存储霍夫曼编码表
void Select(HuffmanTree HT,int n, int &s1, int &s2) //注意加&
{
//HT,为树所在数组的头指针,n为允许查找的最大序号,s1,s2,返回最小的两个序号
unsigned int p1=MAX,p2=MAX;//p1, p2用来记录最小的两个权, 要求p1<p2
unsigned int pn1=0,pn2=0; //pn1, pn2 用来记录这两个权的序号
int i;
for(i=1;i<=n;i++)
{ if((HT[i].weight<p1)&&(HT[i].parent==0))
{/*如果当前结点的权比p1小,那么p2的权被赋为p1的权, p1的权为当前权,同时修改pn1, pn2
查找的结点要求没有父结点*/
pn2=pn1;
p2=p1;
p1=HT[i].weight;
pn1=i;
}
else if((HT[i].weight<p2)&&(HT[i].parent==0))
{//如果当前结点的权比p2小(由第一个if,当前权不比p1小),那么p2的权赋为当前权,同时修改pn2
p2=HT[i].weight;
pn2=i;
}
}
s1=pn1;
s2=pn2; //赋值返回
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n)
{
//w存放n个字符的权值,构造霍夫曼树HT,并求出n个字符的霍夫曼编码
if(n<=1) return;
int m=2*n-1; //m为结点总数,n为叶子结点数
int s1=0,s2=0,i;
unsigned int f,c;
HT=new HTNode[m+1]; //HT[m]表示根结点,HT[0]未用
//初始化
cout<<"请输入"<<n<<"个权值(用回车隔开):"<<endl;
for(i=1;i<=n;++i)
{
cin>>HT[i].weight;
}
for(i=1;i<=m;++i)
{
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].parent=0;
}
for(i=n+1;i<=m;++i) //建霍夫曼树
{
Select(HT,i-1,s1,s2);//在HT[1···i-1]选择parent为0且weight最小的两个结点,其序号分别为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;
}
cout<<"建立霍夫曼树成功"<<endl;
//从叶子到根逆向求每个字符的霍夫曼编码
HC=new char*[n+1]; //分配n个字符编码的头指针向量
char* *cd;
cd=new char*[n];
cd[n-1]='/0'; //编码结束符
for(i=1;i<=n;++i) //逐个字符求霍夫曼编码
{
int 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]=new char[n-start]; //为第i个字符编码分配空间
strcpy(HC[i],cd[start]);//从cd复制编码到HC
}
delete cd; //释放工作空间
}
void main()
{
HuffmanTree HT;
HuffmanCode HC;
int n=0;
cout<<"请输入待构造的霍夫曼树中带权叶子节点数n=";
while(1)
{
cin>>n;
if(n>1)
break;
else
cout<<"重输n=";
}
HuffmanCoding(HT,HC,n);
for(int i=1;i<=n;i++)
cout<<HT[i].weight<<HC[i];
}