1、数据结构 实验5 数据结构实验报告年级 2012级 学号 姓名 成绩:专业 计算机科学与技术 实验地点 指导教师 实验项目 实验五 二叉树 实验性质 综合性 实验日期一、实验目的:1、掌握二叉树的链式存储结构及其相关操作的实现。2、掌握二叉树的先序、中序、后序的递归遍历算法。3、理解二叉树的各种非递归遍历算法的实现。二、实验内容与要求:1、实验题目一:二叉树的创建、递归遍历及其它基本操作的实现。要求:定义用二叉链表表示的二叉树,并实现二叉树的创建、遍历(先序、中序后序)的递归算法及求深度操作等,并对其进行验证。2、实验题目二:哈夫曼树及哈夫曼编码的算法实现要求:编程实现哈夫曼树的创建及利用哈夫
2、曼树求解哈夫曼编码。三、实验问题描述: 设计一个程序exp76.cpp,构造一棵哈夫曼树,输出对应的哈弗曼编码和平均查找长度,并用数据进行验证。如:单词(the)出现的频率为1192.四、实验步骤1实验问题分析本试验中主要是大量运用到了c语言里的for循环语句、if语句以及case语句,程序中用到了break来跳出case语句执行的循环变量等。2功能(函数)设计struct HuffmanTreeint weight;int parent,lchild,rchild;char ch;typedef char* HuffmanCode;struct return_value_selint re_
3、s1;int re_s2;五、实验结果(程序)及分析#include#include#include#includestruct HuffmanTreeint weight;int parent,lchild,rchild;char ch;typedef char* HuffmanCode;struct return_value_selint re_s1;int re_s2;struct return_value_defchar re_p100;int *re_in;int re_count;struct return_value_HTHCHuffmanTree *re_HT;HuffmanC
4、ode re_HC;return_value_def def_wei(char in_ch)char ch100;int ch_wei100;int i,j,n = 0,tab = 1;return_value_def re;for(i = 0;in_chi != 0;i+)for(j = 0;j =1;i-)if(HTi.parent=0 & HT_wei=HTi.weight) HT_wei = HTi.weight; s1 = i;if(s1=t)HT_wei = HTt-1.weight;else HT_wei = HTt.weight;for(i=t;i=1;i-)if(HTi.pa
5、rent=0 & HT_wei=HTi.weight & i!=s1)HT_wei = HTi.weight; s2 = i;re.re_s1 = s1;re.re_s2 = s2;return re;return_value_HTHC HuffmanCoding(HuffmanTree *HT,int *w,int n,char ch_in)int m,i;HuffmanTree *p;char *cd;HuffmanCode HC;return_value_HTHC re_value_HTHC;return_value_sel get_re;if(n=1) exit(0);m = 2 *
6、n - 1;HT = (HuffmanTree*)malloc(m+1)*sizeof(HuffmanTree);for(p=HT,i=1,p+;iweight = *w;p-lchild = 0;p-rchild = 0;p-parent = 0;p-ch = ch_ini-1;for(;iweight = 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);HTget_re.re_s1.parent = i;HTget_re.re_s2.parent =
7、i;HTi.lchild = get_re.re_s1;HTi.rchild = get_re.re_s2;HTi.weight = HTget_re.re_s1.weight + HTget_re.re_s2.weight;int c,f,start,j=0;HC = (HuffmanCode)malloc(n+1)*sizeof(char*);cd = (char *)malloc(n*sizeof(char);cdn-1 = 0;for(i=1;i=n;+i)start = n-1;for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent)if(HTf.lch
8、ild=c) cd-start = 0;else cd-start = 1;HCi = (char*)malloc(n-start)*sizeof(char);strcpy(HCi,&cdstart);cout字符HTi.ch的编码为: HCiendl;free(cd);re_value_HTHC.re_HC = HC;re_value_HTHC.re_HT = HT;return re_value_HTHC;void HuffmanTrans(char* tran_ch,HuffmanTree *HT,int count)int i,n=count;cout译码结果为:endl;for(i=
9、0;tran_chi=0|tran_chi=1;i+)if(tran_chi=0)n = HTn.lchild;if(HTn.lchild=0&HTn.rchild=0)coutHTn.ch;n = count;elsen = HTn.rchild;if(HTn.lchild=0&HTn.rchild=0)coutHTn.ch;n = count;coutendl;void main()char edit_str100,trans_str1000,trans_str11000;int m100;int i,n,j,t=0;HuffmanTree *HT;return_value_def get
10、_value_def;return_value_HTHC get_value_HTHC;int start1 = 0;char choose_re = y,choose,ch10;while(choose_re=y|choose_re=Y)cout请选择您所将进行的操作!endl;cout(1)字符编码endl(2)需要对已编码过的字符译码endl(3)通过输入进行译码endlch;choose = ch0;for(;)if(choose != 1&choose!=2&choose!= 3&choose!=0)cout输入错误,请重新输入endl;cout1、字符编码endl2、对编码过的字符
11、译码endl3、通过输入进行译码endl0、退出endlch;choose = ch0;elsebreak;switch(choose)case 1:cout请输入您要编码的字符串:edit_str;cout进行编码.endl;get_value_def = def_wei(edit_str);for( i=0;iget_value_def.re_count;i+)mi = *(get_value_def.re_in+i);HT = (HuffmanTree*)malloc(2*get_value_def.re_count)*sizeof(HuffmanTree);get_value_HTHC
12、 = HuffmanCoding(HT,m,get_value_def.re_count,get_value_def.re_p);cout编码为:endl;for(n=0;edit_strn!=0;n+)for(j=0;j=get_value_def.re_count;j+)if(edit_strn=get_value_HTHC.re_HTj.ch)coutget_value_HTHC.re_HCj;for(int x=0;get_value_HTHC.re_HCjx=0|get_value_HTHC.re_HCjx=1;t+,x+)trans_str1t=get_value_HTHC.re_
13、HCjx;coutendl;start1 = 1;break;case 2:if(start1!=1)cout您还没有进行建立编码表,请先执行第一步操作!endl;break;HuffmanTrans(trans_str1,get_value_HTHC.re_HT,2*get_value_def.re_count-1);break; case 3:if(start1!=1)cout您还没有进行建立编码表,请先执行第一步操作!endl;break;cout请输入您要译的代码:trans_str;for(i=0;trans_stri!=0;i+)if(trans_stri!=0&trans_str
14、i!=1)cout输入中有非法字符,请重新输入!endl;cout请输入您要译的代码:trans_str;coutendl;HuffmanTrans(trans_str,get_value_HTHC.re_HT,2*get_value_def.re_count-1);break;case 0:break;cout是否继续进行操作(是:y 否:n )choose_re;for(;)if(choose_re != y&choose_re != Y&choose_re != n&choose_re != N)cout输入错误请重新输入!endl;cout是否继续进行操作(是:y 否:n )choose_re;elsebreak;六、结论与分析在本次实验中利用哈夫曼编码构造使电文编码的代码长度最短的编码方案,哈夫曼编码的实质就是使用频率越高的字符采用最短的编码,大概理解了二叉树的操作。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1