C++ 定义一个学生类,并实现增删改查

//头文件
#ifndef  STUDENT_H
#define STUDENT_H
#include <string>
#include <iostream>
using namespace  std;
class Student  
{
private:
    int id;    //ID
    char* name; //姓名
    int yuwen; //语文
    int shuxue;//数学
public:
    Student();                        //构造成员
    ~Student();                        //析构成员
    Student(int id, char* name, int yuwen, int shuxue);
    void Set_id(int id);            //设置id
    void Set_name(char* name);        //设置姓名
    void Set_yuwen(int yuwen);        //设置语文成绩
    void Set_shuxue(int shuxue);    //设置数学成绩
    int return_id();                //返回id
    char* return_name();            //返回姓名
    int return_yuwen();                //返回语文成绩
    int return_shuxue();            //返回数学成绩
    Student* next;                    //定义一个类成员指向下一个类成员
};

struct StudentData
{
    int listsize;                    //存放成员的个数                                                                
    Student* m_head;                //定义一个student的头节点
};

Student* Student_Link(StudentData* list, Student *other);                                            //成员添加
Student* Student_Delete(StudentData* list);                                                            //成员删除
Student* Student_Select(StudentData* list);                                                            //成员查找
Student* Student_Set(StudentData* list);                                                            //成员修改
Student* Student_Show(StudentData* list);                                                           //成员遍历
                                                                                                   

#endif


//cpp文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <stdlib.h>
#include <string.h>
#include "Student.h"
using namespace std;

Student::Student()                        //构造成员
{
    id = yuwen = shuxue = NULL;
    name = new char[50+1];
    name = NULL;
}
Student::~Student()                        //析构成员
{
    delete []name;

}
Student::Student(int m_id, char* m_name, int m_yuwen, int m_shuxue)
{
    this->id = m_id;
    name = new char[50];
    strcpy(this->name,m_name);
    this->yuwen = m_yuwen;
    this->shuxue = m_shuxue;
    printf("学生信息创建成功!\n");
}
void Student::Set_id(int m_id)            //设置id
{
    this->id = m_id;
}
void Student::Set_name(char*  m_name)        //设置姓名
{
    strcpy(this->name, m_name);
}
void Student::Set_yuwen(int m_yuwen)        //设置语文成绩
{
    this->yuwen = m_yuwen;
}
void Student::Set_shuxue(int m_shuxue)    //设置数学成绩
{
    this->shuxue = m_shuxue;
}
int Student::return_id()                //返回id
{
    return id;
}
char* Student::return_name()            //返回姓名
{
    return name;
}
int Student::return_yuwen()                //返回语文成绩
{
    return yuwen;
}
int Student::return_shuxue()            //返回数学成绩
{
    return shuxue;
}

//成员添加
Student* Student_Link(StudentData* list, Student *other)      //成员添加 从头部添加
{
    //Student* temp = list->m_head;
    other->next = list->m_head->next;
    list->m_head->next = other;
    list->listsize++;
    return list->m_head;
}
//成员删除
Student* Student_Delete(StudentData* list)                
{
    if (list->listsize == 0)
    {
        printf("空数据\n");
        return list->m_head;
    }
    Student* cur = list->m_head->next;   //定义一个指针指向下一个成员
    Student* pre = list->m_head;        //定义一个指针指向上一个成员

    int mode;//定义删除的内容  1为姓名 ,2为学号
    cout <<"请输入要删除的条件,1为学号,2为姓名,请输入1或者2,输入其他则直接退出:";
    cin >> mode;
    switch (mode)
    {
    case 1:
        int id;
        cout << "请输入要删除的学生id:";
        cin >> id;
        while (cur != NULL)
        {
            if (cur->return_id() == id)
            {
                pre->next = cur->next;             //将上一个节点和下一个节点连接  
                delete cur;                       //将节点释放
                list->listsize--;                    //存储的数据个数减1
                cur = NULL;                            //将指针指向空,防止野指针
                cout << "删除成功\n";
                return list->m_head;
            }
            pre = cur;                                
            cur = cur->next;
        }
        return list->m_head;
    case 2:
        char name[50];
        cout << "请输入要删除的姓名:";
        cin >> name;
        while (cur != NULL)
        {
            if (strcmp(cur->return_name(),name)==0)
            {
                pre->next = cur->next;  //将上个节点的next指向下个节点的next;
                delete cur;
                list->listsize--;
                cur = NULL;   //将指针指向空,防止野指针
                cout << "删除成功\n";
                return list->m_head;
            }
            pre = cur;
            cur = cur->next;
        }
        printf("找不到该学生!\n");
        return list->m_head;
    default:
        printf("输入错误,已退出!");
        return list->m_head;
        break;
    }    
}

