//头文件
#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;
}
原文链接: https://www.cnblogs.com/shenji/p/12640295.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/195418
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!