//頭文件 #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; }