数据结构实验赫夫曼编码.docx

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

数据结构实验赫夫曼编码.docx

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

数据结构实验赫夫曼编码.docx

数据结构实验赫夫曼编码

实习三二叉树应用

一、实验目的:

熟悉二叉树的存储结构,二叉树的有关的操作。

二、实验内容及要求:

哈夫曼编/译码器

[问题描述]

利用哈夫曼编码进行通信可以大大提高信道利用率,这要求在发送端通过一个编码系统

对待传输预先编码,在接收端将传来的数据进行译码。

对于双工通道,每端都需要一个完整

的编/译码系统。

[基本要求]

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

[实现提示]

构造哈夫曼树的算法实现:

假设哈夫曼树采用双亲孩子表示法存储,并增加权值域,构造哈夫曼树的叶子结点(树

木的权)有N个,合并次数为N—1次,则森林中总共有2N—1棵树,(包含合并后删除的)。

存储结构描述为:

constintn=maxn//maxn表示叶子数目

constintm=2*n-1//m为森林中树的棵数

classtree

{

floatweight;//权值

intparent;//双亲

intlch,rch;//左,右孩子

}

treehftree[m+1];//规定从第一个元素hftree[1]开始使用数组元素,故定义长

度为m+1而不为m

结构类型:

typedefstruct

{

chardata;

intweight;

intparent;

intlchild;

intrchild;

}huffnode;

typedefstruct

{

charcd[MAX];

intstart;

}huffcode;

主程序

intmain()

{

初始化:

输入字符代码以及权值。

编制哈夫曼码:

根据权值建立二叉树,输出相应的根节点到叶结点的路径,便是哈夫曼编码。

编码:

输入字符,输出哈夫曼码。

译码:

输入哈夫曼,输出字符代码。

退出:

结束进程,退出程序。

三、实验题目:

构造哈弗曼树的算法。

4、实验源代码:

#include

#include

#include

typedefstruct

{

charword;

intweight;

intparent,lchild,rchild;

}htnode,*huffmantree;

voidselect(huffmantreeht,inta,int&s1,int&s2)

{

ht[0].weight=1000;

s1=0;

for(inti=1;i<=a;i++)

{

if(ht[i].parent==0)

{

if(ht[i].weight

{

s1=i;

}

}

}

ht[s1].parent=1;

s2=0;

for(i=1;i<=a;i++)

{

if(ht[i].parent==0)

{

if(ht[i].weight

{

s2=i;

}

}

}

}

voidcreathuffmantree(huffmantree&ht,intN)

{

intm=2*N-1;

ints1,s2;

for(inti=N+1;i<=m;i++)

{

select(ht,i-1,s1,s2);

ht[s1].parent=i;

ht[s2].parent=i;

ht[i].lchild=s1;

ht[i].rchild=s2;

ht[i].weight=ht[s1].weight+ht[s2].weight;

ht[i].word='x';

}

}

typedefchar**huffmancode;

voidcreathuffmancode(huffmantreeht,huffmancode&hc,intN)

{

hc=newchar*[N+1];

char*cd=newchar[N];

cd[N-1]='\0';

intstart,c,f;

for(inti=1;i<=N;i++)

{

start=N-1;

c=i;

f=ht[i].parent;

while(f!

=0)

{

--start;

if(ht[f].lchild==c)

cd[start]='0';

else

cd[start]='1';

c=f;

f=ht[f].parent;

}

hc[i]=newchar[N-start];

strcpy(hc[i],&cd[start]);

}

deletecd;

}

voidbianma(huffmancodehc,huffmantreeht,char*a,intN)

{

inti=0,j;

cout<<"该字母组的赫夫曼编码是:

";

while(a[i]!

='\0')

{

for(j=1;j<=N;j++)

{

if(ht[j].word==a[i])

break;

}

cout<

i++;

}

cout<

}

voidchangetozimu(huffmantreeht,charb[],intN)

{

inti=0,f=2*N-1;

cout<<"该赫夫曼编码的含义是:

"<

while(b[i]!

='\0')

{

if(b[i]=='0')

{

f=ht[f].lchild;

if(ht[f].lchild!

=0)

{

i++;

}

else

{

cout<

i++;

f=2*N-1;

}

}

elseif(b[i]=='1')

{

f=ht[f].rchild;

if(ht[f].rchild!

=0)

{

i++;

}

else

{

cout<

i++;

f=2*N-1;

}

}

else

{

cout<<"出现错误输入";

break;

}

}

cout<

}

voidmain()

{

intN;

cout<<"请输入字母的数字"<

cin>>N;

huffmantreeht=newhtnode[2*N];

for(inti=1;i<=2*N-1;i++)

{

ht[i].parent=0;

ht[i].lchild=0;

ht[i].rchild=0;

}

for(i=1;i<=N;i++)

{

cout<<"请输入第"<

cin>>ht[i].word;

cout<<"请输入该字母的权值"<

cin>>ht[i].weight;

}

creathuffmantree(ht,N);

cout<<"哈弗曼树:

"<

for(i=1;i<=2*N-1;i++)

{

cout<

cout<

cout<

cout<

cout<

}

huffmancodehc;

creathuffmancode(ht,hc,N);

cout<<"哈弗曼编码:

"<

for(i=1;i<=N;i++)

{

cout<

cout<

}

char*a=newchar[100];

cout<<"输入少于100个的字母符号"<

cin>>a;

bianma(hc,ht,a,N);

cout<<"请输入一段少于100的赫夫曼编码"<

charb[100];

cin>>b;

changetozimu(ht,b,N);

}

五、实验源代码运行结果截图:

 

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

当前位置:首页 > 高等教育 > 农学

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

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