您的位置:首页 > 其它

学生健康情况管理系统(单链表)

2011-09-20 12:25 369 查看
文件"sqlist.h"

//学生健康情况管理系统内部变量以及类的声明文件

class Stu_node;

//学生信息类
class student
{
public:
char num[20]; //学号
char name[20]; //姓名
char birthday[20]; //出生日期
char sex[10]; //性别
char healthy[10]; //健康状况
public:
student &operator = (student& e);
friend class Stu_node;
};

class Sq_list;

class Stu_node
{
public:
student elem;
Stu_node* next;
public:
Stu_node();
Stu_node(student e);
Stu_node &operator = (Stu_node e);
};

class Sq_list
{
private:
Stu_node* head; //头指针,指向头结点
Stu_node* tail; //尾指针,指向尾结点
void clean(); //清楚链表,保留头指针

public:

Sq_list();

~Sq_list();

Stu_node* Create(student d); //创建结点

bool empty(); //判断表是否为空

int length(); //计算表长

void Insert_front(Stu_node* p); //头插入

void Insert_rear(Stu_node* p); //尾插入

bool Insert(int pos,student d); //在第pos个结点后面插入

bool Search(char *newnum, Stu_node& d,int &pos); //按学号查找

bool Delete(int pos,Stu_node& d); //删除第pos个结点的信息

void Update(int pos,student d); //更新第pos个结点的信息

void Print(); //遍历链表

bool Write_to_file(); //信息写入文件

bool Read_from_file(); //读取文件信息

};

 

文件"sqlist.cpp"

//学生健康情况管理系统类的成员函数实现文件

#include "sqlist.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

student &student::operator = (student& e)
{
strcpy(num,e.num);
strcpy(name,e.name);
strcpy(birthday,e.birthday);
strcpy(sex,e.sex);
strcpy(healthy,e.healthy);
return *this;
}

Stu_node::Stu_node()
{
next=NULL;
}

Stu_node::Stu_node(student e)
{
elem=e;
next=NULL;
}

Stu_node &Stu_node::operator = (Stu_node e)
{
elem=e.elem;
next=e.next;
return *this;
}

Sq_list::Sq_list()
{
head=tail=new Stu_node();
}

Sq_list::~Sq_list()
{
clean();
delete head;
}

void Sq_list::clean()
{
//删除整条链,保留头结点
Stu_node* p=head->next;
while(p)
{
head->next=p->next;
delete p;
p=head->next;
}
}

Stu_node* Sq_list::Create(student d)
{
Stu_node* p=new Stu_node(d);
return p;
}

bool Sq_list::empty()
{
return (head->next==NULL);
}

int Sq_list::length()
{
int size=0;
Stu_node* p=head->next;
while(p)
{
size++;
p=p->next;
}
return size;
}

void Sq_list::Insert_front(Stu_node* p) //头插入
{
p->next=head->next;
head->next=p;
}

void Sq_list::Insert_rear(Stu_node* p) //尾插入
{
tail->next=p;
tail=p;
}

bool Sq_list::Insert(int pos,student d)
{
//在第pos个结点后面插入
if(pos<0 || pos>length())
{
cout<<"位置参数不合法"<<endl;
return false;
}

int i=1;
Stu_node* p=head->next;
Stu_node* temp=new Stu_node(d);

if(pos==0)
{
//在头结点后面插入
temp->next=head->next;
head->next=temp;
}
else
{
while(i<pos && p)
{
i++;
p=p->next;
}
temp->next=p->next;
p->next=temp;
}
return true;
}

bool Sq_list::Search(char *newnum, Stu_node& d,int &pos)
{
//根据学号在表中查询学生信息,查询到
//的信息由d来装载,该节点在表中位置由pos表示
if(this->empty())
{
cout<<"list is empty."<<endl;
return false;
}
pos=1;
Stu_node* p=head->next;
while(strcmp(p->elem.num,newnum)!=0 && p->next)
{
p=p->next;
pos++;
}
if(!p || strcmp(p->elem.num,newnum)!=0)
{
pos=-1;
return false;
}
d=*p;
return true;
}

