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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

哈夫曼树应用 1.docx

1、哈夫曼树应用 1课程设计任务书 2010 2011 学年第 1 学期学生姓名: * 专业班级:*指导教师:* 工作部门: 计算机学院 一、课程设计题目:哈夫曼树应用二、课程设计要求:1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;2)利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件Text.txt中的正文进行编码,然后将结果存入文件Code.txt中。3)利用已建好的哈夫曼树将文件Code.txt中的代码进行译码,结果存入文件Text.txt中,并输出结果。三、进

2、度安排1分析问题,给出数学模型,选择数据结构。2设计算法,给出算法描述,给出源程序清单。3编辑、编译、调试源程序,撰写课程设计报告。四、基本要求1.界面友好,函数功能要划分好2.总体设计应画一流程图3.程序要加必要的注释4.要提供程序测试方案5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。1设计目的数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。数据结构是信息的一种

3、组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。 在当今信息时代,信息技术己成为当代知识经济的核心技术。我们时刻都在和数据打交道。比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、

4、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。 学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。通过此次课程设计主要达到以下目的:一、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;二、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;三、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;四、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。2.需求分析2.1哈夫曼编码/

5、译码器简介举例说明,先前快速远距离通信的主要手段是电报,即将需传送的文字转换成由二进制的字符组成的字符串。在传送电文时,希望总长尽可能地短,如果对每个字符设计长度不等的编码,且让电文中出现次数较多的字符采用尽可能短的编码,以减少经费。哈夫曼树就是根据此原理设计出来的一种存储结构。本次要做的哈夫曼编码/译码器的主要功能是:运用二叉树来设计二进制的前缀编码。若给一个文件,先统计文件中每个字符出现的频数,即作为此字符的权值,然后将里面的字符编码成相应的哈夫曼编码;反之,根据哈夫曼译码原理把所给二进制数编译成对应的字符串。2.2. 问题描述1.从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼

6、树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上; 2利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果,将文件CodeFile以紧凑格式 先是在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。3利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。2.3需求分析一个完整的系统应具有以下功能:1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n

7、个权值,建立哈夫曼树,并将它存于文件hfmTree中。输出哈夫曼树,及各字符对应的编码。2)W:输入(Input)。从终端读入需要编码的字符串s,将字符串s存入文件Tobetran.txt中。3)E:编码(Encoding)与译码(Decoding)。编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。印代码文件(Print)。将文件CodeFile以紧凑格式显

8、示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。4)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。5)Q:退出程序。返回WINDOWS界面。3.概要设计3.1问题分析哈夫曼树的定义typedef struct Huffmantree char ch; /*键值*/ int weight,mark; /*weight为权值,mark为标志域*/ struct Huffmantree *parent,*lchild,*rchild,*next;

