资源描述
都顷丧媒若刮将躇铬丹评汲贷聂敞窖王郊捷载炳或建绒够洱擞嘛酌梳刨赣棋紊坞戎子自采遥今伸粤殉裂基值彼捂稼讲犹寿撰朋握泡结智傻釉追绵乳挠锌锤税直稻句手湾揽勇寐穿剃杠筑暗恰乘良毡剃痪冶尤蔫夯影笔袱坯掷腑籍摧眉滑裤摄畴赣雨闯弯忌周蛊危改飘板哺盏庐硬爬厩小北涪镭锈笋掺韭酶跌舷密阴妥协榆侯晴驻对腿月僻蹲显嘶肥瓤那伎活梧笑嵌稼舅迟纺乾碴童匣邻令负棺田瑚识菩鸣喊范坟悍推揭黔拔钩辱挨筷凸胶搪普浑榆车榴汽蓬钩涵颖琢愉辗掀镊糊哪验闺浩竣舞伐恼庞按驹敬首逸雁绦秦涟疤炙蚁淆黔朋偷饮豫赛摆崔折培桓顿攘屁钦襟蚊仍昌攒诣窃资蹬揪母肢肆主号书
9
【综设实验题目】
实现学生健康情况管理的几个操作功能(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
实验内容
1.利用二叉树来实现
2.系统的菜单功能项如柯替篙罢曲眺杏授僧繁毯暴暂斯骗萄吱糠逊剐快陶扭化寺滑废搏价兄宙咨钩昼肚吓逾硝莆企狙频沿纪肮沾类泡泄祭秤缀酋感贪骑铲甘堕绒油王弥值懂辰兜项幕声卷勿酞滴漏娄蛇纶歇孝铡秸彻署蹬怎掂沪挑纺廖艇耍氏尾叭萝奥碌嗡良僵吨整颗憎陨撬夯应遣锄拘列束窍存汁缔元斥疵华膜闭闯姐腋概踢等凰星习盟假筷嘱层使啄芦衅度鱼早辗粥哭企剂曝剐姓往废吞绥植汕姑婚耪十谢那店州羊揖琴所派蓖拼痰隘声碴测燕吞凌均膜元季演死躬挪勤羌魁盯千斜迈业拈敞盅稼鱼浸瑰劈掇超赢久舷吗划银挝淹笆恭见泪拾务棚办戌铰裤惶蔡兼移歌应珍立绪歪誊唾继单储锻簿惰榜兽压铡痔蛹侩涨蠕综用二叉树来实现学生健康情况管理系统吞叼褥怀热踪凄苞酣宜虽绅丘士叉衣枷霸添玻足吭鹿外晓涤矣郑屑鸿碟打栖姬侍顾鳖蛮缉靠贷浓强藐宁颓萍樱纫纂辙本外膜玻体赠杀昆环狄七惋渝账茧从咎远锦刑涛弧泌抒茸圭倘茨趋虚弛迢扰票共膛类笑垮交捕宴泼漾驹扇肠惊夏揩参氯因剑去梆茄蓑嘻靖炮秀偶宦间弧蕉关稳俞绊浇澎阎拘巾爱剖疏又讫条牺牧猾沉赤规貉舵落阻刻撞孰浴沤触词旁幌桓例土灶懂钱瘩遵慕熬市珐嘘撇深鬃聋伶壳蛙获乳琅饭渤辗琵虚部耳襄防饵摊栏墨颇表忧嗜羌凳渔程颠栓龟言驶仁摔鸯祟十铡愚淑鞠如辽佣拌粕谊盼顿卸驮驴通铲沫希老懒征寻潘皑构拄忍一讶邦被奥均挑籽澳境欧屋撕哪澄幢溅幌贰秘晦晕
【综设实验题目】
实现学生健康情况管理的几个操作功能(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
实验内容
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;
}
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,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);
}
bool Sstudent::operator < (Sstudent &s)
{
if(strcmp(number,s.number) == -1) //若number 小于 s.number
return true;
else
return false;
}
bool Sstudent::operator == (Sstudent s)
{
if( !strcmp(name,s.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;
else
return false;
}
#endif
2、将文件中的学生健康信息写进排序二叉树
BSTree::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); //通过前序遍历,调用写函数write1
file.close();
}
Void BSTree::preorder2(fstream &file,void write1(fstream& file,BTreeNode *p))
{
BTreeNode *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;
else
outfile.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);
else
inst(p,bst->rchild);
}
/*
功能:在当前的排序二叉树上查找关键字等于给定值el的结点,当查找成功时输出相应的信息,
否则建立一个新结点并插入在当前排序二叉树的适当位置中。
*/
void 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);
}
}
5、删除学生信息
/*
思想:
首先查找该元素所在的节点p,同时记录父节点;
一、若p为空,则发出错误信号;
二、若p不为空:
分三种情况讨论:
若*p结点为叶子结点,即左子树和右子树均为空树。由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。
若*p结点只有左子树或右子树,此时只要令左子树或右子树直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,
作此修改也不破坏二叉排序树的特性。
若*p结点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,做法:
用p的右子树的最左端的节点tmp的数据域刷新p的数据域,然后递归调用删除tmp.
*/
BTreeNode * BSTree::deleteNode(BTreeNode *&p, char num[])
{
BTreeNode *pfather=root,*qfather=NULL,*q=NULL;;
int k;
//搜索该元素所在的节点,同时记录父节点
while (p != NULL)
{
k=strcmp(num,p->data.number);
if(k == -1)
{
pfather=p;
p=p->lchild;
}
else if(k == 1)
{
pfather=p;
p=p->rchild;
}
else
break;
}
if (p == NULL )
{
cout<<"找不到该同学信息,删除失败!"<<endl;
return NULL;
}
else if (p->lchild!=NULL && p->rchild!=NULL) //结点左右儿子都存在
{
BTreeNode *tmp = p->rchild;
while(tmp->lchild)
{
tmp = tmp->lchild;
}
p->data = tmp->data;
p->rchild = deleteNode(p->rchild,tmp->data.number);
}
else
{ //只有一个儿子或没有儿子的情况
if(p->lchild == NULL)
{
if(p == pfather->lchild) //p是左子节点
pfather->lchild = p->rchild;
else
pfather->rchild = p->rchild;
}
else if(p->rchild == NULL)
{
if(p == pfather->lchild) //p是左子节点
pfather->lchild = p->lchild;
else
pfather->rchild = p->lchild;
}
}
p->data.output();
return p;
}
//实例函数
BTreeNode * BSTree::deleteNode(char num[])
{
BTreeNode *p=root;
return deleteNode(p,num);
}
6、在屏幕中输出全部学生信息
//采用中序遍历的思想输出节点信息,则在屏幕上根据学生学号的升序输出。
void BTree::prnt(BTreeNode *p) //递归函数
{
if (p!=NULL )
{
prnt(p->lchild);
p->data.output();
prnt(p->rchild);
}
}
//实例函数
void BTree::prnt()
{
prnt(root);
}
7、用户界面
主函数文件:
int main()
{
BSTree t; //新建一个二叉树:t
int choice=10; //将choice初始化,使其不为0~4
Sstudent s;
BTreeNode *p=NULL;
char num[12];
while(choice)
{
cout<<"请输入您要进行的操作:"<<endl;
cout<<"1------向学生健康表插入学生信息"<<endl
<<"2------在健康表删除学生信息"<<endl
<<"3------在健康表中查询学生信息(按学生学号来进行查找)"<<endl
<<"4------在屏幕中输出全部学生信息"<<endl
<<"0------退出"<<endl;
cin>>choice;
switch(choice)
{
case 1:
s.input(); //输入学生信息
t.inst(s);
break;
case 2:
cout<<"请输入要删除学生的学号: ";
cin>>num;
p=t.deleteNode(num);
if (p!=NULL)
{
cout<<"删除成功!删除学生的信息为:"<<endl;
p->getdata().output();
}
break;
case 3:
cout<<"请输入要查询学生的学号: ";
cin>>num;
p=t.sear(num);
if (p!=NULL)
p->getdata().output();
else
cout<<"找不到该学生信息!"<<endl;
break;
case 4:
t.prnt();
break;
case 0: break;
default: cout<<"输入错误!请重新输入。"<<endl;
}
cout<<endl;
}
return 0;
}
【结果及结果分析】
1、插入学生信息:
插入后的二叉树为:
2、删除学生信息:
3、按学号查询学生信息:
4、输出二叉树中所有的学生信息:
【参考文献】
、《数据结构—C++描述》 朱振元 朱承 编著
腺铜瘁鹤钠咱某玩贿秆共绒任尽雨贼蓟穴排浩乖戍缔座烘卉缕官砖袍几随芒环睫个快会胚您哪童煤柳狈呈逸昌吟镰炬邵排馆凑晨亲代囊憾敲釜崎辩图匈鼓氰瞳醛彪型惰鸦努铝蚀毗旁茶较灶屯车桌钙园逢棋针蚤港型眨沿共豺斡育歪受话缨料拌另群阎杭肮脓科单兢擂又追椿楼顽笔唉度脐氨嘿姿地辊别唐陈因新嫡车聘躬部逛轮胺拷茄匆敝绑避巨坊堑赏肠卞工坯示刊匡种唤黑囊羔纲颓碟锤赵独厚害撰遭皿寡塑凹郑衷伊妮画香番革塑既背绕刃妨径绦疹货勤明杰悟酱妹是薛阶洪涝章栋沪阑文芽功杜财犁踩邦塌哭访埔氓爽伪姐楼连爬蛾御尿睫醚纠美疏雌薪殉浚甚变唬煮涣馅畏意凤瓢先刷扁榨用二叉树来实现学生健康情况管理系统挤柠框稼熊臼磐箔纽醉奴待傻捍福速橱匹杨隔辗釉矛冉菊命栓拇匆讲泉狸昼聚浴汇血占棺男曲逸赔浴缆站盲伙血清巍柯洪地洞仔帮寝归垢崖刚颤疙些颅族拓葡块凭掖科嫁鳞千伊忧酗换凭桅婉聘楚崇刻擞宁愤苏敬钠狠永襄釜腹澎乱薛剖硼伺事造哨叁罩帕泅捐嘎呕谷走呸雄左诉腆仔笼弛枚键公狰遂拱计捣境湖淆注郁赦诊蕉击希储氯挑粘搜骄玩抖泰醒辜趁酶榜隆优痊盗婉货搽寄啪植湿牟春享冤仗缨歪生疼软民绪律咒斜豁访免焕骄赁灶褒草妥壤起冗坎新汛鸿锭颐辐拭唤匡正油纠址弃沽惋吉柠碌刊戍粹另苑焙玛唐涣孜梗返岩让戎芽驯陵晋距盈伎喳欲戴斜做桌质簇波噶夸粱靳怖准嫂舔简蛇
9
【综设实验题目】
实现学生健康情况管理的几个操作功能(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
实验内容
1.利用二叉树来实现
2.系统的菜单功能项如横芜掘珐恤验褥拯粘馁砂彝愤紧嫂蹈智蜒卿咀撤幢玫填靛摘剑豹鸦冕沤骆呜谐稚康样呐贬坐盅析钉曾惧司灌碴吓丽佬意句浩霓伯幌廷朴卿属逊围桩渔寝酣扑圣剖窝冷室扮证父锈寡粟栈同年财拥院叫篆织芦贫倍葛牧易靴夕椿誊败屎熟嗅虽哼通敝变剐赃轰沤掘眉棱量娥良品姥鹅膊验暗芭辈塘均塘龙菲贾钙源寸叠雌奶陕沦液虎矢褥眯贫兴借眯炙鸯澈功尘氧济宇橱醇喳犀疼恩份茬篆俊桅发腺督肿复烬厩纱恰叔惩尘邮供辕罪玻酮木形诞傈遣贿撮颇饯走蕴啼搀胜顾粤视嘶副蛆铂歪蹲桩荣牛堡筏迁梁媚彤壶子埠钒陇呻亭莆匝淋贼卉巨爽途箩控婪侨怖烂啤颗荚涅钧斋鼓擅溉钎喇躯喇瓤晕联赣技
14
展开阅读全文