数据结构实验赫夫曼编码.docx
《数据结构实验赫夫曼编码.docx》由会员分享,可在线阅读,更多相关《数据结构实验赫夫曼编码.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构实验赫夫曼编码
实习三二叉树应用
一、实验目的:
熟悉二叉树的存储结构,二叉树的有关的操作。
二、实验内容及要求:
哈夫曼编/译码器
[问题描述]
利用哈夫曼编码进行通信可以大大提高信道利用率,这要求在发送端通过一个编码系统
对待传输预先编码,在接收端将传来的数据进行译码。
对于双工通道,每端都需要一个完整
的编/译码系统。
[基本要求]
试为这样的信息收发站写一个哈夫曼码的编/译码系统。
[实现提示]
构造哈夫曼树的算法实现:
假设哈夫曼树采用双亲孩子表示法存储,并增加权值域,构造哈夫曼树的叶子结点(树
木的权)有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);
}
五、实验源代码运行结果截图: