版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验四哈夫曼树与哈夫曼编码一、实验目的1、使学生熟练掌握哈夫曼树的生成算法。2、熟练掌握哈夫曼编码的方法。二、实验内容本次实验提供4个题目,难度相当,学生可以根据自己的情况选做,其中题目一是必做题,其它选作!题目一、哈夫曼树和哈夫曼编码[问题描述]一电文,有若干个不同字符,要求从终端输入这些不同字符及其出现的频率,然后对这些字符进行哈夫曼编码,并输出。[测试数据]利用教材P.148例6-2中的数据调试程序(可自己设定测试数据)。[选作内容]1、打印出该哈夫曼树2、若从终端输入任意一段电文(假设仅为26个大小写英文字母),试编程高效地求出该段电文的哈夫曼编码。提示:如何快速统计不同字符的出现频率3、译码:将上述1的编码结果还原成电文。三、算法设计设计思路设计过程1、程序所需头文件已经预处理宏定义以及变量如下#include<iostream>#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>usingnamespacestd;typedefstructnode{charch;intdata;structnode*parent;structnode*lchild,*rchild,*next;}hufnode;typedefhufnode*linkhuf;typedefstructHFcode{charch;intdata;intcode[20];inttop;}tagHFcode;linkhufinsert(linkhufroot,linkhufs){ linkhufp1,p2; if(root==NULL) root=s; else { p1=NULL; p2=root; while(p2&&p2->data<s->data) { p1=p2; p2=p2->next; } s->next=p2; if(p1==NULL) root=s; else p1->next=s;}returnroot;}2、创建哈夫曼树voidcreatehuffman(linkhuf*root){linkhufs,rl,rr;while(*root&&(*root)->next){ rl=*root; rr=(*root)->next; *root=rr->next; s=(linkhuf)malloc(sizeof(hufnode)); s->next=NULL; s->data=rl->data+rr->data; s->parent=NULL; s->lchild=rl; s->rchild=rr; rl->parent=s; rr->parent=s; rl->next=rr->next=NULL; *root=insert(*root,s);}}voidinorder(linkhuft){if(t){inorder(t->lchild);printf("%5d",t->data);inorder(t->rchild);}}3、哈夫曼编码voidHFcoding(linkhufroot,linkhuftemp,tagHFcodeHFcode[],int*leaftop){if(root!=NULL){if(root->lchild==NULL&&root->rchild==NULL){temp=root;HFcode[(*leaftop)].top=0;HFcode[(*leaftop)].ch=root->ch;HFcode[(*leaftop)].data=root->data;while(temp->parent!=NULL){if(temp->parent->lchild==temp) HFcode[(*leaftop)].code[HFcode[(*leaftop)].top]=0;else HFcode[(*leaftop)].code[HFcode[(*leaftop)].top]=1;HFcode[(*leaftop)].top++;temp=temp->parent;}(*leaftop)++;}HFcoding(root->lchild,temp,HFcode,leaftop);HFcoding(root->lchild,temp,HFcode,leaftop);}}4、输出求得的哈夫曼编码voidOutCoding(tagHFcodeHFcode[],intleaftop){ inti,j=0; for(i=0;i<leaftop;i++) { printf("%d\t",HFcode[i].data); j=HFcode[i].top-1; while(j>=0) { printf("%d",HFcode[i].code[j]); j--; } printf("\n"); } }四、调试与测试输入字符ABCDEFGH进行测试五、心得体会做这次实验,发现在写程序的时候出现了很多的错误,及还有很多的知识不以灵活运用,特别是对栈和队列的操作问题。大一的课程以及C语言没掌握好,所以这次做实验,觉得有好多知识不熟悉,后来经过查找资料,在自己的努力下和同学的帮助下,终于完了本次实验。以后在课余时间里还要多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。六、源代码#include<iostream>#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>usingnamespacestd;typedefstructnode{charch;intdata;structnode*parent;structnode*lchild,*rchild,*next;}hufnode;typedefhufnode*linkhuf;typedefstructHFcode{charch;intdata;intcode[20];inttop;}tagHFcode;linkhufinsert(linkhufroot,linkhufs){ linkhufp1,p2; if(root==NULL) root=s; else { p1=NULL; p2=root; while(p2&&p2->data<s->data) { p1=p2; p2=p2->next; } s->next=p2; if(p1==NULL) root=s; else p1->next=s;}returnroot;}voidcreatehuffman(linkhuf*root){linkhufs,rl,rr;while(*root&&(*root)->next){ rl=*root; rr=(*root)->next; *root=rr->next; s=(linkhuf)malloc(sizeof(hufnode)); s->next=NULL; s->data=rl->data+rr->data; s->parent=NULL; s->lchild=rl; s->rchild=rr; rl->parent=s; rr->parent=s; rl->next=rr->next=NULL; *root=insert(*root,s);}}voidinorder(linkhuft){if(t){inorder(t->lchild);printf("%5d",t->data);inorder(t->rchild);}}voidHFcoding(linkhufroot,linkhuftemp,tagHFcodeHFcode[],int*leaftop){if(root!=NULL){if(root->lchild==NULL&&root->rchild==NULL){temp=root;HFcode[(*leaftop)].top=0;HFcode[(*leaftop)].ch=root->ch;HFcode[(*leaftop)].data=root->data;while(temp->parent!=NULL){if(temp->parent->lchild==temp) HFcode[(*leaftop)].code[HFcode[(*leaftop)].top]=0;else HFcode[(*leaftop)].code[HFcode[(*leaftop)].top]=1;HFcode[(*leaftop)].top++;temp=temp->parent;}(*leaftop)++;}HFcoding(root->lchild,temp,HFcode,leaftop);HFcoding(root->lchild,temp,HFcode,leaftop);}}//输出求得的哈夫曼编码voidOutCoding(tagHFcodeHFcode[],intleaftop){ inti,j=0; for(i=0;i<leaftop;i++) { printf("%d\t",HFcode[i].data); j=HFcode[i].top-1; while(j>=0) { printf("%d",HFcode[i].code[j]); j--; } printf("\n"); } }intmain(){tagHFcodeHFcode[20];linkhuff=NULL;linkhuftemp=NULL;linkhufp[6];inti;inta[20];charch;intleaftop=0;printf("请输入各节点的节点值和权值:\n");for(i=0;i<7;i++){p[i]=(linkhuf)malloc(sizeof(hufnode));scanf("%c",&(p[i]->ch));getchar();scanf("%d",&p[i]->data);p[i]->lchild=NULL;p[i]->rchild=NULL;p[i]->nex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2034年中国酚醛树脂行业投资潜力分析及行业发展趋势报告
- 2024-2034年中国透明质酸钠凝胶市场深度调查及投资方向研究报告
- 2024-2034年中国轻红丹波管行业市场现状分析及竞争格局与投资发展研究报告
- 2024-2034年中国车用吸尘器行业发展运行现状及投资潜力预测报告
- 2024-2034年中国貉子毛领行业市场现状分析及竞争格局与投资发展研究报告
- 2024-2034年中国褐煤蜡行业市场运营态势及投资前景预测报告
- 2024-2034年中国藏药行业发展与投资调研报告
- 2024-2034年中国苗木移栽机行业市场现状分析及竞争格局与投资发展研究报告
- 2024-2034年中国航空客运代理行业发展监测及投资战略规划研究报告
- 2024-2034年中国腌菜制品加工行业市场调研及投资规划建议报告
- 沈阳市于洪区社区残疾人工作专职干事招聘考试试题及答案
- 2024年公务员(国考)之行政职业能力测验真题汇编及完整答案【典优】
- 2024年时事政治热点题库200道及参考答案【完整版】
- 第24课《诗词曲五首白雪歌送武判官归京》(课件)九年级语文下册
- 24春国家开放大学《社会调查研究与方法》形考任务1-4参考答案
- 纠结与治愈:青年精神内耗的表征、根源与应对
- 2024年省滕州市事业单位度公开招考工作人员高频考题难、易错点模拟试题(共500题)附带答案详解
- 9.3一元一次不等式组解法市公开课一等奖省赛课微课金奖课件
- (2024年)放射科应急预案演练(大全)
- 张烈老师形意拳(炮拳).doc
- 幼儿园教学大纲最新版.doc
评论
0/150
提交评论