⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 赫夫曼树2.txt

📁 自己做的赫夫曼树
💻 TXT
📖 第 1 页 / 共 2 页
字号:
 }  
   
 ofstream fop("CodeFile.dat",ios::trunc);      //存储编码后的代码,并覆盖原文件  
 i=0;  
 int k=0;  
 char *code;  
 code=new char[LeafNum];        //为所产生编码分配容量为LeafNum的存储空间  
                               //因为不等长编码中最长的编码一定不会超过要求编码的字符个数  
 while(Tree[k]!=’\0’)              //对每一个字符编码  
 {  
  int j,start=0;  
  for(i=0;i   if(Info[i]==Tree[k])            //求出该文字所在单元的编号  
    break;   
   j=i;  
  while(Node[j].parent!=-1)        //结点j非树根  
  {  
   j=Node[j].parent;             //非结点j的双亲结点  
   if(Node[j].lchild==i)           //是左子树,则生成代码0  
    code[start++]=’0’;  
   else                       //是右子树,则生成代码1  
    code[start++]=’1’;\  
   i=j;  
  }  
  code[start]=’\0’;             //置串结束符  

    
  for(i=0;i  {  
   j=code[i];  
   code[i]=code[start-i-1];  
   code[start-i-1]=j;  
  }  
        i=0;  
  while(code[i]!=’\0’)        //存储代码  
  {  
   fop<   i++;  
  }  
  k++;  
 }  
 fop.close();  
 cout<<"已编码!且存到文件CodeFile.dat中!\n\n";  
}  //Encode  
//////////////////////////////////////////////////////////////////////////////  
//  译码函数  
//  函数功能:利用已建好的哈夫曼树,对传输到达的CodeFile中的数据代码进行译码,  
//            将译码结果存入文件TextFile中.  
//  函数参数:无  
//  参数返回值:无  
void HuffmanTree::Decoder()  
{  
 int i=0,k=0;  
 int j=LeafNum*2-1-1;      //表示从根结点开始往下搜索  
 char* BitStr;  
   
 ifstream fip1("CodeFile.dat");          //利用已建好的哈夫曼树将文件CodeFile中的代码进行译码  
 if(fip1.fail())         //文件打开失败,还未编码  
 {  
  cout<<        "请先编码!\n";  
  return;  
 }  
 cout<<"经译码,原内容为:";  
 char ch;  
 while(fip1.get(ch))              
 {  
  k++;                     //计算CodeFile中代码长度  
 }  
 fip1.close();    
   
 BitStr=new char[k+1];  
 ifstream fip2("CodeFile.dat");  
 k=0;  
 while(fip2.get(ch))  
 {  
  BitStr[k]=ch;          //读取文件内容  
  k++;  
 }  
 fip2.close();                  
 BitStr[k]=’\0’;         //结束标志符  
 if(Node==NULL)         //还未建哈夫曼树  
 {  
  cout<<"请先编码!\n";  
  return;  
 }  
 ofstream fop("TextFile.dat");         //将字符形式的编码文件写入文件CodePrin中  
 while(BitStr[i]!=’\0’)  
 {  
  if(BitStr[i]==’0’)  
   j=Node[j].lchild;          //往左走  
  else  
   j=Node[j].rchild;         //往右走  
  if(Node[j].rchild==-1)   //到达叶子结点  
  {  
   cout<   j=LeafNum*2-1-1;             //表示重新从根结点开始往下搜索  
   fop<  }//if、  
  i++;  
 }//while  
 fop.close();  
   
 cout<<"\n译码成功且已存到文件TextFile.dat中!\n\n";  
}//Decoder  
//////////////////////////////////////////////////////////////////////////////  
//  印文件代码函数  
//  函数功能:将文件CodeFile以紧凑格式显示在终端上,  
//            每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。  
//  函数参数:无  
//  参数返回值:无  
void HuffmanTree::Print()  
{  
 char ch;  
 int i=1;  
 ifstream fip("CodeFile.dat");           //读取文件  
 ofstream fop("CodePrin.dat");           //存储文件  
 if(fip.fail())  
 {  
  cout<<"没有文件,请先编码!\n";  

  return;  
 }  
 while(fip.get(ch))  
 {  
  cout<  fop<  if(i==50)        //每行输出50个字符  
  {  
   cout<   i=0;  
  }  
  i++;  
 }  
 cout< fip.close();          //关闭CodeFile.dat文件  
 fop.close();            //关闭CodePrin.dat文件  
}  
//////////////////////////////////////////////////////////////////////////////  
//  印哈夫曼树函数  
//  函数功能:将已在内存中的哈夫曼树以直观的方式(树或凹入表的形式)显示在终端上,  
//            同时将此字符形式的哈夫曼树写入文件TreePrint中。  
//  函数参数:无  
//  参数返回值:无  
void HuffmanTree::TreePrinting()  
{  
 if(Node==NULL)         //未建立哈夫曼树  
 {  
  cout<<"请先建立哈夫曼树!\n";  
  return;  
 }  
 ofstream fop("TreePrint.dat");  
 cout<<"结点位置(权值)  "<<"编码  "<<"左孩子  "<<"编码"<<"右孩子(’^’表示叶子)\n";  
 fop<<"结点位置(权值)  "<<"编码  "<<"左孩子  "<<"编码"<<"右孩子(’^’表示叶子)\n";  
 int i;  
 for(i=(2*LeafNum-2);i>LeafNum-1;i--)        //输出哈夫曼树  
 {  
  cout<  <  <  fop<  <  < }  
 for(;i>=0;i--)  
 {  
  cout<  fop< }  
}  

//        程序名:main.cpp  
//      程序功能:主函数源文件  
//          作者:刘伟高  
//          日期:2006.11.27  
//          版本:1.0  


#include"HuffmanTree.h"  
#include  
#include  

//////////////////////////////////////////////////////////////////////////////  
//  主函数  
//参数返回值:无  

int main()  
{  
 cout<<"         欢迎使用哈夫曼码的编/译码系统!\n";  
 cout<<"                         刘伟高\n";  
 cout<<"              版权所有,盗版必究\n";   
 cout<<"在此系统中可以进行以下操作:\n";  
 cout<<"(1) 初始化(I);\n";  
 cout<<"(2) 编码(E);\n";  
 cout<<"(3) 译码(D);\n";  
 cout<<"(4) 印代码文件(P);\n";  
 cout<<"(5) 印哈夫曼树(T)\n";  
 cout<<"(6) 退出(Q)\n\n";  
 HuffmanTree huftree;         //定义哈夫曼树对象  
 int weight;  
 char Choose;  
 while(1)  
 {  
  cout<<"请从清单中选择一个操作(不区分大小写):";  
  cin>>Choose;  
  switch(Choose)  
  {  
  case ’I’:  
  case ’i’:  
   cout<<"请输入编码长度:";  
   cin>>weight;  
   huftree.Initialization(weight);      //初始化哈夫曼树  
   break;  
  case ’E’:  
  case ’e’:  
   huftree.Encoder();  
   break;  
  case ’D’:  
  case ’d’:  
   huftree.Decoder();  
   break;  
  case ’P’:  
  case ’p’:  
   huftree.Print();  
   break;  
  case ’T’:  
  case ’t’:  
   huftree.TreePrinting();  
   break;  
  case ’Q’:  
  case ’q’:  
   cout<<"\n        ***********感谢使用本系统!***********\n\n";  
           system(“pause”);    //暂停运行  
   return 0;  
  }  
  cout<<"(1) 初始化(I)      (2) 编码(E)         (3) 译码(D)\n";  
  cout<<"(4) 印代码文件(P)  (5) 印哈夫曼树(T)   (6) 退出(Q)\n";  
 }  
}  

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -