学生信息管理小程序(线索二叉树实现)

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

//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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值