单链表实现学生健康管理系统.docx
《单链表实现学生健康管理系统.docx》由会员分享,可在线阅读,更多相关《单链表实现学生健康管理系统.docx(14页珍藏版)》请在冰豆网上搜索。
![单链表实现学生健康管理系统.docx](https://file1.bdocx.com/fileroot1/2023-1/22/d770f7f5-a114-4f4e-bee7-4f336e9d89c1/d770f7f5-a114-4f4e-bee7-4f336e9d89c11.gif)
单链表实现学生健康管理系统
【综设实验题目】
实现学生健康情况管理的几个操作功能(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。
健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
实验内容
1.利用单链表来实现
2.系统的菜单功能项如下:
1------新建学生健康表
2------向学生健康表插入学生信息
3------在健康表删除学生信息
4------从文件中读取健康表信息
5------向文件写入学生健康表信息
6------在健康表中查询学生信息(按学生学号来进行查找)
7------在屏幕中输出全部学生信息
8-----退出
【中文摘要】这次实验主要用单链表来实现简单的学生健康管理系统,系统的功能包括:
向学生健康表插入学生信息,在健康表删除学生信息,从文件中读取健康表信息,向文件写入学生健康表信息,在健康表中查询学生信息(按学生学号来进行查找),在屏幕中输出全部学生信息等。
健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
【关键词】单链表学生健康管理系统学生信息
【前言】
本次实验是为了进一步熟悉和掌握VC环境下的编译、调试和执行的方法及步骤,熟悉单链表存储的实现方式及其应用。
【实验设计】
以单链表为储存机制,可以方便的实现插入或删除学生信息。
每个学生的信息储存在一个结构体Sstudent中,并且这个结构体带有输出学生信息的函数ouput()。
然后以这个结构体作为单链表节点的数据类型,这样就实现了学生信息的储存。
为了方便管理,将链表元素按学号的先后进行排序。
在创建单链表对象时将已存储在文件中的学生信息写入链表,在析构函数里实现将学生信息写入文件。
【实验实现】
软件平台:
VC++6.0
硬件平台:
32位机器
主要功能模块分析:
1、储存一个学生的信息:
/*******************************************************************
Sstudent.h文件
*******************************************************************/
#ifndef_Sstudent_h_
#define_Sstudent_h_
#include
usingnamespacestd;
structbirthday//出生日期
{
unsignedshortday;
unsignedshortmonth;
unsignedshortyear;
};
structSstudent//一个学生的基本信息
{
charnumber[12];//学号
charname[12];//名字
structbirthdaybd;//出生日期
chargender[4];//性别
charhealthcase[10];//健康情况
voidinput();//输入学生的基本信息
voidoutput();//输出学生的基本信息
};
voidSstudent:
:
input()//输入一个学生的信息
{
cout<<"请输入学生信息:
"<cout<<"请输入学生的学号:
";
cin>>number;
cout<<"请输入学生的名字:
";
cin>>name;
cout<<"请输入学生的性别:
";
cin>>gender;
cout<<"请输入学生生日的日期(年、月、日):
";
cin>>bd.year>>bd.month>>bd.day;
cout<<"请输入学生的健康情况(良好或差):
";
cin>>healthcase;
cout<}
voidSstudent:
:
output()//输出一个学生的信息
{
cout<<"学号:
"<<<"姓名:
"<<<"性别:
"<<<"生日:
"<<<"健康情况:
"<}
#endif
2、储存所有学生信息的链表类定义:
classLinkList
{
private:
Node*head;
intsize;
public:
LinkList();
~LinkList();
voidclear();//清空
Node*index(inti);//寻找指向第i个元素的指针
Sstudentgete(inti);//返回第i个元素
intleng();//求长度
intloct(charnum[]);//通过学号来查找
voidinst(Sstudent&el);//将el插入链表,同时保持链表的有序性
Sstudentdele(inti);//删除loc位置的数据元素
boolempt();//判断线性表是否为空
voidprint();//输出整个顺序表
};
3、用文件中的学生健康信息初始化链表
LinkList:
:
LinkList()
{
size=0;
head=newNode();
head->next=NULL;
Sstudents;
fstreamfile;
file.open("student.dat",ios:
:
in|ios:
:
binary);
if(!
file)
{
cerr<<"student.datcan'topen!
"<abort();
}
while
(1)
{
file.read((char*)&s,sizeof(s));
if(!
file)
break;
inst(s);
}
file.close();
}
4、将链表中的学生信息写进文件
LinkList:
:
~LinkList()
{
fstreamfile;
file.open("student.dat",ios:
:
out|ios:
:
binary);
if(!
file)
{
cerr<<"student.datcan'topen!
"<abort();
}
Node*p=head->next;
while(p!
=NULL)
{
file.write((char*)&(p->data),sizeof(p->data));
p=p->next;
}
file.close();
delete[]head;
}
5、向学生健康表插入学生信息
//功能为:
在带头结点的单链表中插入数据元素值为el的新结点,同时保持链表的有序性(升序);
voidLinkList:
:
inst(Sstudent&el)
{
Node*p=head;
while((p->next!
=NULL)
&&(strcmp(el.number,p->next->data.number)==1))//当el的学号大于p所指向元素的学号时
p=p->next;
Node*temp=newNode(el,p->next);
p->next=temp;
size++;
}
6、删除学生信息
/*
功能:
在单链表中删除第i个结点并返回该结点中的元素值.
形参:
传递一个整数i。
返回:
若由于i不合理而找不到相应的结点,则令el的生日的day为0,以作删除失败标志,同时返回el.
否则返回该结点中的元素值。
*/
SstudentLinkList:
:
dele(inti)
{
Sstudentel;
if((size==0)||(i<1)||(i>size))
{
cout<<"下标不合理!
(dele)"<el.bd.day=0;
}
else
{
Node*p=index(i-1);//指针p指向第i个结点的前驱结点。
Node*q=p->next;//指针q指向第i个结点。
el=q->getdata();//el保存第i个结点的数据。
p->setnext(q->next);
size--;
deleteq;
}
returnel;
}
7、在屏幕中输出全部学生信息
//输出链表
voidLinkList:
:
print()
{
Node*p=head->next;
while(p!
=NULL)
{
p->data.output();
p=p->next;
}
}
8、用户界面
/*******************************************************************
main.cpp文件
*******************************************************************/
#include
#include"LinkList.h"
#include"Sstudent.h"
#include"Node.h"
usingnamespacestd;
intmain()
{
LinkListlink;//新建一个链表:
link
Sstudents;
charnum[12];
intchoice=1;//将choice初始化,使其不为0.
while(choice)
{
cout<<"请输入您要进行的操作:
"<cout<<"1插入学生信息"<<<"2删除学生信息"<<<"3查询学生信息(按学生学号来进行查找)"<<<"4在屏幕中输出全部学生信息"<<<"0退出"<cin>>choice;
switch(choice)
{
case1:
s.input();//输入学生信息
link.inst(s);
break;
case2:
cout<<"请输入要删除学生的学号:
";
cin>>num;
s=link.dele(link.loct(num));
if(s.bd.day!
=0)//若s的day为0,则说明删除失败
s.output();
break;
case3:
cout<<"请输入要查询学生的学号:
";
cin>>num;
s=link.gete(link.loct(num));
if(s.bd.day!
=0)//若s的day为0,则说明查找失败
s.output();
break;
case4:
link.print();
break;
case0:
break;
default:
cout<<"输入错误!
请重新输入。
"<}
cout<}
return0;
}
【结果及结果分析】
1、插入学生信息:
2、删除学生信息:
如上图所示,当要删除的学生信息不存在时就会发出错误信号。
3、按学号查询学生信息:
如上图所示,当要查找失败时就会发出错误信号。
4、输出链表中所有的学生信息:
【参考文献】
、《数据结构—C++描述》朱振元朱承编著