📄 赫夫曼树2.txt
字号:
}
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 + -