宿舍管理查询软件.docx
《宿舍管理查询软件.docx》由会员分享,可在线阅读,更多相关《宿舍管理查询软件.docx(23页珍藏版)》请在冰豆网上搜索。
宿舍管理查询软件
软件综合课程设计
二叉排序树
宿舍管理查询软件
二〇一四年六月
题目1:
二叉排序树
1.问题描述
从一棵空树开始创建。
基本要求:
1.创建;
2.插入、查找、删除;
3.输出(先序、中序、后序)。
2.程序代码
#include
usingnamespacestd;
structBSTree
{
intdata;
BSTree*left;
BSTree*right;
};
//标记在插入时,如果已存在,则为true,表示不需要插入,否则为false
boolflag=false;
inta[100];
//查找操作
BSTree*search(BSTree*r,intx)
{
if(r==NULL)
returnNULL;
else
{
if(r->data==x)
returnr;
elseif(r->data>x)
returnsearch(r->left,x);
else
returnsearch(r->right,x);
}
}
//插入操作
BSTree*insert(BSTree*r,BSTree*s)
{
//首先查找树中是否已存在此节点
BSTree*p=search(r,s->data);
if(p==NULL)
{
if(r==NULL)
{
r=s;
}
elseif(s->datadata)
r->left=insert(r->left,s);
elseif(s->data>r->data)
r->right=insert(r->right,s);
}
else
flag=true;
returnr;
}
//建树
BSTree*createBSTree(BSTree*r,int*a,intn)
{
inti;
BSTree*t;
t=r;
for(i=0;i{
BSTree*s=(BSTree*)malloc(sizeof(BSTree));
s->data=a[i];
s->left=NULL;
s->right=NULL;
t=insert(t,s);
}
returnt;
}
BSTree*getFather(BSTree*r,BSTree*s)
{
BSTree*sf;
if(r==NULL||r==s)
sf=NULL;
else
{
if(s==r->left||s==r->right)
sf=r;
elseif(s->data>r->data)
sf=getFather(r->right,s);
else
sf=getFather(r->left,s);
}
returnsf;
}
//删除操作
BSTree*deleteNode(BSTree*r,BSTree*s)
{
//BSTNODE*temp,*tfather,*pf;
BSTree*temp,*father,*sf;
//pf=getfather(p,r);
sf=getFather(r,s);
//被删除结点是叶子结点,不是根结点
if(s->left==NULL&&s->right==NULL&&sf!
=NULL)
//
if(sf->left==s)
sf->left=NULL;
//
else
sf->right=NULL;
//被删除结点是叶子结点,又是根结点
elseif(s->left==NULL&&s->right==NULL&&sf!
=NULL)
r=NULL;
//
elseif(s->left==NULL&&s->right!
=NULL&&sf!
=NULL)
if(sf->left==s)
sf->left=s->right;
else
sf->right=s->right;
//被删除结点有右孩子,无左孩子.被删结点是根结点
elseif(s->left==NULL&&s->right!
=NULL&&sf==NULL)
r=s->right;
//被删结点有左孩子,无右孩子.被删结点不是根结点
elseif(s->left!
=NULL&&s->right==NULL&&sf!
=NULL)
if(sf->left==s)
sf->left=s->left;
else
sf->right=s->left;
//被删结点有左孩子,无右孩子.被删结点是根结点
elseif(s->left!
=NULL&&s->right==NULL&&sf==NULL)
r=s->left;
elseif(s->left!
=NULL&&s->right!
=NULL)
{
temp=s->left;
father=s;
//找出左子树最大的节点
while(temp->right!
=NULL)
{
father=temp;
temp=temp->right;
}//while
s->data=temp->data;
if(father!
=s)
father->right=temp->left;
else
father->left=temp->left;
}//elseif
if(r==NULL)
cout<<"删除之后,二叉排序树为空!
"<else
cout<<"删除成功!
"<returnr;
}
//前序输出
voidpreOrder(BSTree*r)
{
if(r==NULL)
return;
else
{
cout<data<<"";
preOrder(r->left);
preOrder(r->right);
}
}
//中序输出
voidinOrder(BSTree*r)
{
if(r==NULL)
return;
else
{
inOrder(r->left);
cout<data<<"";
inOrder(r->right);
}
}
//后序输出
voidpostOrder(BSTree*r)
{
if(r==NULL)
return;
else
{
postOrder(r->left);
postOrder(r->right);
cout<data<<"";
}
}
voidmenue()
{
cout<"<cout<<"1.插入(I/i)2.查找(S/s)"<cout<<"3.删除(D/d)4.先序输出(P/p)"<cout<<"5.中序输出(M/m)6.后序输出(L/l)"<cout<<"7.退出(E/e)"<cout<<"操作:
";
}
intmain(intargc,char*argv[])
{
cout<<"---------------------二叉排序树建立---------------------"<intcases;
cout<<"请输入案例个数:
";
cin>>cases;
while(cases--)
{
intn;
flag=false;
BSTree*root=NULL;
cout<";
cin>>n;
inti;
cout<"<for(i=0;icin>>a[i];
root=createBSTree(root,a,n);//建立二叉排序树
if(root!
=NULL)
cout<<"二叉排序树建立成功!
"<else
{
cout<<"二叉排序树建立失败!
"<return0;
}//else
cout<";
cout<data<menue();
chars;
cin>>s;
while
(1)
{
if(s=='E'||s=='e')
break;
elseif(s=='I'||s=='i')
{
cout<";
intx;
cin>>x;
BSTree*p=(BSTree*)malloc(sizeof(BSTree));
p->data=x;
p->left=NULL;
p->right=NULL;
root=insert(root,p);
if(flag==false)
cout<<"插入成功!
"<else
{
cout<<"此二叉树中已存在此值!
"<flag=false;//恢复原值
}
}
elseif(s=='S'||s=='s')
{
cout<";
intx;
cin>>x;
BSTree*p=search(root,x);
if(p==0)
{
cout<"<gotos1;
}
BSTree*pfather=getFather(root,p);
cout<<"查找的值为:
"<data<if(pfather!
=NULL)
cout<<"其父节点的值为:
"<data<else
cout<<"它是根节点,没有父节点!
"<if(p->left==NULL&&p->right==NULL)
cout<<"它是叶子节点,没有子节点"<else
{
if(p->left!
=NULL)
cout<<"其左儿子节点的值为:
"<left->data<else
cout<<"其左儿子节点为空!
"<if(p->right!
=NULL)
cout<<"其右儿子的值为:
"<right->data<else
cout<<"其右儿子节点为空!
"<}
}
elseif(s=='D'||s=='d')
{
cout<";
intvalue;
cin>>value;
cout<(Yy/Nn)";
charorder;
cin>>order;
while
(1)
{
if(order=='Y'||order=='y')
{
BSTree*node;
node=search(root,value);
if(node==NULL)
cout<"<else
BSTree*nodeDel=deleteNode(root,node);
break;
}//if(order=='Y'||order=='y')
elseif(order=='N'||order=='n')
{
break;
}
else
{
cout<"<cin>>order;
}
}
}
elseif(s=='P'||s=='p')
{
cout<"<preOrder(root);
cout<}//elseif(s=='P'||s=='p')
elseif(s=='M'||s=='m')
{
cout<"<inOrder(root);
cout<}//elseif(s=='M'||s=='m')
elseif(s=='L'||s=='l')
{
cout<"<postOrder(root);
cout<}//elseif(s=='L'||s=='l')
else
{
cout<"<}
s1:
menue();
cin>>s;
}//while
(1)
}//while(cases--)
return0;
}
3.运行结果
1)建立二叉树
2)插入元素
3)查找元素
4)删除元素
5)先序输出
6)中序输出
7)后序输出
题目2:
宿舍管理查询软件
1.问题陈述
为宿舍管理人员编写一个宿舍管理查询软件,要求:
(1)采用交互工作方式;
(2)建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序;
(3)查询菜单:
A.按姓名查询;B.按学号查询;C.按房号查询;
(4)打印任一查询结果(可以连续操作)。
2.需求分析
本程序的目的是为宿舍管理部门提供住宿生信息查询软件,管理人员可以根据学生的姓名、学号、宿舍房号进行相应查询。
查询操作如下:
(1)输入的形式和输入值的范围:
学生姓名、学号、三位数的宿舍房号;
(2)输出的形式:
输出所查询学生的姓名、学号以及宿舍房号;
(3)程序所能达到的功能:
查询住宿学生的信息。
3.概要设计
(1)头文件list.h
在list.h文件中定义了3个类,分别为:
student、seqlist以及factory。
a)student类定义的是学生的相关属性:
姓名(name),学号(number)和宿舍房号(room);
b)seqlist类定义的是相关操作函数:
存入学生信息的listinsert函数,按姓名进行查询的listnamerefer函数,按学号进行查询的listnumberrefer函数,按宿舍房号进行查询的listroomrefer函数;
c)print类则是用来输出全体学生信息的;
d)factory是seqlist的友元类,包括了search函数,进行查询方式的选择及相关函数的调用。
(2)list.cpp
在list.cpp中定义的是类的成员函数。
主要是各函数的相关操作。
(3)主文件main.cpp
main.cpp文件进行的是菜单的输出、查询动作继续或退出的选择,可以说是整个软件的入口与出口。
4.详细设计
(1)list.h
classstudent
{
public:
student();//构造函数
~student();//析构函数
stringname;
intnumber;
introom;
};
classseqlist
{
friendclassfactory;//factory是其友元类
public:
seqlist();
~seqlist();
voidlistinsert(student*t);
voidlistnamerefer(stringn);
voidlistnumberrefer(intn);
voidlistroomrefer(intn);
voidprint();
private:
liststulist;
};
classfactory
{
public:
factory();
~factory();
voidsearch(intx);
private:
seqlistL;
};
(2)list.cpp
student:
:
student()
{
name='\0';
number=0;
room=0;
}
seqlist:
:
seqlist()
{
}
seqlist:
:
~seqlist()
{
}
voidseqlist:
:
listinsert(student*t)
{
stulist.push_back(t);
}
//按姓名查询
voidseqlist:
:
listnamerefer(stringn)
{
list:
:
iteratoriter=stulist.begin();
while(iter!
=stulist.end())
{
if((*iter)->name==n)
{
cout<<"姓名:
"<<(*iter)->name<<""<<"学号:
"<<(*iter)->number<<""<<"宿舍号:
"<<(*iter)->room<}
else;
iter++;
}
}
//按学号查询
voidseqlist:
:
listnumberrefer(intn)
{
list:
:
iteratoriter=stulist.begin();
while(iter!
=stulist.end())
{
if((*iter)->number==n)
{
cout<<"姓名:
"<<(*iter)->name<<""<<"学号:
"<<(*iter)->number<<""<<"宿舍号:
"<<(*iter)->room<}
else;
iter++;
}
}
//按宿舍房号查询
voidseqlist:
:
listroomrefer(intn)
{
list:
:
iteratoriter=stulist.begin();
while(iter!
=stulist.end())
{
if((*iter)->room==n)
{
cout<<"姓名:
"<<(*iter)->name<<""<<"学号:
"<<(*iter)->number<<""<<"宿舍号:
"<<(*iter)->room<}
else;
iter++;
}
}
voidseqlist:
:
print()
{
list:
:
iteratoriter=stulist.begin();
while(iter!
=stulist.end())
{
cout<<"姓名:
"<<(*iter)->name<<""<<"学号:
"<<(*iter)->number<<""<<"宿舍号:
"<<(*iter)->room<iter++;
}
}
factory:
:
factory()//学生信息库
{
stringname[]={"赵一","钱二","孙三","李四","王五","吴六","张七","周八","刘九","郑十"};
intnumber[]={1,2,3,4,5,6,7,8,9,10};
introom[]={101,101,101,101,102,102,102,102,103,103};intnumber[]={1,2,3,4,5,6,7,8,9,10};
introom[]={101,101,101,101,102,102,102,102,103,103};
for(intj=0;j<10;j++)
{
student*pStudent=newstudent();
pStudent->name=name[j];
pStudent->number=number[j];
pStudent->room=room[j];
L.listinsert(pStudent);
}
}
factory:
:
~factory()
{}
voidfactory:
:
search(intx)//查询方式选择
{
switch(x)
{
case1:
{
cout<<"1.按姓名查询"<cout<<"2.按学号查询"<cout<<"3.按宿舍号查询"<cout<<"请选择您想要进行的操作:
";
inta;cin>>a;
switch(a)
{
case1:
{
cout<<"请输入需要查询学生的姓名:
";
stringb;cin>>b;
L.listnamerefer(b);
}
break;
case2:
{
cout<<"请输入需要查询学生的学号:
";
intb;cin>>b;
L.listnumberrefer(b);
}
break;
case3:
{
cout<<"请输入需要查询学生的宿舍号:
";
intb;cin>>b;
L.listroomrefer(b);
}
break;
default:
cout<<"您的输入有误!
"<}
}
break;
case2:
L.print();
break;
default:
cout<<"输入错误"<}
}
(3)main.cpp
voidmain()
{
cout<<"------------------------------------宿舍管理查询软件----------------------------"<factoryF;
intp;
do{
cout<<"********************************************************************************"<cout<<"1:
查询单个成员"<cout<<"2:
查看所有成员"<cout<<"********************************************************************************"<cout<<"请选择您想要进行的操作:
";
intx;
cin>>x;
F.search(x);
cout<<"继续请按1,退出请按0"<";
cin>>p;
}
while(p);
}
5.运行结果与测试
(1)查询单个学生的信息
按姓名查询:
按学号查询:
按宿舍号查询:
(2)查询所