用线索二叉树结构来构建一个学生信息管理系统,支持的操作的代码中会看到,主要的难点是线索二叉树的删除和插入操作,在以前有写过一篇线索二叉树的博客,里面有介绍线索二叉树的几本操作,但是当时没有写删除操作,线索二叉树。这次的代码中,加入了删除操作,我觉得也是整个程序里面的一个难点。主要是情况较多,要分每一种情况进行讨论,而且操作过程中,需要定位待删除节点的父节点。下面的代码有交详细解释,上代码
//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