数据结构哈夫曼编码实验报告Word下载.docx

上传人:b****5 文档编号:19601801 上传时间:2023-01-08 格式:DOCX 页数:12 大小:18.13KB
下载 相关 举报
数据结构哈夫曼编码实验报告Word下载.docx_第1页
第1页 / 共12页
数据结构哈夫曼编码实验报告Word下载.docx_第2页
第2页 / 共12页
数据结构哈夫曼编码实验报告Word下载.docx_第3页
第3页 / 共12页
数据结构哈夫曼编码实验报告Word下载.docx_第4页
第4页 / 共12页
数据结构哈夫曼编码实验报告Word下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构哈夫曼编码实验报告Word下载.docx

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

数据结构哈夫曼编码实验报告Word下载.docx

#defineMAXBIT10

typedefstruct

intbit[MAXBIT];

intstart;

}HcodeType;

3、文件nodedata.dat、code.dat和textfile.dat。

三、【功能(函数)设计】

1、初始化功能模块。

此功能模块的功能为从键盘接收字符集大小n,以及n个字符和n个权值。

2、建立哈夫曼树的功能模块。

此模块功能为使用1中得到的数据按照教材中的构造哈夫曼树的算法构造哈夫曼树,即将HuffNode数组中的各个位置的各个域都添上相关的值,并将这个结构体数组存于文件hfmtree.dat中。

3、建立哈夫曼编码的功能模块。

此模块功能为从文件nodedata.dat中读入相关的字符信息进行哈夫曼编码,然后将结果存入code.dat中,同时将字符与0、1代码串的一一对应关系打印到屏幕上。

4、译码的功能模块。

此模块功能为接收需要译码的0、1代码串,按照3中建立的编码规则将其翻译成字符集中字符所组成的字符串形式,存入文件textfile.dat,同时将翻译的结果在屏幕上打印输出。

四、【编码实现】

#include<

iostream.h>

#include<

fstream.h>

string.h>

stdlib.h>

#defineMaxBit10

#defineMaxvalue100//应该大于权重之和

#defineMaxleaf100

#defineMaxnodeMaxleaf*2-1

structHcodeType

intbit[MaxBit];

intstart;

};

voidCreat_Haffmantree(int&

n)

HNodeType*HaffNode=newHNodeType[2*n-1];

inti,j;

intm1,m2,x1,x2;

for(i=0;

i<

2*n-1;

i++)

{

HaffNode[i].weight=0;

HaffNode[i].parent=-1;

HaffNode[i].lchild=-1;

HaffNode[i].rchild=-1;

HaffNode[i].inf='

0'

;

}

n;

cout<

<

"

请输入字符"

endl;

cin>

>

HaffNode[i].inf;

请输入该字符的权值"

HaffNode[i].weight;

n-1;

i++)//构造哈夫曼树

m1=m2=Maxvalue;

x1=x2=0;

for(j=0;

j<

n+i;

j++)//选取最小和次小

{

if(HaffNode[j].parent==-1&

&

HaffNode[j].weight<

m1)

{

m2=m1;

x2=x1;

m1=HaffNode[j].weight;

x1=j;

}

else

if(HaffNode[j].parent==-1&

m2)

{

m2=HaffNode[j].weight;

x2=j;

}

}

//将找出的最小和次小合并,创造其父母结点

HaffNode[x1].parent=n+i;

HaffNode[x2].parent=n+i;

HaffNode[n+i].weight=HaffNode[x1].weight+HaffNode[x2].weight;

HaffNode[n+i].lchild=x1;

HaffNode[n+i].rchild=x2;

HaffNode[n+i].inf=NULL;

}

cout<

显示存储的哈弗曼树信息:

权值左孩子右孩子双亲"

HaffNode[i].weight<

"

HaffNode[i].lchild<

HaffNode[i].rchild<

HaffNode[i].parent<

HaffNode[i].inf<

//写入文件

fstreamoutfile1;

outfile1.open("

E:

\\nodedata.dat"

ios:

:

out|ios:

trunc|ios:

binary);

//建立进行写入的文件

if(!

outfile1)//没有创建成功则显示相应信息

nodedata.dat文件不能打开"

abort();

i++)//将内存中从HaffNode[i]地址开始的sizeof(HaffNode[i])的内容写入文件中