bool Sq_list::Delete(int pos,Stu_node& d)
{
//删除第pos个结点,值由d来装载
if(pos<1 || pos>length())
{
cout<<"位置参数不合法"<<endl;
return false;
}
int i=1;
Stu_node* p=head->next;
if(pos==1)
{
head->next=p->next;
d=*p;
delete p;
return true;
}
while(i<pos-1)
{
i++;
p=p->next;
}
Stu_node *temp=p->next;
p->next=temp->next;
d=*temp;
delete temp;
return true;
}

void Sq_list::Update(int pos,student d)
{
//更新第pos个结点的信息
if(pos<1 || pos>length())
{
cout<<"位置参数不合法"<<endl;
return;
}
int i=1;
Stu_node* p=head->next;
while(i<pos)
{
i++;
p=p->next;
}
p->elem=d;
}

void Sq_list::Print()
{
if(this->empty())
{
cout<<"list is empty"<<endl;
return;
}
Stu_node* p=head->next;

cout<<"当前学生健康情况表的全部信息如下:"<<endl;
cout<<"num"<<setw(20)<<"name"<<setw(10)<<"Sex"
<<setw(15)<<"birthday"<<setw(13)<<"Healthy"<<endl;

while(p)
{
cout<<setw(10)<<p->elem.num<<setw(14)<<p->elem.name<<setw(9)<<p->elem.sex
<<setw(15)<<p->elem.birthday<<setw(10)<<p->elem.healthy<<endl;
p=p->next;
}
}

bool Sq_list::Write_to_file()
{
//信息写入文件
fstream file("data.txt",ios::out);

if(!file)
{
cout<<"文件打开失败"<<endl;
return false;
}

Stu_node* p=head->next;
while(p)
{
file<<setw(10)<<p->elem.num<<setw(20)<<p->elem.name<<setw(15)<<p->elem.sex
<<setw(20)<<p->elem.birthday<<setw(15)<<p->elem.healthy<<endl;
p=p->next;
}
return true;
}

bool Sq_list::Read_from_file()
{
//读取文件信息
fstream file("data.txt",ios::in);

if(!file)
{
cout<<"文件打开失败"<<endl;
return false;
}

char c[100];
while(!file.eof())
{
file.getline(c,sizeof(c));
cout<<c<<endl;
}

return true;
}


主函数"main.cpp"

//学生健康情况管理系统测试文件

#include "sqlist.h"
#include<iostream>
using namespace std;

