#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx
《#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《#用二叉树来实现学生健康情况管理系统Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
#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++描述》朱振元朱承编著