链表实现学生健康信息管理系统(简略版)

"Stdent.h"头文件

#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

//存放学生基本信息的结构体
struct stuData
{
string name;
string num;
string date;
string sex;
string condition;
};

//结点,含学生信息的数据域和结点的指针域
struct Node
{
stuData data;
Node *next;

Node(Node *ptr=NULL)
{
next=ptr;
}

Node(const stuData &item,Node *ptr=NULL)
{
data=item;
next=ptr;
}
};


//运算符重载
ostream &operator<<(ostream& out,stuData& stu1)
{
out<<"______________学生信息如下________________"<<endl;
out<<"学生的姓名是:"<<stu1.name<<endl;
out<<"学生的学号是:"<<stu1.num<<endl;
out<<"学生的出生日期是:"<<stu1.date<<endl;
out<<"学生的性别是:"<<stu1.sex<<endl;
out<<"学生的健康状态是:"<<stu1.condition<<endl;
return out;
}


istream &operator>>(istream& in,stuData stu2)
{
// cout<<"学生的姓名为:";
in>>stu2.name;
cout<<endl;
// cout<<"学生的学号为:";
in>>stu2.num;
cout<<endl;
// cout<<"学生的出生日期为:";
in>>stu2.date;
cout<<endl;
// cout<<"学生的性别为:";
in>>stu2.sex;
cout<<endl;
// cout<<"学生的健康状态为:";
in>>stu2.condition;
cout<<endl;
return in;
}

template <class T>
class Student
{
public:
Student();
~Student(); //析构函数
void CreatList(int n); //创建含有n个结点的链表
void Show(); //输出链表数据
void Clear(); //清空链表
void Search();
int GetSize();
void Swap(Node *p1,Node *p2);
void Sort();
void Delete();
void write();
void read();
void Check();


private:
Node *head;
int size;
};


//构造函数
template <class T>
Student<T>::Student()
{
head=new Node;
head->next=NULL;
int size=0; //是在这里初始化么?
// cout<<"这是一个未创建的链表;"<<endl<<endl;
}


//析构函数
template <class T>
Student<T>::~Student()
{
Clear();
}

//清空链表函数
template <class T>
void Student<T>::Clear()
{
Node *del;
while(head->next!=NULL)
{
del=head->next;
head->next=del->next;
delete del;
}
}


//计算链表的长度
template <class T>
int Student<T>::GetSize()
{
int count=0;
Node *p=head->next; //计算长度时不要把头结点也算入其中了
while(p)
{
count++;
p=p->next;

}
return count;
}


//创建链表函数

template <class T>
void Student<T>::CreatList(int n)
{
stuData D;
Node *current=head;
for(int i=1;i<=n;i++)
{
cout<<"___________________________"<<endl<<endl;
cout<<"|输入第"<<i<<"个学生的信息:"<<endl;
cout<<"|输入学生的姓名:";
cin>>D.name;
cout<<"|输入学生的学号:";
cin>>D.num;
cout<<"|输入学生的性别:";
cin>>D.sex;
cout<<"|输入学生的出生日期:(如:1999/09/10):";
cin>>D.date;
cout<<"|输入学生的健康状态:";
cin>>D.condition;
cout<<"____________________________"<<endl<<endl;
Node *p=new Node;
p->data=D;
current->next=p;
current=current->next;
}
}


//输出所有学生的信息
template <class T>
void Student<T>::Show()
{
Node *p=head->next;

if(p==NULL)
{
cout<<"这是一个空链表!"<<endl;
}
else
for(int i=1;i<=GetSize(),p!=NULL;i++) //可以将学生的信息按序输出
{

cout<<"信息库中第"<<i<<"个学生的信息为:"<<endl;
cout<<"_______________________________"<<endl;
cout<<"★学生的姓名是:"<<p->data.name<<endl;
cout<<"★学生的学号是:"<<p->data.num<<endl;
cout<<"★学生的性别是:"<<p->data.sex<<endl;
cout<<"★学生的出生日期为:"<<p->data.date<<endl;
cout<<"★学生的健康状态是:"<<p->data.condition<<endl;
cout<<"_______________________________"<<endl<<endl;
p=p->next;
}
// p=p->next;

}