int main()
{
int i,flag,n,pos,ins;
bool once=false;
student *s;
student member;
Stu_node stu,*p,e;
Sq_list sq;

do
{
cout<<"|------------------------------------------------|"<<endl;
cout<<"|         欢迎进入学生健康状况管理系统           |"<<endl;
cout<<"|1:新建学生健康表          2:插入新学生信息      |"<<endl;
cout<<"|3:删除指定学生信息        4:从文件中读取学生信息|"<<endl;
cout<<"|5:向文件中写入学生信息    6:按学号查询学生信息  |"<<endl;
cout<<"|7:输出目前全部学生信息    8:更新学生信息        |"<<endl;
cout<<"|9:退出                                          |"<<endl;
cout<<"|------------------------------------------------|"<<endl;

cout<<"请输入你的选择:";
cin>>flag;

switch(flag)
{
case 1:

if(once) //判断是否是第一次新建健康表
{
cout<<"新建已经完成,本程序不允许重新新建,请选择其他操作"<<endl;
goto lp;
}
cout<<"____欢迎进入新建学生健康表单元____"<<endl;
cout<<"注意:新建功能只可以进入一次,默认为尾插入模式"<<endl;
once=true;
cout<<"输入你要新建的学生健康表的大小:";
cin>>n;

s=new student
;

for(i=0;i<n;i++)
{
cout<<"输入第"<<i+1<<"个学生的基本信息"<<endl;
cout<<"学号 姓名 性别 生日 健康状况"<<endl;
cin>>s[i].num>>s[i].name>>s[i].sex>>s[i].birthday>>s[i].healthy;
p=sq.Create(s[i]);
sq.Insert_rear(p);
}

cout<<"初始化学生健康表完成"<<endl;
lp:			break;

case 2:

cout<<"____欢迎进入插入新的学生信息单元____"<<endl;
cout<<"输入你要插入的新的学生信息的学号:";
cin>>member.num;
if(sq.Search(member.num,e,pos))
{
cout<<"该学生的信息已在表中存在,不可以重复插入"<<endl;
cout<<"该学生基本信息如下:";
cout<<e.elem.num<<"  "<<e.elem.name<<"  "<<e.elem.sex<<"  "<<e.elem.birthday<<"  "<<e.elem.healthy<<endl;
}
else
{
cout<<"输入该学生剩余的信息(姓名 性别 生日 健康状况): "<<endl;
cin>>member.name>>member.sex>>member.birthday>>member.healthy;

cout<<"选择插入方式"<<endl;
ss:				cout<<"||||||||||||||||||||||||||||||||||||||||||||"<<endl;
cout<<"| 1:头插入      2:尾插入     3:指定位置插入|"<<endl;
cout<<"||||||||||||||||||||||||||||||||||||||||||||"<<endl;
cin>>ins;

switch(ins)
{
case 1:

p=sq.Create(member);
sq.Insert_front(p);
break;

case 2:

p=sq.Create(member);
sq.Insert_rear(p);
break;

case 3:

cout<<"输入要插入在第几个学生的后面: ";
cin>>pos;
if(sq.Insert(pos,member))
cout<<"插入成功"<<endl;
break;

default:
cout<<"输入错误,请从新输入你的选择"<<endl;
goto ss;
}
}
break;

case 3:

cout<<"____欢迎进入删除指定学生信息单元____"<<endl;
cout<<"输入你要删除的学生的学号:";
cin>>member.num;
if(sq.Search(member.num,e,pos))
{
if(sq.Delete(pos,e))
{
cout<<"删除成功,你删除的学生信息如下:"<<endl;
cout<<e.elem.num<<"  "<<e.elem.name<<"  "<<e.elem.sex<<"  "<<e.elem.birthday<<"  "<<e.elem.healthy<<endl;
}
}
else
{
cout<<"删除失败,你要删除的学生信息不存在"<<endl;
}
break;

case 4:

cout<<"____欢迎进入读取文件内容单元____"<<endl;
cout<<"现在将读取文件中的所有内容并显示出来"<<endl;
if(sq.Read_from_file())
cout<<"读取成功"<<endl;
else
cout<<"读取失败"<<endl;
break;

case 5:

cout<<"____欢迎进入写入文件单元____"<<endl;
cout<<"现在将会将学生健康表中的数据全都写入一个文件中"<<endl;
if(sq.Write_to_file())
cout<<"写入成功"<<endl;
else
cout<<"写入失败"<<endl;
break;

case 6:

cout<<"____欢迎进入查询单元____"<<endl;
cout<<"输入你要查询的学生的学号:";
cin>>member.num;
if(sq.Search(member.num,e,pos))
{
cout<<"查询成功___该学生的基本信息为:"<<endl;
cout<<e.elem.num<<"  "<<e.elem.name<<"  "<<e.elem.sex<<"  "<<e.elem.birthday<<"  "<<e.elem.healthy<<endl;
}
else
cout<<"查找失败____表中无该学生记录"<<endl;
break;

case 7:

cout<<"____欢迎进入输出学生信息单元____"<<endl;
sq.Print();
break;

case 8:

cout<<"____欢迎进入更新学生信息单元____"<<endl;
cout<<"输入你要更新的学生的学号:";
cin>>member.num;
if(sq.Search(member.num,e,pos))
{
cout<<"输入该学生的新的信息(姓名 性别 生日 健康状况): ";
cin>>member.name>>member.sex>>member.birthday>>member.healthy;
sq.Update(pos,member);
cout<<"更新成功"<<endl;
}
else
{
cout<<"输入的学生信息不存在,更新失败"<<endl;
}
break;

case 9:

cout<<"欢迎使用"<<endl;
break;

default:
cout<<"输入错误"<<endl;

}
}while(flag!=9);

return 0;
}


 

测试结果:

