数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx
《数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
b'
c'
d'
e'
,此容可以放入结点中,不单独设数组存放
intLeafNum;
//哈夫曼树的叶子个数,也是源码个数
public:
HuffmanTree();
~HuffmanTree();
voidCreateHuffmanTree();
/*在存中建立哈夫曼树,存放在Node[]中。
让用户从两种建立哈夫曼树的方法中选择:
1.从键盘读入源码字符集个数,每个字符,和每个字符的权重,建立哈夫曼树,
并将哈夫曼树写入文件hfmTree中。
2.从文件hfmTree中读入哈夫曼树信息,建立哈夫曼树*/
voidCreateHuffmanTreeFromKeyboard();
voidCreateHuffmanTreeFromFile();
voidEncoder();
/*使用建立好的哈夫曼树(如果不在存,则从文件hfmTree中读入并建立存里的哈夫曼树),
对文件ToBeTran中的正文进行编码,并将码文写入文件CodeFile中。
ToBeTran的容可以用记事本等程序编辑产生。
*/
voidDecoder();
/*待译码的码文存放在文件CodeFile中,使用建立好的哈夫曼树(如果不在存,
则从文件hfmTree中读入并建立存里的哈夫曼树)将码文译码,
得到的源文写入文件TextFile中,并同时输出到屏幕上。
*/
voidPrintCodeFile();
/*将码文文件CodeFile显示在屏幕上*/
voidPrintHuffmanTree();
/*将哈夫曼树以直观的形式(凹入表示法,或广义表,或其他树形表示法)显示在屏幕上,
同时写入文件TreePrintFile中*/
voidPrintHuffmanTree_aoru(intT,intlayer=1);
/*凹入表示法显示哈夫曼树,由PrintHuffmanTree()调用*/
///////////////////////////////////////////////////////////////////HuffmanTree.cpp
limits>
//为使用整型最大值
#include"
HuffmanTree.h"
usingnamespacestd;
//******************************************************
HuffmanTree:
:
HuffmanTree()
Node=NULL;
}
~HuffmanTree()
delete[]Node;
voidHuffmanTree:
CreateHuffmanTree()
charChoose;
cout<
<
"
你要从文件中读入哈夫曼树(按1),还是从键盘输入哈夫曼树(按2)?
;
cin>
>
Choose;
if(Choose=='
2'
){//键盘输入建立哈夫曼树
CreateHuffmanTreeFromKeyboard();
}//choose=='
else{//从哈夫曼树文件hfmTree.dat中读入信息并建立哈夫曼树
CreateHuffmanTreeFromFile();
}
CreateHuffmanTreeFromKeyboard()
intNum;
cout<
\n请输入源码字符集个数:
cin>
Num;
if(Num<
=1)
{
cout<
无法建立少于2个叶子结点的哈夫曼树。
\n\n"
return;
}
LeafNum=Num;
Node=newHuffmanNode[2*Num-1];
Info=newchar[2*Num-1];
for(inti=0;
i<
i++){//读入哈夫曼树的叶子结点信息
请输入第"
i+1<
个字符值"
getchar();
Info[i]=getchar();
//源文的字符存入字符数组Info[]
请输入该字符的权值或频度"
cin>
Node[i].weight;
//源文的字符权重存入Node[].weight
Node[i].parent=-1;
Node[i].lchild=-1;
Node[i].rchild=-1;
for(i=Num;
2*Num-1;
i++)
{//循环建立哈夫曼树部结点
intpos1=-1,pos2=-1;
intmax1=32767,max2=32767;
for(intj=0;
j<
i;
j++)//在根节点中选出权值最小的两个
if(Node[j].parent==-1)//是否为根结点
if(Node[j].weight<
max1)
{
max2=max1;
max1=Node[j].weight;
pos2=pos1;
pos1=j;
}
else
if(Node[j].weight<
max2)
{
max2=Node[j].weight;
pos2=j;
}
Node[pos1].parent=i;
Node[pos2].parent=i;
Node[i].lchild=pos1;
Node[i].rchild=pos2;
Node[i].weight=Node[pos1].weight+Node[pos2].weight;
}//for
哈夫曼树已成功构造完成。
\n"
//把建立好的哈夫曼树写入文件hfmTree.dat
charch;
是否要替换原来的哈夫曼树文件(Y/N):
ch;
if(ch!
='
y'
&
ch!
Y'
)return;
else
ofstreamfop;
fop.open("
hfmTree.dat"
ios:
out|ios:
binary|ios:
trunc);
//打开文件
if(fop.fail())
{
cout<
\n哈夫曼树文件打开失败,无法将哈夫曼树写入hfmTree.dat文件。
}
fop.write((char*)&
Num,sizeof(Num));
//先写入哈夫曼树的叶子结点个数
for(i=0;
i++)
{//再写入源文字符集的所有字符(存储在Info[]中)
fop.write((char*)&
Info[i],sizeof(Info[i]));
flush(cout);
{//最后写入哈夫曼树的各个结点(存储在Node[]中)
Node[i],sizeof(Node[i]));
fop.close();
//关闭文件
\n哈夫曼树已成功写入hfmTree.dat文件。
CreateHuffmanTreeFromFile()
ifstreamfip;
fip.open("
in);
if(fip.fail())
{
哈夫曼树文件hfmTree.dat打开失败,无法建立哈夫曼树。
return;
fip.read((char*)&
LeafNum,sizeof(LeafNum));
if(LeafNum<
=1)
哈夫曼树文件中的数据有误,叶子结点个数少于2个,无法建立哈夫曼树。
fip.close();
Info=newchar[LeafNum];
Node=newHuffmanNode[2*LeafNum-1];
for(inti=0;
LeafNum;
fip.read((char*)&
for(i=0;
2*LeafNum-1;
fip.close();
Encoder()
if(Node==NULL)
{//存没有哈夫曼树,则从哈夫曼树文件hfmTree.dat中读入信息并建立哈夫曼树
if(LeafNum<
存无哈夫曼树。
操作撤销。
}//if
char*SourceText;
//字符串数组,用于存放源文
//让用户选择源文是从键盘输入,还是从源文文件ToBeTran.txt中读入
你要从文件中读入源文(按1),还是从键盘输入源文(按2)?
1'
)
ifstreamfi