用二叉树来实现学生健康情况管理系统
- 格式:doc
- 大小:284.00 KB
- 文档页数:14
《用二叉树排序》作业设计方案(第一课时)一、作业目标:通过本次作业,学生应掌握二叉树的基本概念,了解二叉树在排序中的运用,并通过实践操作掌握用二叉树进行排序的方法。
二、作业内容:1. 学生需设计和实现一个简单的二叉排序树(Binary Search Tree),要求能进行基本的插入、查找和删除操作。
2. 针对一组随机生成的数据,学生需要按照二叉排序树的规则进行插入操作,使其成为一棵有效的二叉排序树。
3. 学生需编写程序,通过遍历二叉排序树,对数据进行排序。
4. 最后,学生需提交一份作业报告,包括对二叉排序树的实现过程和结果的描述,以及对算法的理解和体会。
三、作业要求:1. 作业应按时提交,作业报告应详细、客观,对代码进行注释和说明。
2. 实现过程中,学生应遵循信息技术的规范和标准,如代码格式、命名规范等。
3. 针对不同的数据集,学生应尝试多种插入方式,比较其效率和结果,以加深对二叉排序树的理解。
4. 鼓励学生在实现过程中发现问题、解决问题,提高其问题解决能力和编程技巧。
四、作业评价:1. 评价标准包括:代码实现是否正确、算法运行是否稳定、数据排序是否准确、作业报告是否详实。
2. 评价方式将采取教师评价、同学互评和自我评价相结合的方式,以促进学生的自我反思和相互学习。
3. 对于在实现过程中遇到困难的学生,教师将给予指导和帮助,帮助其克服困难,提高学习效果。
五、作业反馈:1. 学生提交作业后,教师将对作业进行批改和评分,并将结果反馈给学生。
2. 对于普遍存在的问题和疑惑,教师将在课堂上进行解答和讨论,以促进全班学生对知识的理解和掌握。
3. 同学之间也可以相互交流和学习,分享实现过程中的经验和技巧,共同提高编程水平。
4. 对于在评价过程中发现的问题,学生可以及时进行修正和改进,以提高自己的学习效果。
通过本次作业,学生将进一步巩固二叉树的基本概念和操作,掌握用二叉树进行排序的方法,同时也能提高自己的编程能力和问题解决能力。
平衡二叉树简称平衡树,是由Adelson-Velskii和Landis于1962年首先提出的,所以又称为AVL树。
他的定义很简单,就是若一棵二叉树的每个左右节点的高度差最多相差1,此二叉树即是平衡二叉树。
把二叉树的每个节点的左子树减去右子树定义为该节点的平衡因子。
二叉平衡树的平衡因子只能是1、0或者-1。
平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。
二叉搜索树有一个缺点就是,树的结构是无法预料的,随意性很大,它只与节点的值和插入的顺序有关系,往往得到的是一个不平衡的二叉树。
在最坏的情况下,可能得到的是一个单支二叉树,其高度和节点数相同,相当于一个单链表,对其正常的时间复杂度有O(lb n)变成了O(n),从而丧失了二叉排序树的一些应该有的优点。
当插入一个新的节点的时候,在普通的二叉树中不用考虑树的平衡因子,只要将大于根节点的值插入到右子树,小于节点的值插入到左子树,递归即可。
而在平衡二叉树则不一样,在插入节点的时候,如果插入节点之后有一个节点的平衡因子要大于2或者小于-2的时候,他需要对其进行调整,现在只考虑插入到节点的左子树部分(右子树与此相同)。
主要分为以下三种情况:(1)若插入前一部分节点的左子树高度和右子树高度相等,即平衡因子为0,插入后平衡因子变为1,仍符合平衡的条件不用调整。
(2)若插入前左子树高度小于右子树高度,即平衡因子为-1,则插入后将使平衡因子变为0,平衡性反倒得到调整,所以不必调整。
(3)若插入前左子树的高度大于右子树高度,即平衡因子为1,则插入左子树之后会使得平衡因子变为2,这样的情况下就破坏了平衡二叉树的结构,所以必须对其进行调整,使其加以改善。
调整二叉树首先要明白一个定义,即最小不平衡子树。
最小不平衡子树是指以离插入节点最近、且平衡因子绝对值大于1的节点做根的子树。
下面讲解平衡二叉树最基本的4种调整操作,调整的原则是调整后他的搜索二叉树的性质不变,即树的中序遍历是不会改变的:1. LL型调整。
华科数据结构二叉树实验报告一、实验目的本实验旨在通过实践操作,加深对数据结构中二叉树的理解,掌握二叉树的基本操作和应用。
二、实验内容1. 实现二叉树的创建和初始化。
2. 实现二叉树的插入操作。
3. 实现二叉树的删除操作。
4. 实现二叉树的查找操作。
5. 实现二叉树的遍历操作:前序遍历、中序遍历、后序遍历。
6. 实现二叉树的层次遍历。
7. 实现二叉树的销毁操作。
8. 进行实验测试,并分析实验结果。
三、实验步骤1. 创建二叉树的数据结构,包括节点的定义和指针的初始化。
2. 实现二叉树的创建和初始化函数,根据给定的数据构建二叉树。
3. 实现二叉树的插入操作函数,将新节点插入到二叉树的合适位置。
4. 实现二叉树的删除操作函数,删除指定节点,并保持二叉树的结构完整。
5. 实现二叉树的查找操作函数,根据给定的值查找对应的节点。
6. 实现二叉树的遍历操作函数,包括前序遍历、中序遍历、后序遍历。
7. 实现二叉树的层次遍历函数,按照层次顺序遍历二叉树。
8. 实现二叉树的销毁操作函数,释放二叉树的内存空间。
9. 编写测试程序,对上述函数进行测试,并分析实验结果。
四、实验结果与分析经过测试,实验结果如下:1. 创建和初始化函数能够正确构建二叉树,并初始化节点的值和指针。
2. 插入操作函数能够将新节点插入到二叉树的合适位置,并保持二叉树的结构完整。
3. 删除操作函数能够正确删除指定节点,并保持二叉树的结构完整。
4. 查找操作函数能够根据给定的值找到对应的节点。
5. 遍历操作函数能够按照指定的顺序遍历二叉树,并输出节点的值。
6. 层次遍历函数能够按照层次顺序遍历二叉树,并输出节点的值。
7. 销毁操作函数能够释放二叉树的内存空间,防止内存泄漏。
根据实验结果分析,二叉树的基本操作和应用都能够正常实现,达到了预期的效果。
五、实验总结通过本次实验,我进一步加深了对数据结构中二叉树的理解,并掌握了二叉树的基本操作和应用。
通过实践操作,我更加熟悉了二叉树的创建、插入、删除、查找和遍历等操作,同时也学会了如何进行层次遍历和销毁二叉树。
二叉树算法的应用二叉树算法在计算机科学中有着广泛的应用,它是一种非常有效的数据结构,可以用于解决许多问题。
下面将介绍二叉树算法的一些应用。
搜索二叉树搜索二叉树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的所有节点的值,且小于其右子树中的所有节点的值。
搜索二叉树的应用非常广泛,例如搜索引擎、数据库索引、哈希表等。
在这些应用中,搜索二叉树可以有效地对数据进行排序和查找,提高数据处理的效率。
二叉堆二叉堆是一种特殊的二叉树,其中每个节点的值都大于或等于其子节点的值。
二叉堆可以用于实现优先队列、堆排序等算法。
在优先队列中,可以使用二叉堆来维护一组元素,并按照元素的优先级进行排序。
在堆排序中,可以使用二叉堆来对一组元素进行排序,其时间复杂度为O(nlogn)。
二叉搜索树二叉搜索树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的所有节点的值,且小于其右子树中的所有节点的值。
二叉搜索树可以用于实现插入排序、查找、删除等算法。
在插入排序中,可以使用二叉搜索树来对一组元素进行排序,其时间复杂度为O(nlogn)。
在查找算法中,可以使用二叉搜索树来快速查找元素。
在删除算法中,可以使用二叉搜索树来删除指定的元素。
平衡二叉树平衡二叉树是一种特殊的二叉树,其中每个节点的左右子树的深度差不超过1。
平衡二叉树可以用于实现AVL树、红黑树等算法。
这些算法可以保证在最坏情况下,插入、删除等操作的时间复杂度为O(logn)。
二叉决策树二叉决策树是一种特殊的二叉树,其中每个节点表示一个决策。
在机器学习中,可以使用二叉决策树来构建分类器或回归器。
例如,决策树算法可以用于构建分类器,根据输入的特征来预测输出类别。
Trie树Trie树是一种特殊的二叉树,其中每个节点表示一个字符。
Trie树可以用于实现字符串匹配、文本压缩等算法。
在字符串匹配中,可以使用Trie树来快速查找字符串中的子串。
在文本压缩中,可以使用Trie树来存储一个字符串的所有前缀,从而减少存储空间的使用。
摘要本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们的关系。
并且具有保存文件的功能,以便下次直接使用先前存入的信息。
家谱的功能是查询家族每个人的信息,并且输出它们的信息,还要具有查询输出功能。
本文采用二叉树来存取家族的基本信息,头结点作为父亲节点,他的左孩子为他的妻子,妻子结点的右孩子为他的孩子,依次存储每个家庭的信息。
可以查找每个父亲的孩子和每个人的所有祖先。
关键词:二叉树家谱结点目录1 系统功能概述 (1)1.1 系统功能 (1)图2 成员二叉树功能模块图 (4)1.2 总体功能模块 (4)2 系统各功能模块的详细设计 (5)2.1功能选择 (5)2.2信息输入 (7)2.3信息输出 (7)2.4信息存盘 (7)2.5信息清盘 (8)2.6信息查询 (9)2.7源程序 (11)3设计结果与分析 (22)3.1菜单函数功能测试 (22)4.2输入功能函数测试 (23)3.3输出功能函数测试 (23)3.4清盘功能函数测试 (23)3.5存盘功能函数测试 (24)3.6查询功能函数测试 (24)总结 (26)参考文献 (27)1 系统功能概述1.1 系统功能实现的法是先定义一个二叉树,该二叉树上的每个结点由三个元素组成:姓名、指向它左孩子的指针、以及指向它右孩子的指针构成。
该家谱管理系统将信息用文件的法进行存储管理,再从文件中将成员信息以递归的法创建二叉树。
该输入成员信息的法是将父亲结点存上父亲的信息,然后父亲结点的左孩子存上母亲的信息,母亲结点的右孩子存上孩子的信息。
(1)定义结构体结构体为表示一个对象的不同属性提供了连贯一致的法,结构体类型的说明从关键词struct开始,成员可以由各种数据类型混合构成,成员甚至还可以是数组或者其他类型的结构,但是,结构体中不能包含自身定义类型的成员。
二叉树是我们都非常熟悉的一种数据结构。
它支持包括查找、插入、删除等一系列的操作。
但它有一个致命的弱点,就是当数据的随机性不够时,会导致其树型结构的不平衡,从而直接影响到算法的效率。
跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找、插入、删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领。
而且最重要的一点,就是它的编程复杂度较同类的AVL树,红黑树等要低得多,这使得其无论是在理解还是在推广性上,都有着十分明显的优势。
跳跃表由多条链构成(S0,S1,S2……,S h),且满足如下三个条件:(1)每条链必须包含两个特殊元素:+∞ 和 -∞(2)S0包含所有的元素,并且所有链中的元素按照升序排列。
(3)每条链中的元素集合必须包含于序数较小的链的元素集合,即:【基本操作】在对跳跃表有一个初步的认识以后,我们来看一下基于它的几个最基本的操作。
一、查找目的:在跳跃表中查找一个元素x在跳跃表中查找一个元素x,按照如下几个步骤进行:i)从最上层的链(S h)的开头开始ii)假设当前位置为p,它向右指向的节点为q(p与q不一定相邻),且q的值为y。
将y与x作比较(1) x=y 输出查询成功及相关信息(2) x>y 从p向右移动到q的位置(3) x<y 从p向下移动一格iii) 如果当前位置在最底层的链中(S0),且还要往下移动的话,则输出查询失败二、插入目的:向跳跃表中插入一个元素x首先明确,向跳跃表中插入一个元素,相当于在表中插入一列从S0中某一位置出发向上的连续一段元素。
有两个参数需要确定,即插入列的位置以及它的“高度”。
关于插入的位置,我们先利用跳跃表的查找功能,找到比x小的最大的数y。
根据跳跃表中所有链均是递增序列的原则,x必然就插在y的后面。
而插入列的“高度”较前者来说显得更加重要,也更加难以确定。
由于它的不确定性,使得不同的决策可能会导致截然不同的算法效率。
上海应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级姓名学号指导教师日期一.目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力表。
3、输出功能:void print(LinkList *head);通过一个while的循环控制语句,在指针p!=NULL时,完成全部学生记录的显示。
知道不满足循环语句,程序再次回到菜单选择功能界面。
4、删除功能:LinkList *Delete(LinkList *head);按想要删除的学生的学号首先进行查找,通过指针所指向结点的下移来完成,如果找到该记录,则完成前后结点的连接,同时对以查找到的结点进行空间的释放,最后完成对某个学生记录进行删除,并重新存储。
5、插入功能:LinkList *Insert(LinkList *head);输入你想插入的位置,通过指针所指向结点的下移,找到该位置,将该新的学生记录插入到该结点,并对该结点后面的指针下移。
链表长度加一,重新存储。
(5) 程序的输入与输出描述输入:调用LinkList *create()函数,输入学生的姓名、学号、三门功课的成绩;输出:调用void print(LinkList *head)函数,输出学生的记录。
(6) 程序测试主菜单:成绩管理系统的主界面:学生成绩记录的输入:输出学生成绩记录:学生成绩记录的删除(删除学号是1101的学生记录)插入新的学生成绩记录(插入学号为1103的学生记录)(7) 尚未解决的问题或改进方向尚未解决的问题:该成绩管理系统还存在不少缺陷,而且它提供的功能也是有限的,只能实现学生成绩的输入、输出、删除、插入。
数据结构二叉树实验报告1. 引言二叉树是一种常见的数据结构,由节点(Node)和链接(Link)构成。
每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树在计算机科学中被广泛应用,例如在搜索算法中,二叉树可以用来快速查找和插入数据。
本实验旨在通过编写二叉树的基本操作来深入理解二叉树的特性和实现方式。
2. 实验内容2.1 二叉树的定义二叉树可以用以下方式定义:class TreeNode:def__init__(self, val):self.val = valself.left =Noneself.right =None每个节点包含一个值和两个指针,分别指向左子节点和右子节点。
根据需求,可以为节点添加其他属性。
2.2 二叉树的基本操作本实验主要涉及以下二叉树的基本操作:•创建二叉树:根据给定的节点值构建二叉树。
•遍历二叉树:将二叉树的节点按照特定顺序访问。
•查找节点:在二叉树中查找特定值的节点。
•插入节点:向二叉树中插入新节点。
•删除节点:从二叉树中删除特定值的节点。
以上操作将在下面章节详细讨论。
3. 实验步骤3.1 创建二叉树二叉树可以通过递归的方式构建。
以创建一个简单的二叉树为例:def create_binary_tree():root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)return root以上代码创建了一个二叉树,根节点的值为1,左子节点值为2,右子节点值为3,左子节点的左子节点值为4,左子节点的右子节点值为5。
3.2 遍历二叉树二叉树的遍历方式有多种,包括前序遍历、中序遍历和后序遍历。
以下是三种遍历方式的代码实现:•前序遍历:def preorder_traversal(root):if root:print(root.val)preorder_traversal(root.left)preorder_traversal(root.right)•中序遍历:def inorder_traversal(root):if root:inorder_traversal(root.left)print(root.val)inorder_traversal(root.right)•后序遍历:def postorder_traversal(root):if root:postorder_traversal(root.left)postorder_traversal(root.right)print(root.val)3.3 查找节点在二叉树中查找特定值的节点可以使用递归的方式实现。
二叉排序树课程设计一、课程目标知识目标:1. 学生能够理解二叉排序树的基本概念和性质,掌握其结构特点和应用场景。
2. 学生能够掌握二叉排序树的插入、删除和查找操作,并了解其时间复杂度。
3. 学生能够理解二叉排序树与其他排序算法的关系,了解其在排序中的应用。
技能目标:1. 学生能够运用所学知识,独立构建二叉排序树,并实现插入、删除和查找功能。
2. 学生能够分析二叉排序树的性能,对其进行优化,提高排序效率。
3. 学生能够运用二叉排序树解决实际问题,如数据排序、查找等。
情感态度价值观目标:1. 学生通过学习二叉排序树,培养对数据结构和算法的兴趣,提高解决问题的能力。
2. 学生在学习过程中,学会合作、交流,培养团队精神和共享意识。
3. 学生能够认识到二叉排序树在实际应用中的价值,激发对计算机科学的热爱。
本课程针对高中年级学生,课程性质为理论与实践相结合。
在教学过程中,注重启发式教学,引导学生主动探究、实践。
根据学生特点和教学要求,课程目标具体、可衡量,以便学生和教师能够清晰地了解课程的预期成果。
课程目标的分解为具体的学习成果,为后续的教学设计和评估提供依据。
二、教学内容1. 引入二叉排序树的概念,讲解其定义、性质和基本操作。
- 理解二叉树的基础知识,回顾二叉树的遍历方法。
- 介绍二叉排序树的定义,阐述其特点及应用场景。
- 分析二叉排序树的性质,如二叉排序树的中序遍历结果为有序序列。
2. 探讨二叉排序树的构建、插入、删除和查找操作。
- 讲解二叉排序树的构建方法,学会从无序数据建立二叉排序树。
- 分析插入、删除和查找操作的步骤,理解它们的时间复杂度。
- 举例说明如何利用二叉排序树实现数据排序和查找。
3. 分析二叉排序树的性能及优化方法。
- 探讨二叉排序树的高度、平衡因子等性能指标。
- 介绍常见的优化方法,如平衡二叉树(AVL树)和红黑树。
4. 实践环节:二叉排序树的应用。
- 设计实践题目,让学生动手实现二叉排序树的基本操作。
#include<stdio.h>#include<string.h>typedef struct A{char NO[10];char name[10];char birt[10];char clas[10];char sex[2];}Elemtype;typedef struct B{Elemtype data;int bf;struct B *lchild;struct B *rchild;}node,*pnode;void left1(pnode &ptree,int &taller) {pnode p1,p2;if(ptree->bf==0){ptree->bf=1;taller=1;}else if (ptree->bf==-1){ptree->bf=0;taller=0;}else{p1=ptree->lchild;if (p1->bf==1){ptree->lchild=p1->rchild;p1->rchild=ptree;ptree->bf=p1->bf=0;ptree=p1;}else if (p1->bf==-1){p2=p1->rchild;p1->rchild=p2->lchild;p2->lchild=p1;ptree->lchild=p2->rchild;p2->rchild=ptree;if (p2->bf==0)ptree->bf=p1->bf=0;else if (p2->bf==1){p1->bf=0;ptree->bf=-1;}else{p1->bf=1;ptree->bf=0;}ptree=p2;ptree->bf=0;}taller=0;}}void right1(pnode &ptree,int &taller) {pnode p1,p2;if(ptree->bf==0){ptree->bf=-1;taller=1;}else if (ptree->bf==1){ptree->bf=0;taller=0;}else{p1=ptree->rchild;if (p1->bf==-1){ptree->rchild=p1->lchild;p1->lchild=ptree;ptree->bf=p1->bf=0;ptree=p1;}else if (p1->bf==1){p2=p1->lchild;p1->lchild=p2->rchild;p2->rchild=p1;ptree->rchild=p2->lchild;p2->lchild=ptree;if (p2->bf==0)ptree->bf=p1->bf=0;else if (p2->bf==-1){p1->bf=0;ptree->bf=1;}else{p1->bf=-1;ptree->bf=0;}ptree=p2;ptree->bf=0;}taller=0;}}int insert(pnode &ptree,Elemtype e,int &taller) {if (ptree==NULL){ptree=new node;ptree->data=e;ptree->lchild=ptree->rchild=NULL;ptree->bf=0;taller=1;}else{if (strcmp(e.NO,ptree->data.NO)==0){return 0;}if(strcmp(e.NO,ptree->data.NO)<0){if((insert(ptree->lchild,e,taller))==0)return 0;if(taller==1)left1(ptree,taller);}else{if((insert(ptree->rchild,e,taller))==0)return 0;if(taller==1)right1(ptree,taller);}}return 1;}void left2(pnode &ptree,int &taller){pnode p1,p2;if (ptree->bf==1){ptree->bf=0;taller=1;}else if (ptree->bf==0){ptree->bf=-1;taller=0;}else{p1=ptree->rchild;if(p1->bf==0){ptree->rchild=p1->lchild;p1->lchild=ptree;p1->bf=1;ptree->bf=-1;ptree=p1;}else if (p1->bf==-1){ptree->rchild=p1->lchild;p1->lchild=ptree;ptree->bf=p1->bf=0;ptree=p1;taller=1;}else{p2=p1->lchild;p1->lchild=p2->rchild;p2->rchild=p1;ptree->rchild=p2->lchild;p2->lchild=ptree;if (p2->bf==0){ptree->bf=0;p1->bf=0;}else if (p2->bf==-1){ptree->bf=1;p1->bf=0;}else{ptree->bf=0;p1->bf=-1;}p2->bf=0;ptree=p2;taller=1;}}}void right2(pnode &ptree,int &taller) {pnode p1,p2;if (ptree->bf==-1){taller=1;}else if (ptree->bf==0){ptree->bf=1;taller=0;}else{p1=ptree->lchild;if(p1->bf==0){ptree->lchild=p1->rchild;p1->rchild=ptree;p1->bf=-1;ptree->bf=1;ptree=p1;taller=0;}else if (p1->bf==1){ptree->lchild=p1->rchild;p1->rchild=ptree;ptree->bf=p1->bf=0;ptree=p1;taller=1;}else{p2=p1->rchild;p1->rchild=p2->lchild;p2->lchild=p1;ptree->lchild=p2->rchild;p2->rchild=ptree;if (p2->bf==0){ptree->bf=0;p1->bf=0;}else if (p2->bf==1){ptree->bf=-1;p1->bf=0;}else{ptree->bf=0;p1->bf=1;}p2->bf=0;ptree=p2;taller=1;}}}void delete2(pnode q,pnode &r,int &taller) {if (r->rchild==NULL){q->data=r->data;q=r;r=r->lchild;delete q;taller=1;}else{delete2(q,r->rchild,taller);if(taller==1)right2(r,taller);}}int delete1(pnode &ptree,char x[10],int &taller) {int k;pnode q;if(ptree==NULL)return 0;else if (strcmp(x,ptree->data.NO)<0){k=delete1(ptree->lchild,x,taller);if(taller==1)left2(ptree,taller);return k;}else if (strcmp(x,ptree->data.NO)>0){k=delete1(ptree->rchild,x,taller);if(taller==1)right2(ptree,taller);return k;}else{q=ptree;if (ptree->rchild==NULL){ptree=ptree->lchild;delete q;taller=1;}else if (ptree->lchild==NULL){ptree=ptree->rchild;delete q;taller=1;}else{delete2(q,q->lchild,taller);if(taller==1)left2(q,taller);ptree=q;}return 1;}}void create(pnode &ptree,int n){int j;Elemtype e;printf("输入学生信息:姓名,学号,生日,班级,性别\n");for(int i=0;i<n;i++){scanf("%s%s%s%s%s",,e.NO,e.birt,e.clas,e.sex);insert(ptree,e,j);}}void display(pnode ptree){if (ptree){display(ptree->lchild);printf("%-10s %-10s %-10s %-10s %-10s\n",ptree->,ptree->data.NO,ptree->data.bi rt,ptree->data.clas,ptree->data.sex);display(ptree->rchild);}}void find(pnode ptree,char *ch){if(ptree){if (strcmp(ptree->,ch)==0){printf("姓名学号生日班级性别\n");printf("%-10s %-10s %-10s %-10s %-10s\n\n",ptree->,ptree->data.NO,ptree->data. birt,ptree->data.clas,ptree->data.sex);return ;}else{find(ptree->lchild,ch);find(ptree->rchild,ch);}}}void save(pnode ptree,FILE *p){if (ptree){save(ptree->lchild,p);p=fopen("student.txt","a");fprintf(p,"%s\t%s\t%s\t%s\t%s\n",ptree->,ptree->data.NO,ptree->data.birt,ptree->d ata.clas,ptree->data.sex);fclose(p);save(ptree->rchild,p);}}void read(pnode &ptree,FILE *p){int j;char c;Elemtype e;if((p=fopen("student.txt","r"))==NULL)return ;while((c=fgetc(p))!=EOF){fscanf(p,"%s%s%s%s%s",,e.NO,e.birt,e.clas,e.sex);insert(ptree,e,j);}fclose(p);}void Print(pnode ptree,int indent){if (ptree == NULL)return;for(int i = 0; i < indent; i++)printf("|----- ");printf("%-10s %-10s %-10s %-10s %-10s\n",ptree->,ptree->data.NO,ptree->data.bi rt,ptree->data.clas,ptree->data.sex);Print(ptree->lchild, indent+1);Print(ptree->rchild, indent+1);}void change(pnode ptree,Elemtype e){if (ptree==NULL)return ;else{if (strcmp(ptree->data.NO,e.NO)==0){ptree->data=e;return;}else{change(ptree->lchild,e);change(ptree->rchild,e);}}}void male(pnode ptree){char m[2]={"m"};if (ptree){male(ptree->lchild);if(strcmp(ptree->data.sex,m)==0)printf("%-10s %-10s %-10s %-10s %-10s\n",ptree->,ptree->data.NO,ptree->data.bi rt,ptree->data.clas,ptree->data.sex);male(ptree->rchild);}}void fmale(pnode ptree){char m[2]={"f"};if (ptree){fmale(ptree->lchild);if(strcmp(ptree->data.sex,m)==0)printf("%-10s %-10s %-10s %-10s %-10s\n",ptree->,ptree->data.NO,ptree->data.bi rt,ptree->data.clas,ptree->data.sex);fmale(ptree->rchild);}}void main(){int z;FILE *p=NULL;pnode ptree=NULL;printf("请选择:\n1------------------载入学生信息\n2------------------重新创建信息\n");scanf("%d",&z);if(z==1)read(ptree,p);Elemtype e,a;int t=1;char ch[10],x[10];int j,k,n;while (t){printf("******** 平衡二叉树实现学生基本信息管理********\n");printf("***********************************************\n\n");printf("1------------------------------------------创建\n");printf("2------------------------------------------插入\n");printf("3------------------------------------------删除\n");printf("4------------------------------------------修改\n");printf("5------------------------------------------查找\n");printf("6------------------------------------------显示\n");printf("7------------------------------------------排序\n");printf("8------------------------------------------分组\n");printf("9------------------------------------------保存\n");printf("0------------------------------------------退出\n");printf("输入操作选项(0--9)\n");scanf("%d",&k);switch (k){case 1:printf("输入要创建的学生数\n");scanf("%d",&n);create(ptree,n);break;case 2:printf("输入学生信息: 姓名,学号,生日,班级,性别\n");scanf("%s%s%s%s%s",,e.NO,e.birt,e.clas,e.sex);insert(ptree,e,j);break;case 3:printf("输入要删除的学生的学号\n");scanf("%s",x);delete1(ptree,x,j);break;case 4:printf("输入修改后的信息: 姓名,学号,生日,班级,性别\n");scanf("%s%s%s%s%s",,a.NO,a.birt,a.clas,a.sex);change(ptree,a);break;case 5:printf("输入要查找的学生姓名\n");scanf("%s",ch);find(ptree,ch);printf("\n");break;case 6:printf("凹入显示:\n\n");Print(ptree,0);printf("\n");break;case 7:printf("按学号排序结果如下:\n\n");printf("姓名学号生日班级性别\n");display(ptree);printf("\n");break;case 8:printf("男生基本信息如下:\n\n");male(ptree);printf("\n");printf("女生基本信息如下:\n\n");fmale(ptree);printf("\n");break;case 9:p=fopen("student.txt","wt");fprintf(p,"\n");fclose(p);save(ptree,p);printf("学生信息已存入文件\n\n");break;case 0:printf("谢谢使用,再见\n");t=0;break;}}}。
【综设实验题目】实现学生健康情况管理的几个操作功能(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。
健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
实验内容1.利用二叉树来实现2.系统的菜单功能项如下:1------新建学生健康表2------向学生健康表插入学生信息3------在健康表删除学生信息4------从文件中读取健康表信息5------向文件写入学生健康表信息6------在健康表中查询学生信息(按学生学号来进行查找)7------在屏幕中输出全部学生信息8-----退出【中文摘要】这次实验主要用二叉树来实现简单的学生健康管理系统,为了方便查找,进一步使用排序二叉树来实现。
系统的功能包括:向学生健康表插入学生信息,在健康表删除学生信息,从文件中读取健康表信息,向文件写入学生健康表信息,在健康表中查询学生信息(按学生学号来进行查找),在屏幕中输出全部学生信息等。
健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
【关键词】排序二叉树学生健康管理系统学生信息【前言】本次实验是为了进一步熟悉和掌握VC环境下的编译、调试和执行的方法及步骤,熟悉二叉树存储的实现方式及其应用。
【实验设计】以排序二叉树为储存机制,可以方便的实现插入或删除学生信息。
每个学生的信息储存在一个结构体Sstudent中,并且这个结构体带有输出学生信息的函数ouput()。
然后以这个结构体作为二叉树节点的数据类型,这样就实现了学生信息的储存。
在创建二叉树对象时将已存储在文件中的学生信息写入二叉树,在析构函数里实现将学生信息写入文件。
【实验实现】软件平台:VC++ 6.0硬件平台:32位机器主要功能模块分析:1、储存一个学生的信息:/******************************************************************* Sstudent.h 文件*******************************************************************/ #ifndef _Sstudent_h_#define _Sstudent_h_#include <iostream>using namespace std;struct birthday //出生日期{unsigned short day;unsigned short month;unsigned short year;};struct Sstudent //一个学生的基本信息{char number[12]; //学号char name[12]; //名字struct birthday bd; //出生日期char gender[4]; //性别char healthcase[10]; //健康情况Sstudent(){}void input(); //输入学生的基本信息void output(); //输出学生的基本信息void operator =(Sstudent s);bool operator < (Sstudent &s);bool operator == (Sstudent s);bool operator > (Sstudent &s);};void Sstudent::input() //输入一个学生的信息{cout<<"请输入学生信息:"<<endl;cout<<"请输入学生的学号:";cin>>number;cout<<"请输入学生的名字:";cin>>name;cout<<"请输入学生的性别:";cin>>gender;cout<<"请输入学生生日的日期(年、月、日):";cin>>bd.year>>bd.month>>bd.day;cout<<"请输入学生的健康情况(良好或差):";cin>>healthcase;cout<<endl;1}void Sstudent::output() //输出一个学生的信息{cout<<"学号: "<<number<<endl<<"姓名: "<<name<<endl<<"性别: "<<gender<<endl<<"生日: "<<bd.year<<"/"<<bd.month<<"/"<<bd.day<<endl<<"健康情况: "<<healthcase<<endl<<endl;}void Sstudent::operator =(Sstudent s){strcpy(number,s.number);strcpy(name,);strcpy(gender,s.gender);bd.year=s.bd.year;bd.month=s.bd.month;bd.day=s.bd.day;strcpy(healthcase,s.healthcase);}bool Sstudent::operator < (Sstudent &s){if(strcmp(number,s.number) == -1) //若number 小于 s.number return true;elsereturn false;}bool Sstudent::operator == (Sstudent s){if( !strcmp(name,) ) //若name 等于 s.number if( !strcmp(number,s.number) ) //若num 等于 s.number return true;return false;}bool Sstudent::operator > (Sstudent &s){if(strcmp(number,s.number) == 1) //若number 大于 s.number return true;elsereturn false;}#endif2、将文件中的学生健康信息写进排序二叉树2BSTree::BSTree(){root=NULL;BTreeNode *b=NULL;Sstudent s;fstream file;file.open("student.dat",ios::in|ios::binary);if(!file){cerr<<"student.dat can't open!"<<endl;abort();}while(1){file.read((char*)&s,sizeof(s)); //从文件中读入一个学生的信息if(!file)break;b=new BTreeNode(s,NULL,NULL);inst(b->data); //调用插入函数建二叉树}file.close();}3、将排序二叉树中的学生信息写进文件思想:在退出程序调用析构函数时,通过前序遍历,将访问到的节点信息依次写进文件。
BSTree::~BSTree(){fstream file;file.open("student.dat",ios::out|ios::binary);if(!file){cerr<<"student.dat can't open!"<<endl;abort();}BTreeNode *p=root;preorder2(file,write1); //通过前序遍历,调用写函数write1file.close();}Void BSTree::preorder2(fstream &file,void write1(fstream& file,BTreeNode *p)){3BTreeNode *stack[10],*p;int top=0;p=root;while (top>=0){while(p!=NULL){write1(file,p);stack[top++]=p;p=p->lchild;}top--;p=stack[top];if( p!=NULL)p=p->rchild;}cout<<endl;}void write1(fstream &outfile, BTreeNode *p) //将节点p写进文件流{if(p==NULL)cout<<"p==NULL"<<endl;elseoutfile.write( (char*)&(p->data), sizeof(p->data) );}4、向学生健康表插入学生信息//具有插入功能的查找(递归)void BSTree::inst(BTreeNode *p,BTreeNode *&bst){if (bst==NULL)bst=p;else if (p->data < bst->data )inst(p,bst->lchild);elseinst(p,bst->rchild);}/*功能:在当前的排序二叉树上查找关键字等于给定值el的结点,当查找成功时输出相应的信息,否则建立一个新结点并插入在当前排序二叉树的适当位置中。
*/4void BSTree::inst(Sstudent el){BTreeNode *p;p = sear(el.number);if (p != NULL )cout<<"已找到 "<<endl;else{p=new BTreeNode(el,NULL,NULL);inst(p,root);}}○15、删除学生信息/*思想:首先查找该元素所在的节点p,同时记录父节点;一、若p为空,则发出错误信号;二、若p不为空:分三种情况讨论:若*p结点为叶子结点,即左子树和右子树均为空树。