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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

17统计问题.docx

1、17统计问题湖南人文科技学院计算机科学技系课程设计说明书课 程 名 称: 数据结构 课 程 代 码: 408024 题 目: 统计问题 年级/专业/班: 08级计算机科学与技术二班学 生 姓 名: 罗维 马红操 任萍 苏明 张小龙 学 号:08408225 08408226 08408228 08408229 指 导 教 师: 袁 辉 勇 开 题 时 间: 2009 年 12 月 日完 成 时 间: 2010年 1 月 日目 录摘 要 2一、引 言 4二、设计目的与任务 01、课程设计目的 02、课程设计的任务 0三、设计方案 01、需求分析 02、概要设计 13、详细设计 34、程序清单 5

2、四、调试分析与体会 5五、运行结果 5六、结 论 5七、致 谢 5八、参考文献 5摘 要本课程设计选取了统计问题进行制作,利用二叉排序树实现从文件中读出整数并统计其出现的次数,然后按整数由小到大的次序及其出现的次数写入文件;利用文件的输入输出函数实现对文件数据的读写。其具体是利用二叉排序树对整数排序,其中在建立二叉树的过程中运用了平衡二叉树的相关函数对二叉树进行平衡处理,并在这个过程中统计不同整数出现的次数。在开始阶段首先根据题目的要求,要从文件中读取整数,为了读取到文件中所有有效的数据,就需要利用循环控制语句逐个读取文件中的数据。考虑到要对不同的整数进行排序,并且统计出不同数据出现的次数,所

3、以在建立二叉树的结构类型时,就必须添加一个成员变量,用来在建立二叉排序树的过程中统计不同整出现的次数。关键词:二叉排序树;平衡二叉树;文件;整数;Abstract This course is designed to produce selected statistical issues, using the binary sort tree read from a file, an integer, and the number of statistics in whichwhich they appear, and then click the order from small to la

4、rge integers and the number of occurrences included in the document; the use of documents input and output functions to realize reading and writing file data. The specific is to use binary sort tree for integer sorting, in which the process of the establishment of a binary tree using a balanced bina

5、ry tree balanced binary correlation function of the processing and statistics in the process the number of occurrences of different integers. First, according to the subject at the beginning of the request, to read integers from a file, in order to read the file of all valid data, we need to use the

6、 loop control statements one by one to read the file data. Taking into account the different pairs of integers to be sorted, and the statistics of the number of occurrences of different data, so in the establishment of the structure of binary type, you must add a member variable count times used in

7、the establishment of two binary sort tree in the process Statistics of different whole number of occurrences.Keywords: Binary Sort Tree; Balanced Binary Tree; Documents; Integer;数据结构课程设计-统计问题一、引 言“ 数据结构 ” 是计算机类各专业的核心课程,也是其他诸多类专业的重要选修课。开设这门课可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础。同时对于我们逻辑思维培养和程序设计

8、思想体系的建立有着重要的影响。 学好 “ 数据结构 ” 仅仅通过课堂教学或自学获取理论知识是远远不够的,还必须加强实践,亲自上机输入、编辑、检查、修改、调试和运行各种典型算法。为了加强实践,我们就统计问题做了一个课程设计。 问题要求从文件中读取整数,利用二叉树实现对文件中整数进行排序,并统计不同整数出现的次数。为了解决这个问题,我们用运到了文件的输入输出函数来读写文件,利用建立二叉树排序树对文件中的数据进行排序,其中在建立二叉树的同时借助了平衡二叉树的相关,然后利用中序遍历输出即可得到有序的序列,而对文件中不同整数出现的次数的统计,则在树的结构体中添加一个计次成员变量。整个程序是用C语言编写的

