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

"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;
}

 

posted @ 2017-10-01 13:17  一去二三浪里小白龙  阅读(1064)  评论(0编辑  收藏  举报
//增加一段JS脚本,为目录生成使用