用线索二叉树结构来构建一个学生信息管理系统,支持的操作的代码中会看到,主要的难点是线索二叉树的删除和插入操作,在以前有写过一篇线索二叉树的博客,里面有介绍线索二叉树的几本操作,但是当时没有写删除操作,线索二叉树。这次的代码中,加入了删除操作,我觉得也是整个程序里面的一个难点。主要是情况较多,要分每一种情况进行讨论,而且操作过程中,需要定位待删除节点的父节点。下面的代码有交详细解释,上代码
//Stu_Healthy.h文件 //定义各变量以及函数的文件 #ifndef _STU_HEALTHY_H_ #define _STU_HEALTHY_H_ #include <iostream> using namespace std; //学生信息类 class student { public: char num[20]; //学号 char name[20]; //姓名 char birthday[20]; //出生日期 char sex[10]; //性别 char healthy[10]; //健康状况 public: student &operator = (const student& e); //重载赋值号运算符 void print(); //输出学生信息 }; class Stu_Healthy; //树结点类 class BTreeNode { friend class Stu_Healthy; private: student data; //学生信息 int ltag; //ltag为0:表示lchild为一般二叉树的指针,指向其左子树 int rtag; //ltag为1:表示lchild为指向此结点的前驱的指针,rtag同理 BTreeNode *lchild; //左子数指针 BTreeNode *rchild; //右子树指针 public: BTreeNode() { lchild=0; rchild=0; } BTreeNode(student stu) { data=stu; lchild=0; rchild=0; } }; class Address //辅助搜索 { public: static int pos; //静态变量,统计结点数目 student data; //数据 BTreeNode *p; //指针 Address() { p=NULL; } }; class Stu_Healthy { private: BTreeNode *root; //根节点 static int Node_Num;//记录结点数目 public: Stu_Healthy() { root=0; } BTreeNode *Create_Tree(); //先序建立二叉树 BTreeNode *Create_Tree(student a[],int n); //用数组a的元素进行层次建树 BTreeNode *InOrder_Threading(BTreeNode *r);//将二叉树线索化,按中序遍历的顺序 void In_Threading(BTreeNode *p,BTreeNode *&pre); //线索化辅助函数 Stu_Healthy &Delete_Info(BTreeNode *&Thrd,BTreeNode *p); //删除学生信息 void InOrder_Traverse(BTreeNode *r); //中序遍历 void LevelOrder_Traverse(BTreeNode *Thrd); //层次遍历 void Prior_Thr(BTreeNode *Thrt,BTreeNode *t,BTreeNode *&p); //求结点t前驱 void Next_Thr(BTreeNode *Thrt,BTreeNode *t,BTreeNode *&p); //求结点t后继 void Insert_Lchild(BTreeNode *Thrt,BTreeNode *t,student d); //数据d作为t左孩子插入 void Insert_Rchild(BTreeNode *Thrt,BTreeNode *t,student d); //数据d作为t右孩子插入 int Search_Parent(BTreeNode *root1,BTreeNode *p,BTreeNode *&prnt); //搜索结点p的父节点 bool Search(char *num,student &stu,BTreeNode *&p); //按学号搜索学生信息 bool Write_Into_file(); //将信息写入文件 bool Read_From_file(); //从文件中读取信息 }; #endif
//Stu_Healthy.cpp文件 #include "Stu_Healthy.h" #include <iostream> #include <fstream> #include <string> #include <queue> #include <stack> using namespace std; //静态变量初始化 int Stu_Healthy::Node_Num=0; int Address::pos=0; Address ad[100]; student &student::operator = (const student& e) { strcpy(num,e.num); strcpy(name,e.name); strcpy(birthday,e.birthday); strcpy(sex,e.sex); strcpy(healthy,e.healthy); return *this; } void student::print() { cout<<"-------------------------------------"<<endl; cout<<"学生信息如下:"<<endl; cout<<"学号:"<<num<<endl; cout<<"姓名:"<<name<<endl; cout<<"性别:"<<sex<<endl; cout<<"出生日期:"<<birthday<<endl; cout<<"健康状况:"<<healthy<<endl; cout<<"-------------------------------------"<<endl; } BTreeNode *Stu_Healthy::Create_Tree() { //先序建树 BTreeNode *r; student d; cout<<"输入学生的学号(输入000表示空):"; cin>>d.num; if(strcmp(d.num,"000")==0) return NULL; else { Node_Num++; cout<<"输入学生的姓名:"; cin>>d.name; cout<<"输入学生性别:"; cin>>d.sex; cout<<"输入学生的出生年月日:"; cin>>d.birthday; cout<<"输入学生的健康状况:"; cin>>d.healthy; r=new BTreeNode(d); //将数据存入ad数组中,用于搜索时候使用 ad[Address::pos].data=d; ad[Address::pos].p=r; Address::pos++; r->lchild=Create_Tree(); if(r->lchild) r->ltag=0; r->rchild=Create_Tree(); if(r->rchild) r->rtag=0; } root=r; return r; } //用数组a的元素进行层次建树 BTreeNode *Stu_Healthy::Create_Tree(student a[],int n) { BTreeNode *r; if(n==0) r=NULL; else { int i=0; queue<BTreeNode *> qu; BTreeNode *p; r=new BTreeNode; r->data=a[i]; r->lchild=r->rchild=NULL; ad[Address::pos].data=a[i]; ad[Address::pos].p=r; Address::pos++; i++; qu.push(r); while(i<n) { p=qu.front(); qu.pop(); p->lchild=new BTreeNode; p->lchild->data=a[i]; p->lchild->lchild=NULL; p->lchild->rchild=NULL; ad[Address::pos].data=a[i]; ad[Address::pos].p=r; Address::pos++; qu.push(p->lchild); i++; if(i==n) return r; p->rchild=new BTreeNode; p->rchild->data=a[i]; p->rchild->lchild=NULL; p->rchild->rchild=NULL; ad[Address::pos].data=a[i]; ad[Address::pos].p=r; Address::pos++; qu.push(p->rchild); i++; } } root=r; Node_Num=n; return r; } BTreeNode *Stu_Healthy::InOrder_Threading(BTreeNode *r) { //遍历二叉树,并将其中序线索化,其中,Thrt指针指向头结点,r指向根节点 BTreeNode *pre=NULL; BTreeNode *Thrt; Thrt=new BTreeNode; Thrt->ltag=0; Thrt->rtag=1; Thrt->rchild=Thrt;//初始化时,让头结点的右指针指向自己 if(!r) Thrt->lchild=Thrt; //若为空树,左指针也指回自己 else { Thrt->lchild=r; pre=Thrt; In_Threading(r,pre); //pre是r的前驱指针 //从上面的函数出来时,pre指在最后一个结点处 pre->rchild=Thrt; pre->rtag=1; //最后一个结点的线索化 Thrt->rchild=pre; } cout<<"二叉树线索化 完成~~"<<endl; return Thrt; } void Stu_Healthy::In_Threading(BTreeNode *p,BTreeNode *&pre) { //以指针p所指向的二叉树进行中序遍历,遍历过程中进行线索化 //pre指针是p的前驱指针 if(p) { In_Threading(p->lchild,pre);//左子树线索化 if(!p->lchild) //若p的左子树为空,给p结点加前驱线索 { p->ltag=1; p->lchild=pre; } else p->ltag=0; if(pre && !pre->rchild) { pre->rtag=1; pre->rchild=p; } else if(pre->rchild) p->rtag=0; pre=p; In_Threading(p->rchild,pre); //右子树线索化 } } //按学号搜索学生信息 bool Stu_Healthy::Search(char *newnum,student &stu,BTreeNode *&p) { for(int i=0;i<Node_Num;i++) if(strcmp(ad[i].data.num,newnum) == 0) { stu=ad[i].data; p=ad[i].p; return true; } return false; } //中序遍历 void Stu_Healthy::InOrder_Traverse(BTreeNode *r) { int count=0; BTreeNode *p; p=r->lchild; while(p!=r) { while(p->ltag==0) p=p->lchild; p->data.print(); while(p->rtag==1 && p->rchild!=r) { p=p->rchild; p->data.print(); } p=p->rchild; } } //层次遍历 void Stu_Healthy::LevelOrder_Traverse(BTreeNode *Thrd) { queue<BTreeNode *> qu; BTreeNode *p=Thrd->lchild; qu.push(p); while(!qu.empty()) { p=qu.front(); qu.pop(); p->data.print(); if(p->ltag == 0) qu.push(p->lchild); if(p->rtag == 0) qu.push(p->rchild); } } void Stu_Healthy::Prior_Thr(BTreeNode *Thrt,BTreeNode *t,BTreeNode *&p) { //p返回结点t的直接前驱 p=t->lchild; if(p==Thrt) { cout<<"给定的结点是第一个结点,不存在前驱"<<endl; return ; } if(t->ltag==0) while(p->rtag==0) p=p->rchild; } void Stu_Healthy::Next_Thr(BTreeNode *Thrt,BTreeNode *t,BTreeNode *&p) { //p返回结点t的直接后继 p=t->rchild; if(p==Thrt) { cout<<"该结点为最后一个结点,无后继"<<endl; return ; } if(p->rtag==0) while(p->ltag==0) p=p->lchild; } void Stu_Healthy::Insert_Lchild(BTreeNode *Thrt,BTreeNode *t,student d) { /* 将结点值为d的结点插入t后面,作为t的左孩子 如果t本来的无左孩子,那么直接插入即可 如果t有左孩子,那么: t的左孩子在新的节点q插入后,作为q的左孩子,因此q->ltag=0; 将新结点q作为t的左孩子 求出新的结点q的前驱,修改q的前驱结点的rchild域,使它的后继为q */ BTreeNode *q=new BTreeNode; q->data=d; q->lchild=t->lchild; q->ltag=t->ltag; q->rchild=t; q->rtag=1; t->lchild=q; t->ltag=0; if(q->ltag==0) { BTreeNode *p; Prior_Thr(Thrt,q,p); p->rchild=q; } ad[Address::pos].data=d; ad[Address::pos].p=q; Address::pos++; Node_Num++; } void Stu_Healthy::Insert_Rchild(BTreeNode *Thrt,BTreeNode *t,student d) { //思路和上面的左孩子一样 BTreeNode *q=new BTreeNode; q->data=d; q->rchild=t->rchild; q->rtag=t->rtag; q->lchild=t; q->ltag=1; t->rchild=q; t->rtag=0; if(q->rtag==0) { BTreeNode *p; Next_Thr(Thrt,q,p); p->lchild=q; } ad[Address::pos].data=d; ad[Address::pos].p=q; Address::pos++; Node_Num++; } int Stu_Healthy::Search_Parent(BTreeNode *root1,BTreeNode *p,BTreeNode *&prnt) { //搜索结点p的父节点 //用层次遍历的方法来找 queue<BTreeNode *> qu; if(root1 == p) { prnt=NULL; return 0; //返回0代表结点p是根节点 } qu.push(root1); while(!qu.empty()) { root1=qu.front(); qu.pop(); if(root1->lchild == p) { prnt=root1; return 1; //返回1代表结点p是父节点的左子树 } else if(root1->rchild == p) { prnt=root1; return 2; //返回2代表结点p是父节点的右子树 } if(root1->ltag == 0) qu.push(root1->lchild); if(root1->rtag == 0) qu.push(root1->rchild); } } //删除结点p,并调整线索二叉树的结构 Stu_Healthy &Stu_Healthy::Delete_Info(BTreeNode *&Thrd,BTreeNode *p) { //删除的算法分清楚待删除结点的与父节点的关系后,再按四种情况 //去分析,就会不难的,只要细心点,画画图,就可以了,所以在这里 //不详细展开说删除算法,代码也写得很清楚了,一时看不出为什么的 //根据每种情况,画画图就OK了 BTreeNode *prnt,*q,*t; int mode=Search_Parent(root,p,prnt); if(mode == 0) { //待删除结点是根节点 if(p->ltag == 0 && p->rtag == 1) { Prior_Thr(Thrd,p,q); q->rchild=NULL; root=p->lchild; Thrd->lchild=p->lchild; delete p; } else if(p->ltag == 1 && p->rtag == 0) { Next_Thr(Thrd,p,t); t->lchild=NULL; Thrd->lchild=p->rchild; root=p->rchild; delete p; } else if(p->ltag == 1 && p->rtag == 1) { Thrd->rchild=Thrd; Thrd->lchild=NULL; root=NULL; delete p; } else if(p->ltag == 0 && p->rtag == 0) { q=p->lchild; t=p->rchild; q->rchild=t; q->rtag=0; if(t->ltag) t->lchild=q; Thrd->lchild=q; root=q; delete p; } } else if(mode == 1) { //待删除结点是父节点的左子树 if(p->ltag == 0 && p->rtag == 1) { prnt->lchild=p->lchild; Prior_Thr(Thrd,p,q); q->rchild=prnt; delete p; } else if(p->ltag == 1 && p->rtag == 0) { prnt->lchild=p->rchild; Prior_Thr(Thrd,p,q); Next_Thr(Thrd,p,t); t->lchild=q; if(q->rtag) q->rchild=t; delete p; } else if(p->ltag == 1 && p->rtag == 1) { prnt->ltag=1; prnt->lchild=p->lchild; if(p->lchild->rtag) p->lchild->rchild=prnt; delete p; } else if(p->ltag == 0 && p->rtag == 0) { prnt->lchild=p->lchild; Prior_Thr(Thrd,p,q); Next_Thr(Thrd,p,t); q->rchild=p->rchild; q->rtag=0; t->lchild=q; delete p; } } else if(mode == 2) { //待删除结点是父节点的右子树 if(p->ltag == 0 && p->rtag == 1) { prnt->rchild=p->lchild; Prior_Thr(Thrd,p,q); Next_Thr(Thrd,p,t); q->rchild=t; if(t->ltag) t->lchild=q; delete p; } else if(p->ltag == 1 && p->rtag == 0) { prnt->rchild=p->rchild; Next_Thr(Thrd,p,q); q->lchild=prnt; delete p; } else if(p->ltag == 1 && p->rtag == 1) { prnt->rchild=p->rchild; prnt->rtag=1; if(p->rchild->ltag) p->rchild->lchild=prnt; delete p; } else if(p->ltag == 0 && p->rtag == 0) { prnt->rchild=p->rchild; Prior_Thr(Thrd,p,q); Next_Thr(Thrd,p,t); t->lchild=p->lchild; t->ltag=0; q->rchild=t; delete p; } } return *this; } bool Stu_Healthy::Write_Into_file() { ofstream file; file.open("stu.txt"); if(!file) { cout<<"文件\"stu.txt\"打开失败"<<endl; return false; } cout<<"按照层次遍历的顺序写入文件"<<endl; BTreeNode *p=root; queue<BTreeNode *> qu; qu.push(p); while(!qu.empty()) { p=qu.front(); qu.pop(); file<<endl<<p->data.num<<" "<<p->data.name<<" "<<p->data.sex<<" " <<p->data.birthday<<" "<<p->data.healthy; if(p->ltag==0) qu.push(p->lchild); if(p->rtag==0) qu.push(p->rchild); } return true; } bool Stu_Healthy::Read_From_file() { ifstream file; file.open("stu.txt"); if(!file) { cout<<"文件\"stu.txt\"打开失败"<<endl; return false; } cout<<"下面将读取文件中的内容并显示"<<endl; student stu; while(!file.eof()) { file>>stu.num>>stu.name>>stu.sex>>stu.birthday>>stu.healthy; stu.print(); } return true; }
#include "Stu_Healthy.h" #include <iostream> using namespace std; int main() { int flag,n,i,flag2; char num[20]; bool once=false; //程序只支持新建一次 student *stu,stu_temp,stu_temp2; BTreeNode *root,*Thrt,*p,*t; Stu_Healthy Stu_Heal; do { cout<<"****************************************************"<<endl; cout<<"* 欢迎进入学生健康状况管理系统 *"<<endl; cout<<"* 1:新建学生健康表 2:按学号查询学生信息 *"<<endl; cout<<"* 3:删除指定学生信息 4:插入新学生信息 *"<<endl; cout<<"* 5:向文件中写入学生信息 6:从文件中读取学生信息 *"<<endl; cout<<"* 7:输出目前全部学生信息 8:退出 *"<<endl; cout<<"****************************************************"<<endl; cout<<"请输入你的选择:"; cin>>flag; switch(flag) { case 1: if(once) //判断是否是第一次新建健康表 { cout<<"新建已经完成,本程序不允许重新新建,请选择其他操作"<<endl; goto lp; } cout<<"____欢迎进入新建学生健康表单元____"<<endl; cout<<endl; once=true; cout<<"选择你要新建健康表的方式(如果输入非1也非2的,默认使用第一种建立方式)"<<endl; cout<<"*****************************************"<<endl; cout<<"* 1:先序建立 2:通过数组,层次建立 *"<<endl; cout<<"*****************************************"<<endl; cout<<"输入你的选择:"; cin>>flag2; if(flag2 == 2) { cout<<"输入你要新建的学生健康表的学生总数:"; cin>>n; stu=new student[n]; for(i=0;i<n;i++) { cout<<"输入第"<<i+1<<"个学生的基本信息"<<endl; cout<<"学号 姓名 性别 生日 健康状况"<<endl; cin>>stu[i].num>>stu[i].name>>stu[i].sex>>stu[i].birthday>>stu[i].healthy; } root=Stu_Heal.Create_Tree(stu,n); } else root=Stu_Heal.Create_Tree(); cout<<endl; cout<<"对二叉树进行中序线索化"<<endl; Thrt=Stu_Heal.InOrder_Threading(root); cout<<"初始化学生健康表完成"<<endl; lp: break; case 2: cout<<"输入你要查询的学生的学号:"; cin>>num; if(Stu_Heal.Search(num,stu_temp,p)) { cout<<"搜索成功,该学生的基本信息如下:"<<endl; stu_temp.print(); } else cout<<"搜索的学生资料不存在"<<endl; break; case 3: cout<<"输入你要删除的学生的学号:"; cin>>num; if(Stu_Heal.Search(num,stu_temp,p)) { Stu_Heal.Delete_Info(Thrt,p); cout<<"删除的学生信息如下:"<<endl; stu_temp.print(); } else cout<<"要删除的学生信息不存在,操作无效"<<endl; break; case 4: cout<<"输入要插入的新学生的基本信息:"<<endl; cout<<"学号 姓名 性别 生日 健康状况"<<endl; cin>>stu_temp.num>>stu_temp.name>>stu_temp.sex>>stu_temp.birthday>>stu_temp.healthy; cout<<"输入想插入在哪个学生之后,输入该学生的学号:"; cin>>num; if(Stu_Heal.Search(num,stu_temp2,p)) { cout<<"搜索成功,选择插入的位置:"<<endl; cout<<"********************************************"<<endl; cout<<"* 1: 作为左子树插入 2:作为右子树插入 *"<<endl; cout<<"********************************************"<<endl; cin>>flag2; if(flag2 == 1) { Stu_Heal.Insert_Lchild(Thrt,p,stu_temp); cout<<"作为左子树插入成功"<<endl; } else if(flag2 == 2) { Stu_Heal.Insert_Rchild(Thrt,p,stu_temp); cout<<"作为右子树插入成功"<<endl; } else { cout<<"选择无效,插入不成功"<<endl; } } else { cout<<"搜索的学生信息不存在,插入失败"<<endl; } break; case 5: cout<<"____欢迎进入写入文件单元____"<<endl; cout<<"现在将会将学生健康表中的数据全都写入一个文件中"<<endl; if(Stu_Heal.Write_Into_file()) cout<<"写入成功"<<endl; else cout<<"写入失败"<<endl; break; case 6: cout<<"____欢迎进入读取文件内容单元____"<<endl; cout<<"现在将读取文件中的所有内容并显示出来"<<endl; if(Stu_Heal.Read_From_file()) cout<<"读取成功"<<endl; else cout<<"读取失败"<<endl; break; case 7: cout<<"____欢迎进入遍历单元____"<<endl; cout<<"请选择遍历方式:"<<endl; cout<<"****************************"<<endl; cout<<"* 1:中序遍历 2:层次遍历 *"<<endl; cout<<"****************************"<<endl; cin>>flag2; if(flag2 == 1) { cout<<"学生健康表的中序遍历序列"<<endl; Stu_Heal.InOrder_Traverse(Thrt); cout<<endl; } else if(flag2 == 2) { cout<<"学生健康表的层次遍历序列"<<endl; Stu_Heal.LevelOrder_Traverse(Thrt); cout<<endl; } break; case 8: cout<<"谢谢使用,88"<<endl; break; default: cout<<"选择的操作无效,重新选择"<<endl; } }while(flag != 8); return 0; }
***************************************************** 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:1 ____欢迎进入新建学生健康表单元____ 选择你要新建健康表的方式(如果输入非1也非2的,默认使用第一种建立方式) ***************************************** * 1:先序建立 2:通过数组,层次建立 * ***************************************** 输入你的选择:1 输入学生的学号(输入000表示空):2010 输入学生的姓名:wanglo 输入学生性别:man 输入学生的出生年月日:1991-02-27 输入学生的健康状况:good 输入学生的学号(输入000表示空):2011 输入学生的姓名:pipi 输入学生性别:woman 输入学生的出生年月日:1991-11-11 输入学生的健康状况:good 输入学生的学号(输入000表示空):000 输入学生的学号(输入000表示空):2013 输入学生的姓名:xuxuxu 输入学生性别:man 输入学生的出生年月日:1993-05-12 输入学生的健康状况:bad 输入学生的学号(输入000表示空):000 输入学生的学号(输入000表示空):000 输入学生的学号(输入000表示空):2012 输入学生的姓名:lalala 输入学生性别:woman 输入学生的出生年月日:1992-12-12 输入学生的健康状况:good 输入学生的学号(输入000表示空):000 输入学生的学号(输入000表示空):000 对二叉树进行中序线索化 二叉树线索化 完成~~ 初始化学生健康表完成 **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:7 ____欢迎进入遍历单元____ 请选择遍历方式: **************************** * 1:中序遍历 2:层次遍历 * **************************** 1 学生健康表的中序遍历序列 ------------------------------------- 学生信息如下: 学号:2011 姓名:pipi 性别:woman 出生日期:1991-11-11 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2013 姓名:xuxuxu 性别:man 出生日期:1993-05-12 健康状况:bad ------------------------------------- ------------------------------------- 学生信息如下: 学号:2010 姓名:wanglo 性别:man 出生日期:1991-02-27 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2012 姓名:lalala 性别:woman 出生日期:1992-12-12 健康状况:good ------------------------------------- **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:7 ____欢迎进入遍历单元____ 请选择遍历方式: **************************** * 1:中序遍历 2:层次遍历 * **************************** 2 学生健康表的层次遍历序列 ------------------------------------- 学生信息如下: 学号:2010 姓名:wanglo 性别:man 出生日期:1991-02-27 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2011 姓名:pipi 性别:woman 出生日期:1991-11-11 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2012 姓名:lalala 性别:woman 出生日期:1992-12-12 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2013 姓名:xuxuxu 性别:man 出生日期:1993-05-12 健康状况:bad ------------------------------------- * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:2 输入你要查询的学生的学号:2014 搜索的学生资料不存在 **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:2 输入你要查询的学生的学号:2012 搜索成功,该学生的基本信息如下: ------------------------------------- 学生信息如下: 学号:2012 姓名:lalala 性别:woman 出生日期:1992-12-12 健康状况:good ------------------------------------- **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:4 输入要插入的新学生的基本信息: 学号 姓名 性别 生日 健康状况 2014 hoho man 1995-12-25 good 输入想插入在哪个学生之后,输入该学生的学号:2012 搜索成功,选择插入的位置: ******************************************** * 1: 作为左子树插入 2:作为右子树插入 * ******************************************** 1 作为左子树插入成功 **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:7 ____欢迎进入遍历单元____ 请选择遍历方式: **************************** * 1:中序遍历 2:层次遍历 * **************************** 1 学生健康表的中序遍历序列 ------------------------------------- 学生信息如下: 学号:2011 姓名:pipi 性别:woman 出生日期:1991-11-11 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2013 姓名:xuxuxu 性别:man 出生日期:1993-05-12 健康状况:bad ------------------------------------- ------------------------------------- 学生信息如下: 学号:2010 姓名:wanglo 性别:man 出生日期:1991-02-27 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2014 姓名:hoho 性别:man 出生日期:1995-12-25 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2012 姓名:lalala 性别:woman 出生日期:1992-12-12 健康状况:good ------------------------------------- **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:5 ____欢迎进入写入文件单元____ 现在将会将学生健康表中的数据全都写入一个文件中 按照层次遍历的顺序写入文件 写入成功 **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:3 输入你要删除的学生的学号:2013 删除的学生信息如下: ------------------------------------- 学生信息如下: 学号:2013 姓名:xuxuxu 性别:man 出生日期:1993-05-12 健康状况:bad ------------------------------------- **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:7 ____欢迎进入遍历单元____ 请选择遍历方式: **************************** * 1:中序遍历 2:层次遍历 * **************************** 1 学生健康表的中序遍历序列 ------------------------------------- 学生信息如下: 学号:2011 姓名:pipi 性别:woman 出生日期:1991-11-11 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2010 姓名:wanglo 性别:man 出生日期:1991-02-27 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2014 姓名:hoho 性别:man 出生日期:1995-12-25 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2012 姓名:lalala 性别:woman 出生日期:1992-12-12 健康状况:good ------------------------------------- **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:7 ____欢迎进入遍历单元____ 请选择遍历方式: **************************** * 1:中序遍历 2:层次遍历 * **************************** 2 学生健康表的层次遍历序列 ------------------------------------- 学生信息如下: 学号:2010 姓名:wanglo 性别:man 出生日期:1991-02-27 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2011 姓名:pipi 性别:woman 出生日期:1991-11-11 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2012 姓名:lalala 性别:woman 出生日期:1992-12-12 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2014 姓名:hoho 性别:man 出生日期:1995-12-25 健康状况:good ------------------------------------- **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:6 ____欢迎进入读取文件内容单元____ 现在将读取文件中的所有内容并显示出来 下面将读取文件中的内容并显示 ------------------------------------- 学生信息如下: 学号:2010 姓名:wanglo 性别:man 出生日期:1991-02-27 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2011 姓名:pipi 性别:woman 出生日期:1991-11-11 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2012 姓名:lalala 性别:woman 出生日期:1992-12-12 健康状况:good ------------------------------------- ------------------------------------- 学生信息如下: 学号:2013 姓名:xuxuxu 性别:man 出生日期:1993-05-12 健康状况:bad ------------------------------------- ------------------------------------- 学生信息如下: 学号:2014 姓名:hoho 性别:man 出生日期:1995-12-25 健康状况:good ------------------------------------- 读取成功 **************************************************** * 欢迎进入学生健康状况管理系统 * * 1:新建学生健康表 2:按学号查询学生信息 * * 3:删除指定学生信息 4:插入新学生信息 * * 5:向文件中写入学生信息 6:从文件中读取学生信息 * * 7:输出目前全部学生信息 8:退出 * **************************************************** 请输入你的选择:8 谢谢使用,88 Press any key to continue