9、,在Visual C+ 6.0中编译完成的。在拿到问题之后,因为对二叉排序树的算法,掌握的不是很好,开始编写函数时出现过不少问题,就如在编写插入函数时,因为在建树的过程中没有利用平衡二叉树的原理对二叉树进行平衡处理,所以在编写这个函数的过程,出现了大量的问题,后来有同学建意利用平衡二叉树来解决,加上借助书上已有的算法,得已顺利解决。整个程序最重要的函数完成之后,因为对以前C语言中的文件输入输出函数掌握不够,接着又参考了C语言的输入输出函数,完成了对文件数据的读写操作。程序完成之后,接着是编写文档,其中编写文档的过程中,值得一提的是,流程图的绘制和运行结果图的颜色控制;其次是各种文字格式的统一性

10、问题。分配的任务大家也都能顺利的完成,最后修改阶段,主要完成了对目录的更新,对格式的统一,和整体编排的美观。因为我们做课程设计的水平相对有限,加上经验不足,在完成程序的编写过程中,也出现过不少问题,经过组员们不断努力,不断修改,最终得以解决。由于时间仓促,设计的文档做的可能不是很完美,有错误和不足之处还请老师批评和指正。二、设计目的与任务1、课程设计目的 通过课程设计,使我们巩固所学知识、培养我们动手能力。我们用数据结构设计一个完整的应用程序,综合应用所学知识完成软件的分析、设计、调试和总结,提高我们对数据结构综合应用能力和解决问题的能力。灵活应用所学数据结构知识,独立完成问题分析。 初步掌握

11、软件开发过程的问题分析、系统设计、程序编码、测试等方法。训练用系统的观点和软件开发一般规范进行软件开发。提高综合运用所学的理论知识和方法独立分析和解决问题的能力。同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!2、课程设计的任务 问题描述: 使用二叉排序树实现:从文件中读出整数,统计不同整数出现的次数, 输出不同整数及其出现的次数,按整数由小到大的次序将整数及其出现的次数写入文件。 三、设计方案1、需求分析1) 由问题要求,用二叉排序树实现,从文件中读取整数,统计不同整数出现的次数,并顺序的输出到文件,可以想到肯定输出肯定要以中序遍历输出。2) 要求统计不同

12、整数出现的次数,并且要建立一棵二叉排序树以达到顺序输出的目的,则树的结构肯定要加入一个计次成员变量,在建树的过程中要借助平衡二叉树。3) 要求从文件读取数据,并输出数据到文件,则必须调用到文件操作的函数,如打开文件fopen(),读取文件数据fscanf(),输出数据到文件fprintf(),最后关闭文件fclose()。2、概要设计1) 二叉树数据类型(ADT)如下:ADT BinaryTree 数据对象D:D是具有相同特性的数据元素的集合。数据关系R: 若D=,则R=称BinaryTree为二叉树; 若D,则R=H,H是如下二元关系: 在D中存在惟一的称为根的数据元素root,它在关系H下

13、无前驱; 若D-root,则存在D-root=,且=; 若, 则中存在惟一的元素,H,且存在上的关系H,若,则中存在惟一的元素,H,且存在上的关系H;H=, ,;(,)是一棵符合本定义的二叉树,称为根的左子树,(,)是一棵符合本定义的二叉树,称为根的右子树。 基本操作:(1) EQ(s, w)函数功能:相等返回1,不相等返回2。(2) LQ(s, w)函数功能:前一个大于后一个返回1,否则返回零。(3) R_Rotate(&T)函数功能:对二叉树作一次右旋处理。(4) L_Rotate( &T)函数功能函数功能对此二叉树作一次左旋处理。(5) LeftBalance( &T)函数功能:对此二叉

14、树作左旋平衡处理。(6) RightBalance( &T)函数功能:对此二叉树作右旋平衡处理。(7) InsertAVL(&T, s, &taller)函数功能:在此二叉树中顺序的插入原来不存在的结点s。(8) in_order( root)函数功能:将排序二叉树的数据元素顺序的输出到文件。2) 存储结构typedef struct BiTNode/定义树结构 ElemType data; int num; /计次成员变量 int bf; /结点的平衡因子 struct BiTNode *lchild,*rchild;BiTNode,*BiTree;3) 流程图是否否是3、详细设计在本程序中