9、/*结构指针*/Hftree,*linktree; 使用链树存储,然后分别调用统计频数函数,排序函数,建立哈夫曼函数,编码函数,译码函数来实现功能。4.详细设计4.1 系统框架图 对系统进行分析,给出系统结构图。如图4.1 z 图 4.1 系统流程图4.2 总体流程图哈夫曼树算法的总体流程图如图4.2 Case1 Case2 Case 2 Case 1图4.2 总体流程图4.3编码函数 以下是源程序中实现编码的部分:void Huffmancoding(linktree tree) int index=0; char *code; linktree ptr=tree; code=(char *

10、)malloc(10*sizeof(char); /*此数组用于统计哈夫曼编码*/ printf(字符以及它的相应权数-哈夫曼编码nn); if(ptr=NULL) coutlchild&ptr-rchild&ptr-mark=0) while(ptr-lchild&ptr-lchild-mark=0) codeindex+=0; ptr=ptr-lchild; if(!ptr-lchild&!ptr-rchild /打印哈夫曼树中的结点 ptr-mark=1; codeindex=0; printf(tw%c=%dttt,ptr-ch,ptr-weight); for(index=0;cod

11、eindex!=0;index+) printf(%c,codeindex); printf(n); ; ptr=tree; index=0; if(ptr-rchild&ptr-rchild-mark=0) ptr=ptr-rchild; codeindex+=1; if(!ptr-lchild&!ptr-rchild) ptr-mark=1; codeindex+=0; printf(tw%c=%dttt,ptr-ch,ptr-weight); for(index=0;codeindex!=0;index+) printf(%c,codeindex); printf(n); ptr=tre

12、e; index=0; if(ptr-lchild-mark=1&ptr-rchild-mark=1) ptr-mark=1; ptr=tree; index=0; printf(n); free(code); 4.4译码函数 以下函数是源程序中实现译码部分:void decode(linktree tree,char code) int i=0,j=0; char *char0_1; linktree ptr=tree; char0_1=(char *)malloc(10*sizeof(char); /*此数组用于统计输入的0、1序列*/ printf(哈夫曼编码-相应字符nn); for(

13、j=0,ptr=tree;codei!=0&ptr-lchild&ptr-rchild;j=0,ptr=tree) for(j=0;codei!=0&ptr-lchild&ptr-rchild;j+,i+) if(codei=0) ptr=ptr-lchild; char0_1j=0; if(codei=1) ptr=ptr-rchild; char0_1j=1; if(!ptr-lchild&!ptr-rchild) char0_1j=0; for(j=0;char0_1j!=0;j+) printf(%c,char0_1j); printf(%c,ptr-ch); if(codei=0&p

14、tr-lchild&ptr-rchild) char0_1j=0; printf(没有与最后的几个0、1序列:%s相匹配的字符!n,char0_1); return; free(char0_1); 4.5运行结果根据此次实验的设计需求及原理,我们编写出相应的源代码,在运行时可以得到相应的功能:如下图的界面所示:此界面中显示3种选择,可以分别执行不同的部分,由此看出,选择序号1可以进入编码界面,会提示输入字符串,按回车键即可输出与之对应哈夫曼编码。 图4.3 编码界面与之相对应的,下图则显示的是译码界面,即选择序号2时,根据提示,输入一串二进制数,即可编译成对应的字符:图4.4译码界面下图是打印

15、出来的哈夫曼树的界面:图4.5 打印界面5.调试分析 在我自己课程设计中,就在编写好源代码后的调试中出现了不少的错误,遇到了很多麻烦及困难,我的调试及其中的错误和我最终找出错误,修改为正确的能够执行的程序中,通过分析,我学到了:(1)在定义头文件时可多不可少,即我们可多写些头文件,肯定不会出错,但是若没有定义所引用的相关头文件,必定调试不通过;(2)在执行译码操作时,不知什么原因,总是不能把要编译的二进制数与编译成的字符用连接号连接起来,而是按顺序直接放在一起,视觉效果不是很好。还有就是,很遗憾的是,我们的哈夫曼编码/译码器没有像老师要求的那样完成编一个文件的功能,这是我们设计的失败之处。6.

16、小结 通过本次数据结构的课程设计,我学习了很多之前上课没懂的知识。并在冯珊老师指导下,我对求哈夫曼树及哈夫曼编码/译码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识,真正学会一种算法了。当求解一个算法时,不是拿到问题就不加思索地做,而是首先要先对它有个大概的了解,接着再详细地分析每一步怎么做,无论自己以前是否有处理过相似的问题,只要按照以上的步骤,必定会顺利地做出来。 这次课程设计中我在编辑方面犯了不应有的错误,设计统计字符和合并时忘记应该怎样保存保存数据,在老师的指导下明确并改正了错误和疏漏,使我们的程序有了更高的质量。在上次的设计中已经积累了一些基本的经验,所以做起来相

17、比上次算是顺利多了,但也还是会遇到一些这样或那样的问题,在这时就要看团体的力量,遇到困难时我们组会聚集到一块儿合力讨论,尽力把它解决,每次解决了一个问题之后就会给自己多了一份自信,对今后的学习和程序的设计有了更大的信心。再次我更要真心的感谢冯珊老师对我们的帮助与指导。我会更加努力学习数据结构方面的知识,来完善自己的学习。这次课程设计,主要是对我们的c语言和数据结构的一次实际性应用,通过这次课程设计,来加强我们对c和数据结构的基本知识。在这次设计中,我受益非浅。开始设计时,我程序出现好多错误,经过仔细查找,我发现自己在c方面有好多语句不能正确应用。开始我对文件不太会用,现在我这方面有了很大进步。

18、经过两个星期多的努力,我终于将课程设计做完了.在这次设计过程中,我遇到了许多编程问题,但在冯珊老师的辛勤指导下,同学的帮助和我的努力下,我顺利的完成了设计。这次的课程设计让我受益非浅,发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习语言,还是专业知识,都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好本专业知识。 编写程序即是一件艰苦的工作,又是一件愉快的事情。编程时如果遇到看似简单但又无法解决的问题,很容易灰心丧气。此时切不可烦躁,一定要冷静的思考,认真的分析,其过程为:面对问题,接受

19、问题,处理问题,解决问题。 再次对给过我帮助的所有同学和各位指导老师表示忠心的感谢!参考文献1刘晓华SQL Server2000数据库应用开发北京:电子工业出版社,2001.62(美)微软公司著,王黎,袁永康译MicrosoftNET 战略北京:清华大学出版社,2002.14谭浩强.C程序设计第二版.北京:清华大学出版社,20035任哲等.MFC Windows程序设计.北京:清华大学出版社,20046唐克.MFC程序设计.北京:北京希望电子出版社,20027严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,19978求是科技.Visual C+ 6.0信息管理系统开发.北京:人民邮

20、电出版社,20059朱晴婷,黄海鹰,陈莲君.VC+程序设计.北京:清华大学出版社,1998附录:源程序代码#include #include #include #include #include /typedef int TElemType;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 *

21、z;int flag=0;int numb=0;/ -求赫夫曼编码-int min(HuffmanTree t,int i) / 函数void select()调用 int j,flag; int k=UINT_MAX; / 取k为不小于可能的值 for(j=1;j=i;j+) if(tj.weights2) j=s1; s1=s2; s2=j; / -算法6.12-void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) / w存放n个字符的权值(均0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC int m,i,

22、s1,s2,start; /unsigned c,f; int c,f; HuffmanTree p; char *cd; if(n=1) return;/检测结点数是否可以构成树 m=2*n-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) / 建赫夫曼树 / 在HT1i-1中选择parent为0且weight最小的两个结点,其序号分别为s

23、1和s2 select(HT,i-1,s1,s2); HTs1.parent=HTs2.parent=i; HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; / 从叶子到根逆向求每个字符的赫夫曼编码 HC=(HuffmanCode)malloc(n+1)*sizeof(char*); / 分配n个字符编码的头指针向量(0不用) cd=(char*)malloc(n*sizeof(char); / 分配求编码的工作空间 cdn-1=0; / 编码结束符 for(i=1;i=n;i+) / 逐个字符求赫夫曼编码 st

24、art=n-1; / 编码结束符位置 for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) / 从叶子到根逆向求编码 if(HTf.lchild=c) cd-start=0; else cd-start=1; HCi=(char*)malloc(n-start)*sizeof(char); / 为第i个字符编码分配空间 strcpy(HCi,&cdstart); / 从cd复制编码(串)到HC free(cd); / 释放工作空间/-初始化赫夫曼链表-void Initialization() flag=1; int num; int num2; cout下面

25、初始化赫夫曼链表endlnum; n=num; w=(int*)malloc(n*sizeof(int); z=(char*)malloc(n*sizeof(char); coutn请依次输入n个字符(字符型)n注意:必须以回车结束:endl; char base2; for(i=0;in;i+) cout第i+1个字符:endl; gets(base); *(z+i)=*base; for(i=0;i=n-1;i+) coutsetw(6)*(z+i); coutn请依次输入n个权值(n注意:必须以回车结束):endl; for(i=0;i=n-1;i+) coutendl第i+1num2;

26、 *(w+i)=num2; HuffmanCoding(HT,HC,w,n);/-打印编码- cout字符对应的编码为:endl; for(i=1;i=n;i+) /cout字符*(z+i-1)的编码; puts(HCi); /-将赫夫曼编码写入文件- cout下面将赫夫曼编码写入文件endl.endl; FILE *htmTree; char r= ,0; if(htmTree=fopen(htmTree.txt,w)=NULL) coutcan not open fileendl; 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); fclose(h

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

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