数据结构 实验5.docx
《数据结构 实验5.docx》由会员分享,可在线阅读,更多相关《数据结构 实验5.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构实验5
《数据结构》实验报告
年级2012级学号姓名成绩:
专业计算机科学与技术实验地点指导教师
实验项目实验五二叉树实验性质综合性实验日期
一、实验目的:
1、掌握二叉树的链式存储结构及其相关操作的实现。
2、掌握二叉树的先序、中序、后序的递归遍历算法。
3、理解二叉树的各种非递归遍历算法的实现。
二、实验内容与要求:
1、实验题目一:
二叉树的创建、递归遍历及其它基本操作的实现。
要求:
定义用二叉链表表示的二叉树,并实现二叉树的创建、遍历(先序、中序后序)的递归算法及求深度操作等,并对其进行验证。
2、实验题目二:
哈夫曼树及哈夫曼编码的算法实现
要求:
编程实现哈夫曼树的创建及利用哈夫曼树求解哈夫曼编码。
三、实验问题描述:
设计一个程序exp7—6.cpp,构造一棵哈夫曼树,输出对应的哈弗曼编码和平均查找长度,并用数据进行验证。
如:
单词(the)出现的频率为1192.
四、实验步骤
1.实验问题分析
本试验中主要是大量运用到了c语言里的for循环语句、if语句以及case语句,程序中用到了break来跳出case语句执行的循环变量等。
2.功能(函数)设计
structHuffmanTree
{
intweight;
intparent,lchild,rchild;
charch;
};
typedefchar**HuffmanCode;
structreturn_value_sel
{
intre_s1;
intre_s2;
};
五、实验结果(程序)及分析
#include
#include
#include
#include
structHuffmanTree
{
intweight;
intparent,lchild,rchild;
charch;
};
typedefchar**HuffmanCode;
structreturn_value_sel
{
intre_s1;
intre_s2;
};
structreturn_value_def
{
charre_p[100];
int*re_in;
intre_count;
};
structreturn_value_HTHC
{
HuffmanTree*re_HT;
HuffmanCodere_HC;
};
return_value_defdef_wei(charin_ch[])
{
charch[100];
intch_wei[100];
inti,j,n=0,tab=1;
return_value_defre;
for(i=0;in_ch[i]!
='\0';i++)
{
for(j=0;j<=n;j++)
{
if(ch[j]==in_ch[i])
{
ch_wei[j]++;
tab=1;
break;
}
else
tab=0;
}
if(tab==0)
{
ch[n]=in_ch[i];
ch_wei[n]=1;
n++;
}
}
ch[n]='\0';
strcpy(re.re_p,ch);
re.re_in=ch_wei;
re.re_count=n;
returnre;
}
return_value_selSelect(HuffmanTree*HT,inti)
{
return_value_selre;
intt=i;
ints1,s2,HT_wei=HT[i].weight;
for(;i>=1;i--)
if(HT[i].parent==0&&HT_wei>=HT[i].weight)
{HT_wei=HT[i].weight;s1=i;}
if(s1==t)
{
HT_wei=HT[t-1].weight;
}
else
{
HT_wei=HT[t].weight;
}
for(i=t;i>=1;i--)
if(HT[i].parent==0&&HT_wei>=HT[i].weight&&i!
=s1)
{HT_wei=HT[i].weight;s2=i;}
re.re_s1=s1;
re.re_s2=s2;
returnre;
}
return_value_HTHCHuffmanCoding(HuffmanTree*HT,int*w,intn,charch_in[])
{
intm,i;
HuffmanTree*p;
char*cd;
HuffmanCodeHC;
return_value_HTHCre_value_HTHC;
return_value_selget_re;
if(n<=1)exit(0);
m=2*n-1;
HT=(HuffmanTree*)malloc((m+1)*sizeof(HuffmanTree));
for(p=HT,i=1,p++;i<=n;++i,++p,++w)
{
p->weight=*w;
p->lchild=0;
p->rchild=0;
p->parent=0;
p->ch=ch_in[i-1];
}
for(;i<=m;++i,++p)
{
p->weight=0;
p->lchild=0;
p->rchild=0;
p->parent=0;
p->ch=NULL;
}
for(i=n+1;i<=m;++i)
{
get_re=Select(HT,i-1);
HT[get_re.re_s1].parent=i;
HT[get_re.re_s2].parent=i;
HT[i].lchild=get_re.re_s1;
HT[i].rchild=get_re.re_s2;
HT[i].weight=HT[get_re.re_s1].weight+HT[get_re.re_s2].weight;
}
intc,f,start,j=0;
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;++i)
{
start=n-1;
for(c=i,f=HT[i].parent;f!
=0;c=f,f=HT[f].parent)
{
if(HT[f].lchild==c)cd[--start]='0';
elsecd[--start]='1';
}
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
cout<<"字符"<"<}
free(cd);
re_value_HTHC.re_HC=HC;
re_value_HTHC.re_HT=HT;
returnre_value_HTHC;
}
voidHuffmanTrans(char*tran_ch,HuffmanTree*HT,intcount)
{
inti,n=count;
cout<<"译码结果为:
"<for(i=0;tran_ch[i]=='0'||tran_ch[i]=='1';i++)
if(tran_ch[i]=='0')
{
n=HT[n].lchild;
if(HT[n].lchild==0&&HT[n].rchild==0)
{
cout<n=count;
}
}
else
{
n=HT[n].rchild;
if(HT[n].lchild==0&&HT[n].rchild==0)
{
cout<n=count;
}
}
cout<}
voidmain()
{
charedit_str[100],trans_str[1000],trans_str1[1000];
intm[100];
inti,n,j,t=0;
HuffmanTree*HT;
return_value_defget_value_def;
return_value_HTHCget_value_HTHC;
intstart1=0;
charchoose_re='y',choose,ch[10];
while(choose_re=='y'||choose_re=='Y')
{
cout<<"请选择您所将进行的操作!
"<cout<<"
(1)字符编码"<<<"
(2)需要对已编码过的字符译码"<<<"(3)通过输入进行译码"<<<"请输入您的选择:
";
cin>>ch;
choose=ch[0];
for(;;)
{
if(choose!
='1'&&choose!
='2'&&choose!
='3'&&choose!
='0')
{
cout<<"输入错误,请重新输入"<cout<<"1、字符编码"<<<"2、对编码过的字符译码"<<<"3、通过输入进行译码"<<<"0、退出"<<<"清输入您要进行的选择:
";
cin>>ch;
choose=ch[0];
}
else
break;
}
switch(choose)
{
case'1':
cout<<"请输入您要编码的字符串:
"<cin>>edit_str;
cout<<"进行编码..."<get_value_def=def_wei(edit_str);
for(i=0;i{
m[i]=*(get_value_def.re_in+i);
}
HT=(HuffmanTree*)malloc((2*get_value_def.re_count)*sizeof(HuffmanTree));
get_value_HTHC=HuffmanCoding(HT,m,get_value_def.re_count,get_value_def.re_p);
cout<<"编码为:
"<for(n=0;edit_str[n]!
='\0';n++)
for(j=0;j<=get_value_def.re_count;j++)
if(edit_str[n]==get_value_HTHC.re_HT[j].ch)
{
cout<for(intx=0;get_value_HTHC.re_HC[j][x]=='0'||get_value_HTHC.re_HC[j][x]=='1';t++,x++)
trans_str1[t]=get_value_HTHC.re_HC[j][x];
}
cout<start1=1;
break;
case'2':
if(start1!
=1)
{
cout<<"您还没有进行建立编码表,请先执行第一步操作!
!
"<break;
}
HuffmanTrans(trans_str1,get_value_HTHC.re_HT,2*get_value_def.re_count-1);
break;
case'3':
if(start1!
=1)
{
cout<<"您还没有进行建立编码表,请先执行第一步操作!
!
"<break;
}
cout<<"请输入您要译的代码:
"<cin>>trans_str;
for(i=0;trans_str[i]!
='\0';i++)
if(trans_str[i]!
='0'&&trans_str[i]!
='1')
{
cout<<"输入中有非法字符,请重新输入!
!
"<cout<<"请输入您要译的代码:
"<cin>>trans_str;
}
cout<HuffmanTrans(trans_str,get_value_HTHC.re_HT,2*get_value_def.re_count-1);
break;
case'0':
break;
}
cout<<"是否继续进行操作(是:
y否:
n)"<cin>>choose_re;
for(;;)
{if(choose_re!
='y'&&choose_re!
='Y'&&choose_re!
='n'&&choose_re!
='N')
{
cout<<"输入错误请重新输入!
!
"<cout<<"是否继续进行操作(是:
y否:
n)"<cin>>choose_re;
}
else
break;
}
}
}
六、结论与分析
在本次实验中利用哈夫曼编码构造使电文编码的代码长度最短的编码方案,哈夫曼编码的实质就是使用频率越高的字符采用最短的编码,大概理解了二叉树的操作。