//实现通过学号来查找学生信息
template<class T>
void Student<T>::Search()
{
string num1;
int sum=0; //用来计算已搜索链表的长度
cout<<"_____请输入你要查询的学号:______"<<endl;
cin>>num1;
Node *p=head->next;
if(p==NULL)
{
cout<<"对不起,信息库为空,无法查询!"<<endl;
}
else
{
while(p)
{
if(p->data.num==num1)
{
cout<<"******************************"<<endl;
cout<<"查找成功,你需要的学生信息如下:"<<endl;
cout<<"*******************************"<<endl;
cout<<"★学生的姓名是:"<<p->data.name<<endl;
cout<<"★学生的学号是:"<<p->data.num<<endl;
cout<<"★学生的性别是:"<<p->data.sex<<endl;
cout<<"★学生的出生日期为:"<<p->data.date<<endl;
cout<<"★学生的健康状态是:"<<p->data.condition<<endl;
cout<<"*******************************"<<endl<<endl;
break;
}
else p=p->next;
sum++;
}
}
if(sum==GetSize())
{
cout<<endl;
cout<<"**************************************************"<<endl;
cout<<"你要查找的学生信息不存在该信息库中,请核实后再操作;"<<endl;
cout<<"**************************************************"<<endl;
cout<<endl;
}
}

//交换两个结点的数据域
template<class T>
void Student<T>::Swap(Node *p1,Node *p2)
{
stuData temp;
temp=p1->data;
p1->data=p2->data;
p2->data=temp;
}


//实现由学号的大小对数据进行排序

template<class T>
void Student<T>::Sort()
{
Node *p=head->next;
for(int i=1;i<GetSize();i++)
{
if(p->data.num>p->next->data.num)
{
Swap(p,p->next);
}
p=p->next;
}
cout<<"***********************************"<<endl;
cout<<"排序成功,若要输出,请选择相应操作!"<<endl;
cout<<"***********************************"<<endl;
}

//删除某个结点信息
template<class T>
void Student<T>::Delete()
{
Node *p=head;
int sum=0; //用来记录链表的长度
string num1;
if(p==NULL)
{
cout<<"链表为空,不可执行删除操作!"<<endl;
}
else
{
cout<<"请输入你要删除的学号!"<<endl;
cin>>num1;
while(p)
{
if(p->next->data.num==num1)
{
Node *del=p->next;
p->next=del->next;
delete del;
break;
}
else

p=p->next;
sum++;
}

if(sum==GetSize())
{
cout<<"*******************************************"<<endl;
cout<<"该学生信息不存在于信息库中,请核实后再操作!:"<<endl;
cout<<"*******************************************"<<endl;
}
}
}

//从文件中读取数据
template <class T>
void Student<T>::write()
{
ifstream infile("File_2.dat");
if(!infile)
{
cerr<<"打开文件错误!"<<endl;
exit(1);
}
Node *p=head->next;
/*************************************************
int n=GetSize();
stuData *stu=new stuData[n];
for(int i=0;i<n;i++)
{
infile<<stu[i];
cout<<"读取数据成功!"<<endl;
p->data=stu[i];
cout<<p->data;

p=p->next;
}
***********************************************/
while(p)
{
infile>>p->data;
p=p->next;
}
cout<<"______________从文件中读取数据成功_________________"<<endl<<endl;;
Show();
infile.close();
}

//向文件中输入数据
template <class T>
void Student<T>::read()
{
ofstream outfile("File_2.dat");
if(!outfile)
{
cerr<<"打开文件错误!"<<endl;
exit(1);
}
Node *p=head->next;
/********************************
int n=GetSize();
stuData *stu=new stuData[n];
Node *p=head->next;

for(int i=0;i<GetSize(),p!=NULL;i++) //使用数组来
{
stu[i]=p->data;
outfile<<stu[i];
p=p->next;
}
*******************************/
while(p)
{

outfile<<p->data;
p=p->next;
}

outfile.close();
}


template <class T>
void Student<T>::Check()
{
Node *p=head->next;
Node *q;
for( p;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data.num==q->data.num)
{
cout<<"信息有重复,请确认是否有误!"<<endl;
cout<<"重复的学号是:"<<p->data.num<<endl;
break;
}
}
break;
}
// cout<<"信息无误,请继续操作!"<<endl;
}

