zoukankan      html  css  js  c++  java
  • 链表实现学生健康信息管理系统(简略版)

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


  • 相关阅读:
    underscore utility
    underscore objects
    underscore functions
    underscore arrays
    underscore collections
    underscore概况
    in操作符
    类数组对象 实参对象arguments
    JAVA和C++的区别
    MySQL学习笔记(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
  • 原文地址:https://www.cnblogs.com/Guhongying/p/7617058.html
Copyright © 2011-2022 走看看