outfile1.write((char*)&

HaffNode[i],sizeof(HaffNode[i]));

outfile1.close();

//关闭文件

delete[]HaffNode;

}

voidHaffCode(int&

n)//哈夫曼编码

HNodeType*HaffNode=newHNodeType[Maxnode];

HcodeType*HaffCode=newHcodeType[Maxleaf];

HcodeTypecd;

inti,j,c,p;

fstreamin("

in|ios:

in.read((char*)HaffNode,(2*n-1)*sizeof(HNodeType));

in.close();

fstreamoutfile;

outfile.open("

\\codedata.dat"

cd.start=n-1;

c=i;

p=HaffNode[c].parent;

while(p!

=-1)

if(HaffNode[p].lchild==c)

cd.bit[cd.start]=0;

cd.bit[cd.start]=1;

cd.start--;

c=p;

p=HaffNode[c].parent;

for(j=cd.start+1;

j++)

HaffCode[i].bit[j]=cd.bit[j];

HaffCode[i].start=cd.start;

outfile<

for(j=HaffCode[i].start+1;

outfile<

HaffCode[i].bit[j];

字符信息--编码信息"

---"

for(j=HaffCode[i].start+1;

outfile.close();

请输入要编码的字符串,基本元素为("

"

)"

charinf[100];

cin>

inf;

intf=strlen(inf);

\\code.dat"

outfile1)

code.dat文件不能打开!

abort();

else

{cout<

字符串编码后为:

for(intx=0;

x<

f;

x++)

if(inf[x]==HaffNode[i].inf)

for(j=HaffCode[i].start+1;

outfile1.write((char*)&

HaffCode[i].bit[j],sizeof(HaffCode[i].bit[j]));

cout<

编译后的代码串已经存入code.dat文件中!

outfile1.close();

delete[]HaffNode;

delete[]HaffCode;

voiddecode(int&

n)//解码

inti;

fstreaminfile1;

infile1.open("

//读出哈夫曼树

infile1)

infile1.read((char*)&

HaffNode[i],sizeof(HNodeType));

infile1.close();

inttempcode[100];

intnum=0;

100;

tempcode[i]=-1;

HcodeType*Code=newHcodeType[n];

fstreaminfile2;

//读编码

infile2.open("

while(!

infile2.eof())

infile2.read((char*)&

tempcode[num],sizeof(tempcode[num]));

num++;

infile2.close();

num--;

从文件中读出的编码为"

num;

tempcode[i];

intm=2*n-2;

i=0;

译码后为:

\\textfile.txt"

out);

outfile)

textfile.txt文件不能打开!

while(i<

num)//小于字符串的长度

while(HaffNode[m].lchild!

=-1&

HaffNode[m].rchild!

if(tempcode[i]==0)

{

m=HaffNode[m].lchild;

i++;

elseif(tempcode[i]==1)

m=HaffNode[m].rchild;

HaffNode[m].inf;

m=2*n-2;

outfile.close();

译码后的结果已经存入textfile.txt中!

}

intmain()

intn;

*************欢迎进入编/译码系统!

*********************"

intch1;

do{

1.建树"

2:

编码,并显示字符和对应的编码"

3:

译码"

0:

退出"

********************************************************"

请选择(0~3):

ch1;

while(!

(ch1<

=3&

ch1>

=0))//输入不在0到4之间无效

cout<

数据输入错误,请重新选择(0~4):

cin>

switch(ch1)

{

case1:

\t\t\t请输入编码个数"

//叶子结点个数

cin>

Creat_Haffmantree(n);

break;

case2:

HaffCode(n);

break;

case3:

decode(n);

}while(ch1!

=0);

return0;

 

五、【运行与测试】

1、令叶子结点个数n为4,权值集合为{1,3,5,7},字符集合为{A,B,C,D},并有如下对应关系,A――1、B――3,C――5,D――7,调用初始化功能模块可以正确接收这些数据。

2、调用建立哈夫曼树的功能模块,构造静态链表HuffNode的存储。

3、调用建立哈夫曼编码的功能模块,在屏幕上显示如下对应关系:

A――111、B――110、C――10、D――0

4、调用译码的功能模块,输入代码串“111110100”后,屏幕上显示译码结果:

111110100――――ABCD

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

当前位置:首页 > 工程科技 > 环境科学食品科学

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

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