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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM