

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实 验 报 告课程名称 _数据结构上机实验_实验项目 _二叉树的应用 _实验仪器 _PC机_系 别_专 业_ 班级/学号_学生姓名 _ 实验日期 _成 绩 _ 指导教师 _实验三.二叉树的应用1. 实验目的:掌握二叉树的链式存储结构和常用算法。利用哈夫曼树设计最优压缩编码。 2. 实验内容:1) 编写函数,实现建立哈夫曼树和显示哈夫曼树的功能。2) 编写函数,实现生成哈夫曼编码的功能。3) 编写主函数,从终端输入一段英文文本;统计各个字符出现的频率,然后构建哈夫曼树并求出对应的哈夫曼编码;显示哈夫曼树和哈夫曼编码。选做内容:修改程序,选择实现以下功能:4) 编码:用哈夫曼编码对一段英文文本进行
2、压缩编码,显示编码后的文本编码序列;5) 统计:计算并显示文本的压缩比例;6) 解码:将采用哈夫曼编码压缩的文本还原为英文文本。3. 算法说明:1) 二叉树和哈夫曼树的相关算法见讲义。2) 编码的方法是:从头开始逐个读取文本字符串中的每个字符,查编码表得到它的编码并输出。重复处理直至文本结束。3) 解码的方法是:将指针指向哈夫曼树的树根,从头开始逐个读取编码序列中的每位,若该位为1则向右子树走,为0则向左子树走。当走到叶子节点时,取出节点中的字符并输出。重新将指针放到树根,继续以上过程直至编码序列处理完毕。4) 压缩比例的计算:编码后的文本长度为编码序列中的0和1,的个数,原文本长度为字符数*
3、8。两者之比即为压缩比。4. 实验步骤:实现哈夫曼树的编码序列操作: int i=0,j=0;huffnode p;p=tree2*n-2;/序号2*n-2节点就是树根节点while(hfmstri!=0)/从头开始扫描每个字符,直到结束while(p.lchild!=-1&p.rchild!=-1)if(hfmstri=0)/为0则向左子树走p=treep.lchild;/取出叶子节点中的字符else if(hfmstri=1)/为1则向右子树走p=treep.rchild;/取出叶子节点中的字符i+;decodestrj=p.data;j+;/对字符进行译码,结果放在decodestr字符
4、串中p=tree2*n-2;/返回根节点程序修改后完整源代码如下: #include #include #include #include /专门用于检测整型数据数据类型的表达值范围#define N 96 /ASCII字符集包含至多N个可见字符typedef struct /Huffman树节点定义 char data; /字符值int weight; /权重int lchild; /左子结点int rchild; /右子结点 huffnode; /huffman节点类型struct charcode int count; /字符出现的次数(频率)char codeN; /字符的Huffma
5、n编码 codesetN; /编码表,长为N,每项对应一个ascii码字符,下标i的项对应ascii编码为i+32的字符huffnode * CreateHufftree(char data, int weight, int n) /建立Huffman树的算法int i,k;int min1,min2,min_i1,min_i2;huffnode *tree;tree=(huffnode *)malloc(2*n-1)*sizeof(huffnode); /为Huffman树分配2n-1个节点空间for (i=0;i2*n-1;i+) /初始化,将各字符和其频率填入Huffman树,作为叶子结
6、点 treei.lchild=treei.rchild=-1;if (in) treei.data=datai;treei.weight=weighti;else treei.data= ; for (i=n;i2*n-1;i+) /合并两棵树,作n-1遍min1=min2=INT_MAX; /INT_MAX为最大值min_i1=min_i2=-1;for (k=0;k=0) /仅在根节点中找if (treek.weightmin1)min2=min1;min_i2=min_i1;min1=treek.weight;min_i1=k;else if (treek.weight=0;i-) pr
7、intf(%dt,i); printf(%ct,treei.data); printf(%dt,treei.lchild); printf(%dt,treei.rchild); printf(%dt,treei.weight); printf(n); void EnCoding(char str, char hfmstr)/根据codeset编码表,逐个将str字符串中的字符转化为它的huffman编码,结果编码串放在hfmstr字符串中int i, j;hfmstr0=0;/把hfmstr串赋空i=0;while(stri!=0)/从第头开始扫描str的每个字符,一直到该字符的结束 j=st
8、ri-32;/执行字符到huffman的转换strcat(hfmstr, codesetj.code);/把codest编码串添加到hfmstr结尾处i+;/每次循环完i的值加1void DeCoding(huffnode tree, int n, char hfmstr, char decodestr)/根据tree数组中的huffman树,逐个对hfmstr字符串中的字符进行译码,结果放在decodestr字符串中int i=0,j=0;huffnode p;p=tree2*n-2;/序号2*n-2节点就是树根节点while(hfmstri!=0)/从头开始扫描每个字符,直到结束while
9、(p.lchild!=-1&p.rchild!=-1)/指针为空,儿子的值取完了if(hfmstri=0)/为0则向左子树走p=treep.lchild;/取出叶子节点中的字符else if(hfmstri=1)/为1则向右子树走p=treep.rchild;/取出叶子节点中的字符i+;decodestrj=p.data;j+;/对字符进行译码,结果放在decodestr字符串中p=tree2*n-2;/返回根节点void main() int i,j;huffnode * ht; /Huffman树char dataN; /要编码的字符集合int weightN; /字符集合中各字符的权重(
10、频率)int n=0; /字符集合中字符的个数char str1000; /需输入的原始字符串 char hfm_str1000=; /编码后的字符串char decode_str1000=;/解码后的字符串printf(请输入要转换的字符串n);gets(str);for(i=0;iN;i+) /初始化编码表,频率为0,编码串为空串codeseti.count=0;codeseti.code0=0;i=0; while(stri!=0) /统计原始字符串中各字符出现的频率,存入编码表j=stri-32;codesetj.count+; /codeset095对应ascii码32127的字符i
11、+;for(i=0;iN;i+) /统计原始字符串中出现的字符个数if(codeseti.count!=0) n+;printf(字符频率统计:n); /显示统计结果for(i=0;iN;i+) if(codeseti.count!=0) printf(%c:%d, , i+32, codeseti.count);printf(n);j=0;for(i=0;iN;i+) /生成要编码的字符集合,以及权重if (codeseti.count!=0) dataj=i+32;weightj=codeseti.count; j+;ht=CreateHufftree(data,weight,n); /建立Huffman树,根节点是ht2*n-2 PrintHufftree(ht,n); /显示Huffman树的存储结果CreateHuffcode(ht, 2*n-2, ); /以ht2*n-2为根,以空字符串为起始编码字符串,求出各叶子节点的编码字符串/显示codeset中的Huffman编码,参见显示频率统计结果的代码. printf(haffman编码为:n); for(i=0;iN;i+)if(codeseti.count!=0) printf(%c:%sn,i+32,codeseti.code );EnCoding(str, hfm_str);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常熟银行活动方案
- 小班亲子活动方案
- 少儿节日活动方案
- 小班家长会教研活动方案
- 工会培训教育活动方案
- 小米商城活动方案
- 小班夏日活动方案
- 尖头女鞋清仓活动方案
- 师徒金搭档活动方案
- 小学童话绘画活动方案
- 2025年安徽省中考地理真题试卷(含答案)
- 人教版2025年八年级英语下学期期末总复习(专题训练)专题01单项选择【期末易错100题】(人教版)(学生版+解析)
- 企业财务内控管理制度
- 2025以色列与伊朗冲突全面解析课件
- 2025年农产品质量安全追溯体系在食品安全监管中的应用与改进报告
- 做账实操-渔业行业的账务处理分录实例
- (完整版)金融企业会计练习题
- 新教育 考试试题及答案
- 2025至2030中国心理保健行业发展趋势分析与未来投资战略咨询研究报告
- 儿童活动抓鱼活动方案
- 天津2025年中国医学科学院放射医学研究所第一批招聘笔试历年参考题库附带答案详解
评论
0/150
提交评论