数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx

上传人:b****2 文档编号:13477636 上传时间:2022-10-11 格式:DOCX 页数:18 大小:220.96KB
下载 相关 举报
数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx_第1页
第1页 / 共18页
数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx_第2页
第2页 / 共18页
数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx_第3页
第3页 / 共18页
数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx_第4页
第4页 / 共18页
数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx

《数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构哈夫曼树编码译码实验报告Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1