15、,重要的程序段有InsertAVL(BiTree &T,ElemType s,bool &taller),其主要作用是往二叉树中插入数据元素,并进行平衡处理;在这个函数的内部另外还调用了两个重要的函数LeftBalance(BiTree &T),RightBalance(BiTree &T),用来在建树过程中作平衡处理;在平衡处理的过程中,还有调用了R_Rotate()和L_Rotate()两个单旋处理函数。1) 插入函数这个程序段是本程序的中心,它的作用是在查找的过程中建立一棵二叉排序树,并调用相应的平衡处理函数作平衡处理。int InsertAVL(BiTree &T,ElemType s

16、,bool &taller)/若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据/元素为e的新结点,并返回1,否则返回0,若因插入而合二叉排序树失去平衡,/则作平衡旋转处理,布尔变量taller反映T长高与否。 if(!T) /插入新结点,树“长高”,置taller为TRUE T=(BiTree)malloc(sizeof(BiTNode); T-data=s; T-lchild=T-rchild=NULL;T-bf=EH;taller=true;T-num=1; else if(EQ(s,T-data) taller=false; T-num+; return 0; if(

17、LQ(s,T-data) if(!InsertAVL(T-lchild,s,taller) return 0; if(taller) switch(T-bf) case LH:LeftBalance(T); taller=false; break; case EH:T-bf=LH; taller=true; break; case RH:T-bf=EH; taller=false; break; else if(!InsertAVL(T-rchild,s,taller) return 0; if(taller) switch(T-bf) case LH:T-bf=EH; taller=fals

18、e; break; case EH:T-bf=RH; taller=true; break; case RH:RightBalance(T); taller=false; break; return 1;2) 平衡函数这个程序段也是本程序中的一个重要程序段,它的作用是对二叉树作左平衡处理,包含了双向旋转平衡处理的过程,调用了两个单向旋转平衡处理函数。void LeftBalance(BiTree &T)/对以指针T所指结点为根的二叉树作左平衡旋转处理,结束时,指针T指向新/的根结点。 BiTree lc,rd; lc=T-lchild; switch(lc-bf) /检查*T的左子树的平衡度,

19、并作相应的平衡处理 case LH:T-bf=lc-bf=EH; R_Rotate(T); break; case RH:rd=lc-rchild; switch(rd-bf) /修改*T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH:T-bf=lc-bf=EH; break; case RH: T-bf =EH; lc-bf=LH; break; rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); 由于右平衡处理函数RightBalance(BiTree &T)与左平衡理函数对称,作用也相似,下面就

20、不列出了。3) 单向平衡函数这个程序段是作单向平衡处理的,在对结点为根的二叉树作平衡处理的平衡处理函数(LeftBalance()和RightBalance())中都被调用到。而与之对称的void R_Rotate(BiTree)的功能与这个函数的功能相似,下面就不一一列出了。void L_Rotate(BiTree &T)/对以*p为根的二叉排序树作左旋处理,处理之后p指向新的/树根结点,即旋转处理之前的右子树的根结点 BiTree lc; lc=T-rchild; T-rchild=lc-lchild;lc-lchild=T;T=lc; 4) 中序遍历这个程序段的主要作用是中序遍历建好的排

21、序二叉树,并输出排序后的结果到文件中去!void in_order(BiTree root)/中序遍历,输出并打印排序后的结果 if(root) in_order(root-lchild); printf(%dtttnum=%dn,root-data,root-num);/输出到屏幕 fprintf(fp,%dtttnum=%dn,root-data,root-num);/输出到文件 in_order(root-rchild); 5) 打开文件、关闭文件这个位于main()函数中,用来以读写方式打开文件,在统计、排序操作完成后,并关闭文件。void main() fp=fopen(nam,r+

22、); fclose(fp);6) 主函数这个位于主函数中的重要程序段,其主要作用是把文件中的整数逐个循环的输入到树中。void main()while(fscanf(fp,%d,&x)!=EOF) InsertAVL(T,x,taller);4、程序清单/*1、使用二叉排序树实现2、功能实现 1) 从文件中读出整数,统计不同整数出现的次数 2) 输出不同整数及其出现的次数 3) 按整数由小到大的次序将整数及其出现的次数写入文件*/#include#include#include#define LH +1 /左高#define EH 0 /等高#define RH -1 /右高FILE *fp;

