#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx

上传人:b****6 文档编号:20964690 上传时间:2023-01-26 格式:DOCX 页数:17 大小:230.04KB
下载 相关 举报
#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx_第1页
第1页 / 共17页
#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx_第2页
第2页 / 共17页
#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx_第3页
第3页 / 共17页
#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx_第4页
第4页 / 共17页
#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx

《#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。

#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx

#define_Sstudent_h_

#include<

iostream>

usingnamespacestd;

structbirthday//出生日期

{

unsignedshortday;

unsignedshortmonth;

unsignedshortyear;

};

structSstudent//一个学生的基本信息

charnumber[12];

//学号

charname[12];

//名字

structbirthdaybd;

//出生日期

chargender[4];

//性别

charhealthcase[10];

//健康情况

Sstudent(){}

voidinput();

//输入学生的基本信息

voidoutput();

//输出学生的基本信息

voidoperator=(Sstudents);

booloperator<

(Sstudent&

s);

booloperator==(Sstudents);

booloperator>

voidSstudent:

:

input()//输入一个学生的信息

cout<

<

"

请输入学生信息:

endl;

请输入学生的学号:

;

cin>

>

number;

请输入学生的名字:

name;

请输入学生的性别:

gender;

请输入学生生日的日期(年、月、日):

bd.year>

bd.month>

bd.day;

请输入学生的健康情况(良好或差):

healthcase;

}

output()//输出一个学生的信息

学号:

"

number<

endl

<

姓名:

name<

<

性别:

gender<

生日:

bd.year<

/"

bd.month<

bd.day<

健康情况:

healthcase<

endl<

operator=(Sstudents)

strcpy(number,s.number);

strcpy(name,s.name);

strcpy(gender,s.gender);

bd.year=s.bd.year;

bd.month=s.bd.month;

bd.day=s.bd.day;

strcpy(healthcase,s.healthcase);

boolSstudent:

operator<

s)

if(strcmp(number,s.number)==-1)//若number小于s.number

returntrue;

else

returnfalse;

operator==(Sstudents)

if(!

strcmp(name,s.name))//若name等于s.number

if(!

strcmp(number,s.number))//若num等于s.number

returntrue;

returnfalse;

operator>

if(strcmp(number,s.number)==1)//若number大于s.number

#endif

2、将文件中的学生健康信息写进排序二叉树

BSTree:

BSTree()

root=NULL;

BTreeNode*b=NULL;

Sstudents;

fstreamfile;

file.open("

student.dat"

ios:

in|ios:

binary);

if(!

file)

{

cerr<

student.datcan'

topen!

abort();

}

while

(1)

file.read((char*)&

s,sizeof(s));

//从文件中读入一个学生的信息

if(!

break;

b=newBTreeNode(s,NULL,NULL);

inst(b->

data);

//调用插入函数建二叉树

file.close();

3、将排序二叉树中的学生信息写进文件

思想:

在退出程序调用析构函数时,通过前序遍历,将访问到的节点信息依次写进文件。

~BSTree()

out|ios:

BTreeNode*p=root;

preorder2(file,write1);

//通过前序遍历,调用写函数write1

}

VoidBSTree:

preorder2(fstream&

file,voidwrite1(fstream&

file,BTreeNode*p))

BTreeNode*stack[10],*p;

inttop=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)

rchild;

voidwrite1(fstream&

outfile,BTreeNode*p)//将节点p写进文件流

if(p==NULL)

cout<

p==NULL"

outfile.write((char*)&

(p->

data),sizeof(p->

data));

4、向学生健康表插入学生信息

//具有插入功能的查找(递归)

voidBSTree:

inst(BTreeNode*p,BTreeNode*&

bst)

{

if(bst==NULL)

bst=p;

elseif(p->

data<

bst->

data)

inst(p,bst->

lchild);

else

rchild);

/*

功能:

在当前的排序二叉树上查找关键字等于给定值el的结点,当查找成功时输出相应的信息,

否则建立一个新结点并插入在当前排序二叉树的适当位置中。

*/

inst(Sstudentel)

BTreeNode*p;

p=sear(el.number);

if(p!

=NULL)

已找到"

{

p=newBTreeNode(el,NULL,NULL);

inst(p,root);

5、删除学生信息

/*

首先查找该元素所在的节点p,同时记录父节点;

一、若p为空,则发出错误信号;

二、若p不为空:

分三种情况讨论:

  

若*p结点为叶子结点,即左子树和右子树均为空树。

由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。

若*p结点只有左子树或右子树,此时只要令左子树或右子树直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,

作此修改也不破坏二叉排序树的特性。

若*p结点的左子树和右子树均不空。

在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,做法:

用p的右子树的最左端的节点tmp的数据域刷新p的数据域,然后递归调用删除tmp.

BTreeNode*BSTree:

deleteNode(BTreeNode*&

p,charnum[])

BTreeNode*pfather=root,*qfather=NULL,*q=NULL;

intk;

//搜索该元素所在的节点,同时记录父节点

while(p!

=NULL)

k=strcmp(num,p->

data.number);

if(k==-1)

pfather=p;

elseif(k==1)

else

if(p==NULL)

找不到该同学信息,删除失败!

returnNULL;

lchild!

=NULL&

&

p->

rchild!

=NULL)//结点左右儿子都存在

BTreeNode*tmp=p->

while(tmp->

lchild)

tmp=tmp->

p->

data=tmp->

data;

rchild=deleteNode(p->

rchild,tmp->

{//只有一个儿子或没有儿子的情况

if(p->

lchild==NULL)

if(p==pfather->

lchild)//p是左子节点

pfather->

lchild=p->

else

rchild=p->

elseif(p->

rchild==NULL)

data.output();

returnp;

//实例函数

deleteNode(charnum[])

returndeleteNode(p,num);

6、在屏幕中输出全部学生信息

//采用中序遍历的思想输出节点信息,则在屏幕上根据学生学号的升序输出。

voidBTree:

prnt(BTreeNode*p)//递归函数

if(p!

=NULL)

prnt(p->

prnt()

prnt(root);

7、用户界面

主函数文件:

intmain()

BSTreet;

//新建一个二叉树:

t

intchoice=10;

//将choice初始化,使其不为0~4

BTreeNode*p=NULL;

charnum[12];

while(choice)

请输入您要进行的操作:

1------向学生健康表插入学生信息"

<

2------在健康表删除学生信息"

endl

3------在健康表中查询学生信息(按学生学号来进行查找)"

4------在屏幕中输出全部学生信息"

0------退出"

choice;

switch(choice)

case1:

s.input();

//输入学生信息

t.inst(s);

case2:

cout<

请输入要删除学生的学号:

cin>

num;

p=t.deleteNode(num);

{

cout<

删除成功!

删除学生的信息为:

p->

getdata().output();

}

case3:

请输入要查询学生的学号:

p=t.sear(num);

if(p!

找不到该学生信息!

case4:

t.prnt();

case0:

break;

default:

输入错误!

请重新输入。

}

return0;

【结果及结果分析】

1、插入学生信息:

插入后的二叉树为:

2、删除学生信息:

3、按学号查询学生信息:

4、输出二叉树中所有的学生信息:

【参考文献】

、《数据结构—C++描述》朱振元朱承编著

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 生物学

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

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