------------------------------------------------|
|         欢迎进入学生健康状况管理系统               |
|1:新建学生健康表          2:插入新学生信息          |
|3:删除指定学生信息        4:从文件中读取学生信息     |
|5:向文件中写入学生信息    6:按学号查询学生信息        |
|7:输出目前全部学生信息    8:更新学生信息             |
|9:退出                                           |
|------------------------------------------------|
请输入你的选择:1
____欢迎进入新建学生健康表单元____
注意:新建功能只可以进入一次,默认为尾插入模式
输入你要新建的学生健康表的大小:3
输入第1个学生的基本信息
学号 姓名 性别 生日 健康状况
20102100221 xiaoming male 1991-11-11 good
输入第2个学生的基本信息
学号 姓名 性别 生日 健康状况
20102100227 wangjiakai male 1991-02-12 good
输入第3个学生的基本信息
学号 姓名 性别 生日 健康状况
20102100001 xiaopizhu female 1991-12-25 good
初始化学生健康表完成
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:1
新建已经完成,本程序不允许重新新建,请选择其他操作
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:2
____欢迎进入插入新的学生信息单元____
输入你要插入的新的学生信息的学号:20102100001
该学生的信息已在表中存在,不可以重复插入
该学生基本信息如下:20102100001  xiaopizhu  female  1991-12-25  good
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:2
____欢迎进入插入新的学生信息单元____
输入你要插入的新的学生信息的学号:20102100111
输入该学生剩余的信息(姓名 性别 生日 健康状况):
xiaolong male 1994-11-21 bad
选择插入方式
||||||||||||||||||||||||||||||||||||||||||||
| 1:头插入      2:尾插入     3:指定位置插入|
||||||||||||||||||||||||||||||||||||||||||||
4
输入错误,请从新输入你的选择
||||||||||||||||||||||||||||||||||||||||||||
| 1:头插入      2:尾插入     3:指定位置插入|
||||||||||||||||||||||||||||||||||||||||||||
3
输入要插入在第几个学生的后面: 2
插入成功
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:7
____欢迎进入输出学生信息单元____
当前学生健康情况表的全部信息如下:
num                name       Sex       birthday      Healthy
20102100221      xiaoming     male     1991-11-11      good
20102100227    wangjiakai     male     1991-02-12      good
20102100111      xiaolong     male     1994-11-21       bad
20102100001     xiaopizhu   female     1991-12-25      good
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:4
____欢迎进入读取文件内容单元____
现在将读取文件中的所有内容并显示出来
20102100001              liudan         female          1991-03-03           goo
d
20102100227          wangjiakai           male          1991-02-27           goo
d

读取成功
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:5
____欢迎进入写入文件单元____
现在将会将学生健康表中的数据全都写入一个文件中
写入成功
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:4
____欢迎进入读取文件内容单元____
现在将读取文件中的所有内容并显示出来
20102100221            xiaoming           male          1991-11-11           goo
d
20102100227          wangjiakai           male          1991-02-12           goo
d
20102100111            xiaolong           male          1994-11-21            ba
d
20102100001           xiaopizhu         female          1991-12-25           goo
d

读取成功
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:6
____欢迎进入查询单元____
输入你要查询的学生的学号:201021000002
查找失败____表中无该学生记录
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:8
____欢迎进入更新学生信息单元____
输入你要更新的学生的学号:20102100001
输入该学生的新的信息(姓名 性别 生日 健康状况): lili female 1990-11-25 good
更新成功
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:7
____欢迎进入输出学生信息单元____
当前学生健康情况表的全部信息如下:
num                name       Sex       birthday      Healthy
20102100221      xiaoming     male     1991-11-11      good
20102100227    wangjiakai     male     1991-02-12      good
20102100111      xiaolong     male     1994-11-21       bad
20102100001          lili   female     1990-11-25      good
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:3
____欢迎进入删除指定学生信息单元____
输入你要删除的学生的学号:20102100227
删除成功,你删除的学生信息如下:
20102100227  wangjiakai  male  1991-02-12  good
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:7
____欢迎进入输出学生信息单元____
当前学生健康情况表的全部信息如下:
num                name       Sex       birthday      Healthy
20102100221      xiaoming     male     1991-11-11      good
20102100111      xiaolong     male     1994-11-21       bad
20102100001          lili   female     1990-11-25      good
|------------------------------------------------|
|         欢迎进入学生健康状况管理系统           |
|1:新建学生健康表          2:插入新学生信息      |
|3:删除指定学生信息        4:从文件中读取学生信息|
|5:向文件中写入学生信息    6:按学号查询学生信息  |
|7:输出目前全部学生信息    8:更新学生信息        |
|9:退出                                          |
|------------------------------------------------|
请输入你的选择:9
欢迎使用
Press any key to continue


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息