#endif

student.cpp文件

#include "Student.h"
#include <ctime>

string GetTime()
{
time_t timep;
time (&timep);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",localtime(&timep) );
return tmp;
}

int menu()
{
cout<<endl<<endl;

cout<<"|_________________________________________________________________|"<<endl;
cout<<"|**_________________★欢迎访问学生信息管理系统★________________**|"<<endl;
cout<<"|** **|"<<endl;
cout<<"|__________________访问时间为:"<<GetTime()<<"_______________**|"<<endl;
cout<<"|_________________________________________________________________|"<<endl;
cout<<"|**_____________________请按照提示选择相关操作__________________**|"<<endl;
cout<<"|**【0】返回初始化菜单栏_____________________【1】建立学生信息库**|"<<endl;
cout<<"|** **|"<<endl;
cout<<"|**【2】输出所有学生信息_____________________【3】清空学生信息库**|"<<endl;
cout<<"|** **|"<<endl;
cout<<"|**【4】统计已有信息的量_____________________【5】按学号查找信息**|"<<endl;
cout<<"|** **|"<<endl;
cout<<"|**【6】退出信息管理系统_____________________【7】按学号删除信息**|"<<endl;
cout<<"|** **|"<<endl;
cout<<"|**【8】按学号对信息排序_____________________【9】检查信息正确性**|"<<endl;
cout<<"|** **|"<<endl;
cout<<"|**【w】向文件中写入信息_____________________【r】从文件读取信息**|"<<endl;
cout<<"|_________________________________________________________________|"<<endl;
cout<<"|**__________________欢迎再次使用学生信息管理系统_______________**|"<<endl;
return 0;
}

int main()
{
menu();
string op;
Student<int> stu;

while(1)
{
cin>>op;
if(op=="0")
{
cout<<"_________________________成功返回主操作菜单______________________"<<endl<<endl;
menu();
}

if(op=="1")
{
int n;
cout<<"______________________请输入的信息库的大小(n)__________________"<<endl<<endl;
cin>>n;
stu.CreatList(n);
cout<<"_______信息库创建成功,请继续选择操作_______"<<endl;

}

if(op=="2")
{
cout<<"______________以下输出信息库所有的学生信息_________________"<<endl;
stu.Show();
cout<<endl<<endl;
cout<<"____________________信息输出完毕,请继续选择操作_____________________"<<endl;
}

if(op=="3")
{
string ope;
cout<<"___________确定进行清空信息库操作?继续请按(y),返回菜单请按(n)___________"<<endl;
cin>>ope;
if(ope=="y")
{
stu.Clear();
cout<<"_______信息清除成功________"<<endl;
}

if(ope=="n")
{
menu();
}
if(ope!="n"&&ope!="y")
{
cout<<"错误操作!自动返回操作菜单"<<endl;
menu();

}
}

if(op=="4")
{
cout<<"_____________目前信息库中现有的学生信息数量为:"<<stu.GetSize()<<"______________"<<endl<<endl;
}
if(op=="5")
{
cout<<"_______________由学生学号查询其信息________________"<<endl;
stu.Search();
}
if(op=="6")
{
string str;
cout<<"________________确定退出学生信息系统?(Y/N)_________________"<<endl;
cin>>str;
if(str=="y")
{
exit(1);
}
if(str=="n")
{
cout<<"_____________自动返回操作菜单栏_______________"<<endl;
menu();
}
}

if(op=="7")
{
cout<<"_____________按学号删除学生的信息________________"<<endl;
stu.Delete();
}
if(op=="8")
{
cout<<"_____________由学号对学生信息进行排序_______________"<<endl;
stu.Sort();
}
if(op=="9")
{
stu.Check();
}


if(op=="w"||op=="W")
{
stu.read();
cout<<endl;
cout<<"______________向文件写入数据成功_______________"<<endl;
}
if(op=="r"||op=="R")
{
stu.write();
}

}
return 0;
}


原文地址:https://www.cnblogs.com/Guhongying/p/7617058.html