求高手相助!huffman编码

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];

}

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

lily03140909

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值