//成员查找
Student*  Student_Select(StudentData* list)                        
{
    if (list->listsize == 0)  //判断存放数据的个数是否为0
    {
        printf("空表\n");
        return list->m_head;
    }
    Student*  temp = list->m_head->next;     //定义一个临时指针指向头节点的下一个节点并遍历链表,默认第一个头节点不打印

    int mode;//定义删除的内容  1为姓名 ,2为学号
    cout << "请输入要查找的条件,1为学号,2为姓名,请输入1或者2,输入其他则直接退出:";
    cin >> mode;
    switch (mode)
    {

    case 1:
        int id;
        cout << "请输入要查找的学生id:";
        cin >> id;
        while (temp != NULL)
        {
            if (temp->return_id() == id )
            {
                cout << "找到啦! " << "该同学的语文成绩:" << temp->return_yuwen() << " 数学成绩:"  << temp->return_shuxue() << endl;
                return list->m_head;

            }
            temp = temp->next;

        }
        printf("找不到该学生!\n");
        return list->m_head;
        break;
    case 2:
        char name[50];
        cout << "请输入要查找的学生的姓名:";
        cin >> name;
        while (temp != NULL)
        {
            if (strcmp(temp->return_name(), name) == 0)
            {
                cout << "找到啦! " << "该同学的语文成绩:" << temp->return_yuwen() << " 数学成绩:" << temp->return_shuxue() << endl;
                return list->m_head;
            }
            temp = temp->next;
        }
        printf("找不到该学生!\n");
        return list->m_head;
    default:
        printf("输入错误,已退出!");
        return list->m_head;
        break;
    }

    cout << "没找到您要的数据\n";
    return list->m_head;

}

//成员修改
Student* Student_Set(StudentData* list)                                            
{

    //mode 1为语文 2为数学 
    if (list->listsize == 0)  //判断存放数据的个数是否为0
    {
        printf("空数据\n");
        return list->m_head;
    }
    int mode;//定义删除的内容  1为姓名 ,2为学号
    cout << "请输入要查找的条件,1为学号,2为姓名,请输入1或者2,输入其他则直接退出:";
    cin >> mode;
    Student*  temp = list->m_head->next;     //定义一个临时指针指向头节点的下一个节点并遍历链表,默认第一个头节点不打印
    switch (mode)
    {
    case 1:
    {
        int m_id;
        cout << "请输入要修改的学生id:";
        cin >> m_id;
        while (temp != NULL)
        {
            if (temp->return_id() == m_id)
            {
                int subject;//定义一个科目 1为语文 2为数学
                cout << "请确认要修改的科目成绩,1为语文 2为数学,输入错误则直接退出:";
                cin >> subject;
                if (subject == 1)
                {
                    int fenshu;
                    cout << "请输入要修改的分数(只能输入整数):";
                    cin >> fenshu;
                    temp->Set_yuwen(fenshu);
                    printf("成绩修改成功\n");
                    return list->m_head;

                }
                else if (subject == 2)
                {
                    int fenshu;
                    cout << "请输入要修改的分数(只能输入整数):";
                    cin >> fenshu;
                    temp->Set_shuxue(fenshu);
                    printf("成绩修改成功\n");
                    return list->m_head;
                }
                else
                {
                    cout << "输入有误,退出";
                    return list->m_head;
                    break;
                }
            }
            temp = temp->next;
        }
        cout << "未找到要修改的数据\n";
        return list->m_head;
    }
    case 2:
    {
        char* name = new char[50];
        cout << "请输入要修改的学生名称:";
        cin >> name;
        while (temp != NULL)
        {
            if (strcmp(temp->return_name(), name) == 0)
            {

                int subject;//定义一个科目 1为语文 2为数学
                cout << "请确认要修改的科目成绩,1为语文 2为数学,输入错误则直接退出:";
                cin >> subject;
                if (subject == 1)
                {
                    int fenshu;
                    cout << "请输入要修改的分数:";
                    cin >> fenshu;
                    temp->Set_yuwen(fenshu);
                    printf("成绩修改成功\n");
                    return list->m_head;

                }
                else if (subject == 2)
                {
                    int fenshu;
                    cout << "请输入要修改分数(只能输入整数):";
                    cin >> fenshu;
                    temp->Set_shuxue(fenshu);
                    printf("成绩修改成功\n");
                    return list->m_head;
                }
                else
                {
                    cout << "输入有误,退出\n";
                    break;
                }
            }
            temp = temp->next;

        }

        cout << "没找到您要的数据\n";
        return list->m_head;
    }
    default:
        printf("输入错误,已退出!");
        return list->m_head;
        break;
    }
    

}

