📄 源代码.txt
字号:
ofstream fop;
fop.open("CodeFile.txt", ios::out|ios::binary); //打开存储代码的文件
char *code=new char[leafnum]; //存储字符编码
int k=0;
while(Tran[k]!='\0') //为文件ToBeTran.txt中的内容编码
{
int start=0;int l;
for(l=0;l<leafnum;l++)
if(yezi[l]==Tran[k]) //查找与需要编码字符的对应字符
{
int child=l;
int parent=ht[child].parent;
while(parent!=0) //编码
{
start++;
if(ht[parent].lchild==child)
code[start]='0';
else
code[start]='1';
child=parent;
parent=ht[child].parent;
}//while
while(start!=0)
{
fop<<code[start];
start--;
}//whilec
}//if
k++;
}//while
fop.close();
cout<<"\n编码完成!且已存储到文件CodeFile.txt中!\n";
};//Encode
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//译码函数
//函数功能:将代码还原称字符
//函数参数:无
//参数返回值:无
void HaffmanTree::Decode()
{
char ch;
ifstream fip2;
fip2.open("hfmTreey.txt",ios::in|ios::binary); //打开存储初始化字符的文件
if(fip2.fail())
{
cout<<"\n 打开失败!\n";
return;
}
HaffNode *ht= new HaffNode[2*leafnum-1]; //申请存储二叉树的空间
char *yezi=new char[leafnum]; //申请存储初始化字符的空间
int i=0;
while(fip2.get(ch))
{
yezi[i]=ch; //将文件中的字符读取到yezi数组中
i++;
}
yezi[i]='\0'; //结束标志
fip2.close(); //关闭文件hfmTreey
ifstream fip1;
fip1.open("hfmTree.txt",ios::in|ios::binary); //打开文件hfmTree,读取文件中的内容
i=0;
int in;
while(fip1>>in) //读取文件中的内容
{
int j=i/5;
int k=i%5;
switch(k)
{
case 0:
ht[j].weight=in;
break;
case 1:
ht[j].parent=in;
break;
case 2:
ht[j].lchild=in;
break;
case 3:
ht[j].rchild=in;
break;
case 4:
ht[j].floor=in;
break;
}
i++;
}
fip1.close(); //关闭文件hfmTree
ifstream fip3;
fip3.open("CodeFile.txt",ios::in|ios::binary);
i=0;
while(fip3.get(ch))
i++; //计算文件CodeFile中字符的个数
fip3.close();
char *code=new char[i++]; //申请存放文件CodeFile中字符的数组
ifstream fip4;
fip4.open("CodeFile.txt",ios::in|ios::binary);
i=0;
while(fip4.get(ch))
{
code[i]=ch; //读取文件CodeFile中的代码
i++;
}
code[i]='\0';
fip4.close();//关闭文件
i=0;
int j=2*leafnum-1-1; //初始化变量j,使j指向ht数组的跟节点
cout<<"\n译码后,得到字符为: ";
while(code[i]!='\0')
{
if(code[i]=='0')
j=ht[j].lchild;
else j=ht[j].rchild;
if(ht[j].rchild ==-1)
{
cout<<yezi[j]; //找到代码对应字符,输出该字符
j=2*leafnum-1-1; //j指向ht数组的跟节点,进行大二个字符的翻译
}
i++;
}
cout<<endl;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//印代码函数
//函数功能:印代码文件中的代码
//函数参数:无
//参数返回值:无
void HaffmanTree::Print()
{
ifstream fip;
fip.open("CodeFile.txt",ios::in|ios::binary); //以只读方式打开代码文件
ofstream fop;
fop.open("CodePrin.txt",ios::out|ios::binary); //打开文件,将代码写入该文件
char ch;
cout<<"\n编码文件中的代码为:\n\n";
int i=0;
while(fip.get(ch))
{
if(i%50==0) //每行输入50个代码
{
cout<<endl;
fop<<endl; //将代码存储到文件CodePrin.txt中
}
i++;
cout<<ch;
fop<<ch;
}//while
fip.close(); //关闭文件
fop.close();
cout<<"\n代码已写入文件CodePrint.txt中!\n";
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//印哈弗曼树
//函数功能:利用栈以凹表示法输出哈弗曼树
//函数参数:无
//参数返回值:无
void HaffmanTree::PrintTree()
{
char ch;
ifstream fip2;
fip2.open("hfmTreey.txt",ios::in|ios::binary); //打开存储初始化字符的文件
if(fip2.fail())
{
cout<<"\n 打开失败!\n";
return;
}
HaffNode *ht= new HaffNode[2*leafnum-1]; //申请存储二叉树的空间
char *yezi=new char[leafnum]; //申请存储初始化字符的空间
int i=0;
while(fip2.get(ch))
{
yezi[i]=ch; //将文件中的字符读取到yezi数组中
i++;
}
yezi[i]='\0'; //结束标志
fip2.close(); //关闭文件hfmTreey
ifstream fip1;
fip1.open("hfmTree.txt",ios::in|ios::binary); //打开文件hfmTree,读取文件中的内容
i=0;
int in;
while(fip1>>in)
{
int j=i/5;
int k=i%5;
switch(k)
{
case 0:
ht[j].weight=in;
break;
case 1:
ht[j].parent=in;
break;
case 2:
ht[j].lchild=in;
break;
case 3:
ht[j].rchild=in;
break;
case 4:
ht[j].floor=in;
break;
}
i++;
}
fip1.close(); //关闭文件hfmTree
ofstream op;
op.open("TreePrint.txt",ios::out|ios::binary|ios::trunc);
op.close();
cout<<"\n该哈夫曼树的凹入表示图为:\n";
ofstream fop;
fop.open("TreePrint.txt",ios::out|ios::binary); //打开文件,用于存入哈弗曼树
fop<<endl;
cout<<endl;
stack <HaffNode> s; //声明存储节点信息的栈
stack <int> f; //声明存储节点位置值的栈
int fl=2*leafnum-1-1; //初始化整形变量j,使j指向哈弗曼树的跟节点
HaffNode p;
p=ht[fl];
s.push(p); //将根节点信息压入栈
f.push(fl); //将根节点位置值压入栈
while(!s.empty()) //当栈不空时,已凹表示法输出哈弗曼树
{
p=s.top();
s.pop();
cout<<endl;
for(int i=0; i<p.floor; i++) //根据节点所在层次,输出其对应长度的横杆
{
fop<<"---"; //将横杆写入文件
cout<<"---"; //将横杆向终端输出
}
fop<<" ";
fop<<p.weight<<" "; //输出权值
cout<<" ";
cout<<p.weight<<" ";
fl=f.top();
f.pop();
if(fl<leafnum) //当节点是叶子节点是,输出初始化字符
{
fop<<yezi[fl]; //将字符写入文件
cout<<yezi[fl]; //将字符向终端输出
}
fop<<endl;
cout<<endl;
if(p.rchild!=-1) //当有左孩子时,左孩子入栈
{
f.push(p.rchild); //左孩子的位置值进栈
s.push(ht[p.rchild]);
}
if(p.lchild!=-1) //当有左孩子时,右孩子入栈
{
f.push(p.lchild); //右孩子的位置值进栈
s.push(ht[p.lchild]);
}
}
fop.close(); //关闭文件
}
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//程序名:hafuman.h
//程序功能:哈弗曼树类的头文件
//作者:黄秋旋
//2008.12.4
//版本:1.0
#include<iostream>
#include<fstream>
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct HaffNode //定义哈夫曼树节点结构
{
int weight;
int lchild;
int rchild;
int parent;
int floor; //表示节点的所在的层次,根节点的层次值最大,叶子节点的层次值为1
};
class HaffmanTree //定义哈弗曼树的类
{
private:
HaffNode *ht; //哈弗曼树的节点指针
int leafnum; //叶子个数
char *yezi; //初始化字符指针
public:
HaffmanTree(){leafnum=0; ht=NULL; yezi=NULL;}; //构造函数
~HaffmanTree(){}; //析构函数
int Haffman(); //初始化函数
void Encode(); //编码函数
void Decode() ; //译码函数
void Print(); //印代码文件函数
void PrintTree(); //印哈弗曼树函数
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -