ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:179.61KB ,
资源ID:5531257      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5531257.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计实验报告哈夫曼.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计实验报告哈夫曼.docx

1、数据结构课程设计实验报告哈夫曼数据结构课程设计实验报告哈夫曼树的应用计算机学院信管专业数据结构课程设计题 目: 哈夫曼树的应用 班 级: 姓 名: 学 号: 同组人姓名: 起迄日期: 课程设计地点: 指导教师: 评阅意见:成绩评定:评阅人: 日期:完成日期:2012年12月一、 需求分析3二、 概要设计4三、 详细设计6四、 调试分析和测试结果7五、 心得体会和总结 10六、 参考文献 10七、 附录 11一、 需求分析(一)实验要求要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。这些在数据结

2、构课上已经讲过,只要能够理解关于线性表的几个相关的基本算法就可以了。问题是将输入的信息保存入文件和从文件输出。这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的C或者C+知识(本次我将使用C+实现),以及丰富的程序调适经验。(二)实验任务一个完整的系统应具有以下功能:功能1从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;功能2利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToB

3、eTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果,将文件CodeFile以紧凑格式先是在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。功能3利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中,并输出结果。(三)实验步骤分步实施:1) 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2) 完成最低要求:完成功能1;3) 进一步要求:完成功能2和3。有兴趣的同学可以自己扩充系统功能。要 求 :1)界面友好,函数功能要划分好2) 总体设计应画一流程图3) 程序要加必要的注释4) 要提供

4、程序测试方案5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。二、概要设计(一) 设计思想哈夫曼树用邻接矩阵作为存储结构,借助静态链表来实现遍历。(二 ) 函数间的关系如图所示:(三)数据结构与算法设计哈夫曼编译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码 。在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。最简单的二进制编码方

5、式是等长编码。若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。哈夫曼树课用于构造使电文的编码总长最短的编码方案。其主要流程图如下图所示。哈夫曼树编译码器流程图三、详细设计功能函数模块划分void main()void printhead()void printree(HuffmanTree HT,int w) /打印赫夫曼树void coprint(HuffmanTree start,HuffmanTree HT)/打印代码文件void printcode() /打印代码void decode() /完成译码功能void en

6、code() /完成编码功能void inputcode() void init()void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)void select(HuffmanTree t,int i,int &s1,int &s2)int min(HuffmanTree t,int i)/找两个最小的权值(1)哈夫曼编码:首先定义函数,找出全部权值中最小的两个,然后定义一个变量,使他始终成为最小的那个。再将两个函数最为叶子结点,并得到一个父亲节点,此父亲节点的权值为其叶子节点的权值之和。并将此父亲节点的权值与其余权值进

7、行比较,重新选出两个最小的权值,再进行上述步骤,直到所有权值形成了一颗二叉树,而此二叉树就是我们所说的最优二叉树,即哈夫曼树。以上为哈夫曼树的建立过程,下面为哈夫曼编码的过程,从叶子节点出发,若此叶子节点为其父亲节点的左孩子,则将其编码为0,若为右孩子,则将其编码为1,然后为其父亲节点编码,若为祖先的左孩子,则变为0,为右孩子则为1,依次向上一层进行遍历,直到遍历到根节点,停止编码。(2)译码:对于已经建好的哈夫曼树,要对其进行译码,首先从根出发如果编码为0,则往左孩子遍历,如果编码为1,则往右孩子遍历,直到遍历到叶子节点,便求得该子串相应的字符。(3)初始化哈夫曼链表:首先输入结点个数,再将

8、字符及权值输入,调用编码函数,得到每个字符编码并将其输出。最后将哈夫曼编码写入文件。(4)完成编码功能:打开目录下文件tobetran.txt,读取里面的字符,对其进行编码后,将编码写入目录下的codefile.txt中。(5)完成译码功能:打开根目录下codefile.txt文件,读取里面的编码,对其中的编码进行译码,并将得到的内容写入根目录下的文件txtfile.txt中。(6)打印编码(7)打印哈夫曼树四、调试分析和测试结果(一)初始化哈夫曼链表(二)编码字符(三)编码(四)译码(五)打印编码(六)打印哈夫曼函数五、心得体会与总结对于本次课程设计,主要是需要掌握哈夫曼树建立、哈夫曼编码以

9、及哈夫曼译码的算法。并能将其熟练应用于编译码器的完成。经过这次的课程设计,使我们更加了解了数据结构,也更深入地了解了哈夫曼编码与译码算法,课程设计的题目比我们平常的实验内容要难,完成它不仅需要有厚实的语言基础,而且还要熟练掌握哈夫曼编码与译码的算法,另外对于文件的基本操作也需要熟悉。通过数据结构课程设计,我的C+语言水平有了比较大的提高其中。C+语言关于类的操作理解的比以前深刻不少。另外是数据结构方面的提高对哈夫曼树的构造及哈夫曼码方面也有不少的提高。 在项目中也出现了很多的问题,最大的问题就是对程序设计框架结构的不了解,在实现代码与功能的连接时经常会出现各种不同的错误,在实现一些功能时系统常

10、常会报错。许多错误不知从哪修改 以致拖了整个设计的后腿。课程设计中,既回顾了很多以前的东西,也发现了很多的问题以前都没遇见过的,收获很大。 通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求哈夫曼树及哈夫曼编码/译码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识。 此次哈夫曼树的应用系统的设计让自己对数据结构的了解更深入。六、参考文献C+面向对象程序设计教程(第三版) 陈维兴 林小茶编著 清华大学出版社数据结构(C语言版)严蔚民 吴伟民编著 清华大学出版社六、附录源程序:#include #include #include #include #include

11、const int UINT_MAX=1000;typedef struct /哈夫曼树的存储表示 int weight; /权值 int parent,lchild,rchild; /父节点,左孩子结点,右孩子结点HTNode,* HuffmanTree; /动态分配数组存储哈夫曼树typedef char *HuffmanCode;/动态分配数组存储哈夫曼编码表/-全局变量-HuffmanTree HT; /代表哈夫曼树HuffmanCode HC; /代表哈夫曼编码int *w,i,j,n; char *z;int flag=0; int numb=0;/ -求哈夫曼编码-void li

12、ne()/画分割线的函数 coutn-n;int min(HuffmanTree t,int i)/找两个最小的权值 int j,flag; int k=UINT_MAX; / 取k为不小于可能的值 for(j=1;j=i;j+) if(tj.weights2)/ s1为最小的两个值中序号较小的那个 j=s1; s1=s2; s2=j; void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) int m,i,s1,s2,start; int c,f; HuffmanTree p; char *cd; if(n=1) re

13、turn; m=2*n-1;/申请2n-1个内存单元 HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); / 0号单元未用 for(p=HT+1,i=1;iweight=*w;/赋权值 p-parent=0; p-lchild=0; p-rchild=0; for(;iparent=0; for(i=n+1;i=m;+i) / 建哈夫曼树 select(HT,i-1,s1,s2);/调用建子树的函数 HTs1.parent=HTs2.parent=i;/i是s1和s2的父节点 HTi.lchild=s1; HTi.rchild=s2;/s1和s2是i的儿子节

14、点 HTi.weight=HTs1.weight+HTs2.weight;/i的权值为s1和s2的和 HC=(HuffmanCode)malloc(n+1)*sizeof(char*);/分配n个字符编码的头指针向量 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.lchild=c) cd-start=

15、0; else cd-start=1; HCi=(char*)malloc(n-start)*sizeof(char);/为第i个字符编码分配空间 strcpy(HCi,&cdstart); /从cd复制编码(串)到HC free(cd);/释放工作空间/-初始化哈夫曼链表-void init() flag=1; int num; int num2; cout下面初始化哈夫曼链表endlnum;/输入结点个数 n=num; w=(int*)malloc(n*sizeof(int);/权值 z=(char*)malloc(n*sizeof(char);/字符 coutn请依次输入n个字符(字符型

16、)n注意:必须以回车结束:endl; char temp2; for(i=0;in;i+)/输入字符 cout第i+1个字符:endl; gets(temp); *(z+i)=*temp; line(); for(i=0;i=n-1;i+)/输出字符 coutsetw(6)*(z+i); line(); coutn请依次输入n个权值(n注意:必须以回车结束):endl; for(i=0;i=n-1;i+)/输入权值 coutendl第i+1num2; *(w+i)=num2; HuffmanCoding(HT,HC,w,n);/调用哈夫曼编码 /-打印编码- cout字符对应的编码为:endl

17、; for(i=1;i=n;i+)/输出所有编码 puts(HCi); /-将哈夫曼编码写入文件- cout下面将赫夫曼编码写入文件endl; FILE *htmTree; char r= ,0; if(htmTree=fopen(htmTree.txt,w)=NULL) cout文件打开失败endl; return; fputs(z,htmTree); for(i=0;in+1;i+) fprintf(htmTree,%6d,*(w+i); fputs(r,htmTree); for(i=1;i=n;i+) fputs(HCi,htmTree); fputs(r,htmTree); fclo

18、se(htmTree); cout已将字符与对应编码写入根目录下文件htmTree.txt中endlendl;/init/-获取字符并写入文件-void inputcode() FILE *virttran,*tobetran; char str100; if(tobetran=fopen(tobetran.txt,w)=NULL) cout不能打开文件endl; return; cout请输入你想要编码的字符endl; gets(str); fputs(str,tobetran); cout获取字符成功endl; fclose(tobetran);/-void encode() /完成编码功

19、能 cout下面对目录下文件tobetran.txt中的字符进行编码endl; FILE *tobetran,*codefile; if(tobetran=fopen(tobetran.txt,rb)=NULL) cout不能打开文件endl; if(codefile=fopen(codefile.txt,wb)=NULL) cout不能打开文件endl; char *tran; i=99; tran=(char*)malloc(100*sizeof(char); /为tran分配100个字节 while(i=99) if(fgets(tran,100,tobetran)=NULL) cout

20、不能打开文件endl; break; for(i=0;*(tran+i)!=0;i+) for(j=0;jn) cout字符错误,无法编码!endl; break; cout编码工作完成endl编码写入目录下的codefile.txt中endlendl; fclose(tobetran); fclose(codefile); free(tran);/-void decode() /完成译码功能 cout下面对根目录下文件codefile.txt中的字符进行译码endl; FILE *codef,*txtfile; if(txtfile=fopen(Textfile.txt,w)=NULL) c

21、out不能打开文件endl; if (codef=fopen(codefile.txt,r)=NULL) cout不能打开文件endl; char *tbdc,*outext,i2; int io=0,i,m; unsigned long length=10000; tbdc=(char*)malloc(length*sizeof(char); /分配空间 fgets(tbdc,length,codef); outext=(char*)malloc(length*sizeof(char); /分配空间 m=2*n-1; for(i=0;*(tbdc+i)!=0;i+) /进入循环 i2=*(t

22、bdc+i); if(HTm.lchild=0) *(outext+io)=*(z+m-1); io+; m=2*n-1; i-; else if(i2=0) m=HTm.lchild; else if(i2=1) m=HTm.rchild; *(outext+io)=0; fputs(outext,txtfile); cout译码完成endl内容写入根目录下的文件txtfile.txt中endlendl; free(tbdc); free(outext); fclose(txtfile); fclose(codef);/-void printcode() /打印代码 cout下面打印根目录下

23、文件CodePrin.txt中编码字符endl-n; FILE * CodePrin,* codefile; if(CodePrin=fopen(CodePrin.txt,w)=NULL) cout不能打开文件endl; return; if(codefile=fopen(codefile.txt,r)=NULL) cout不能打开文件endl; return; char *work3; work3=(char*)malloc(51*sizeof(char); do if(fgets(work3,51,codefile)=NULL) cout不能读取文件endl; break; fputs(w

24、ork3,CodePrin); puts(work3); while(strlen(work3)=50); free(work3); cout打印工作结束endlendl; fclose(CodePrin); fclose(codefile);void coprint(HuffmanTree start,HuffmanTree HT)/打印代码文件char t= ;if(start!=HT) FILE * TreePrint; if(TreePrint=fopen(TreePrint.txt,a)=NULL) cout创建文件失败rchild,HT); if(start-lchild!=NULL&start-rchild!=NULL) t=; coutsetw(5*numb)weighttendl; fprin

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1