链表实现学生健康信息管理系统(简略版)
"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; }