23、 /fp指向一个文件的结构体变量bool taller;typedef int ElemType;typedef struct BiTNode/定义树结构 ElemType data; int num; /计次成员变量 int bf; /结点的平衡因子 struct BiTNode *lchild,*rchild;BiTNode,*BiTree;int EQ(ElemType s,ElemType w)/比较结点键值是否相等 if(s=w)return 1; else return 0;int LQ(ElemType s,ElemType w)/比较结点键值大小 if(slchild; T-l

24、child=lc-rchild; lc-rchild=T; T=lc;void L_Rotate(BiTree &T)/对以*p为根的二叉排序树作左旋处理,处理之后p指向新的/树根结点,即旋转处理之前的右子树的根结点 BiTree lc; lc=T-rchild; T-rchild=lc-lchild; lc-lchild=T; T=lc;void LeftBalance(BiTree &T)/对以指针T所指结点为根的二叉树作左平衡旋转处理,结束时,/指针T指向新的根结点 BiTree lc,rd; lc=T-lchild; switch(lc-bf) /检查*T的左子树的平衡度,并作相应的平

25、衡处理 case LH:T-bf=lc-bf=EH; R_Rotate(T); break; case RH:rd=lc-rchild; switch(rd-bf) /修改*T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH:T-bf=lc-bf=EH; break; case RH: T-bf =EH; lc-bf=LH; break; rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); void RightBalance(BiTree &T)/对以指针T所指结点为根的二叉树作右平衡旋转处理,结束时,

26、/指针T指向新的根结点 BiTree lc,rd; lc=T-rchild; switch(lc-bf) /检查*T的右子树的平衡度,并作相应的平衡处理 case RH:T-bf=lc-bf=EH; L_Rotate(T); break; case LH:rd=lc-lchild; switch(rd-bf) /修改*T及其右孩子的平衡因子 case RH: T-bf=LH; lc-bf=EH; break; case EH:T-bf=lc-bf=EH; break; case LH: T-bf =EH;lc-bf=RH; break; rd-bf=EH; R_Rotate(T-rchild)

27、; L_Rotate(T); int InsertAVL(BiTree &T,ElemType s,bool &taller)/若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素/为e的新结点,并返回1,否则返回0,若因插入而合二叉排序树失去平衡,则作平/衡旋转处理,布尔变量taller反映T长高与否。P(237) if(!T) /插入新结点,树“长高”,置taller为TRUE T=(BiTree)malloc(sizeof(BiTNode); T-data=s; T-lchild=T-rchild=NULL; T-bf=EH;taller=true; T-num=1;

28、 else if(EQ(s,T-data) taller=false; T-num+; return 0; if(LQ(s,T-data) if(!InsertAVL(T-lchild,s,taller) return 0; if(taller) switch(T-bf) case LH:LeftBalance(T); taller=false; break; case EH:T-bf=LH; taller=true; break; case RH:T-bf=EH; taller=false; break; else if(!InsertAVL(T-rchild,s,taller) return 0; if(taller) switch(T-bf) case LH:T-bf=EH; taller=false; break; case EH:T-bf=RH; taller=true; break; case RH:RightBalance(T); taller=false; break;

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

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