//成员遍历
Student* Student_Show(StudentData *list)                          
{
    if (list==NULL||list->listsize == 0)  //判断存放数据的个数是否为0
    {
        printf("空表\n");
        return list->m_head;  
    }
    Student*  temp = list->m_head->next;     //定义一个临时指针指向头节点的下一个节点并遍历链表,默认第一个头节点不打印
    printf("%-16s%-16s%-16s%-16s\n", "学生id", "姓名", "语文成绩", "数学成绩");
    while (temp != NULL)
    {
        //打印成员,并将当前成员指针指向下一个成员节点
        
        printf("%-16d%-16s%-16d%-16d\n", temp->return_id(), temp->return_name(), temp->return_yuwen(), temp->return_shuxue());
        //cout << temp->return_id() << " " << temp->return_name() << " " << temp->return_shuxue() << " " << temp->return_yuwen() << endl;    
        temp = temp->next;
    }
    return list->m_head;
}
//初始化头节点
void  init_Student_Data_m_head(StudentData*  list)
{
    //动态申请一个头节点,并初始化,初始化后将头节点的next指向NULL, 数据成员的个数设置为0
    list->m_head = new Student;   
    list->listsize = 0;
    list->m_head->next = NULL;
}

//成员清空
StudentData* Free_Student(StudentData*  list)
{
    if (list->listsize == 0)  //判断存放数据的个数是否为0
    {
        printf("空表\n");
        return list;
    }
    Student*  temp = list->m_head->next;     //定义一个临时指针指向头节点的下一个节点并遍历链表,默认第一个头节点不打印
    

    while (temp != NULL)
    {
        //记录一个指针, 并遍历成员逐个释放,最后将指针置为NULL 防止野指针 保留头节点,头节点不用释放
        Student* pre = temp;
        *pre = *temp;
        temp = temp->next;
        delete pre;
        pre = NULL;
        list->listsize--; //空间大小减一
    }
    list->m_head->next = NULL;
    printf("数据清理完成,数据已清空\n");
    return list;
}

//初始化一个类
Student* init_Student()
{
    int id;
    char  name[50];
    int yuwen;
    int shuxue;
    cout << "请按顺序输入 学号、姓名、语文成绩、数学成绩,每输入一次按回车确认\n";
    cout << "学号(只能输入整数):";
    cin >> id;
    cout << "姓名:";
    cin >> name;
    cout << "语文成绩(只能输入整数):";
    cin >> yuwen;
    cout << "数学成绩(只能输入整数):";
    cin >> shuxue;
    Student* temp = new Student(id,name,yuwen,shuxue);
    return temp;
}
void play()
{
    printf("-------------------学生信息管理系统-----------------------\n");
    printf("1:初始化管理系统\n");
    printf("2:新增一个学生信息并录入\n");
    printf("3:删除一个学生信息\n");
    printf("4:查找一个学生的成绩\n");
    printf("5:修改一个学生的成绩\n");
    printf("6:清空所有学生信息\n");
    printf("7:打印所有学生信息\n");
    printf("8:退出系统\n");
    printf("------------------ 请输入您的选择1-8 -----------------------\n");

    StudentData *data = new StudentData;
    init_Student_Data_m_head(data);
    while (1)
    {
        int num;
        cout << "请输入指令(1-8),按回车确认:";
        cin >> num;
        switch (num)
        {
        case 1:
            //初始化头节点
            init_Student_Data_m_head(data);
            cout << " 当前指令,即将创建一个学生管理系统并初始化\n";
            printf("初始化学生管理系统成功!\n");
            cout << endl;
            break;
        case 2:
            //新增一个学生成员 并初始化
            cout << " 当前指令,即将添加一个学生成员\n";
            Student_Link(data, init_Student()); 
            cout << endl;
            break;
        case 3:
            //删除一个学生成员
            cout << " 当前指令,即将删除一个学生成员\n";
            Student_Delete(data);
            cout << endl;
            break;
        case 4:
            //查询某个成员的成绩
            cout << " 当前指令,即将查询一个学生成员的成绩\n";
            Student_Select(data);
            cout << endl;
            break;
        case 5:
            //修改某个成员的成绩
            cout << " 当前指令,即将修改一个学生成员的成绩\n";
            Student_Set(data);
            cout << endl;
            break;
        case 6:
            //清空所有学生数据
            cout << " 当前指令,即将删除所有数据\n";
            Free_Student(data);
            cout << endl;
            break;
        case 7:
            //打印所有学生数据
            cout << " 当前指令,打印所有成员数据\n";
            Student_Show(data);
            cout << endl;
            break;
        default:
            cout << "输入指令有误,请重新输入!" << endl;
            break;
        }
    }    
}

int main()
{
    play();
    return 0;
}

 

posted @ 2020-04-06 01:38  神迹丶  阅读(4662)  评论(0编辑  收藏  举报
网站已运行: