用二叉树来实现学生健康情况管理系统(2)

2018-12-08 20:30

void BSTree::inst(Sstudent el) {

BTreeNode *p;

p = sear(el.number); if (p != NULL )

cout<<\已找到 \ else {

p=new BTreeNode(el,NULL,NULL); inst(p,root); } }○1

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; }

5

else if(k == 1) {

pfather=p; p=p->rchild; } else

break; }

if (p == NULL ) {

cout<<\找不到该同学信息,删除失败!\ 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; }

//实例函数

6

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<<\请输入您要进行的操作:\

cout<<\向学生健康表插入学生信息\

<<\在健康表删除学生信息\

<<\在健康表中查询学生信息(按学生学号来进行查找)\

<<\在屏幕中输出全部学生信息\ <<\退出\

cin>>choice;

7

switch(choice) {

case 1:

s.input(); //输入学生信息 t.inst(s);

break; case 2:

cout<<\请输入要删除学生的学号: \ cin>>num;

p=t.deleteNode(num); if (p!=NULL) {

cout<<\删除成功!删除学生的信息为:\ p->getdata().output(); }

break; case 3:

cout<<\请输入要查询学生的学号: \ cin>>num;

p=t.sear(num); if (p!=NULL)

p->getdata().output(); else

cout<<\找不到该学生信息!\ break; case 4:

t.prnt(); break;

case 0: break;

default: cout<<\输入错误!请重新输入。\ }

cout<

return 0; }

【结果及结果分析】 1、插入学生信息:

8

插入后的二叉树为:

9


用二叉树来实现学生健康情况管理系统(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:市政道路PPP项目建设运营方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: