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