数据结构再战—学生管理系统(链表)
学习思路
为了彻底掌握链表,我决定写一个用链表实现的学生管理系统,其中有链表的增删改查和显示菜单界面,当把这些链表常用的操作都练熟了之后再去对应的做一些题,就可以彻底掌握链表
代码:
#include <iostream>
#include <cstring>
using namespace std;
#define NO_Value 20
#define NAME_Value 11
typedef struct Student
{
char studentNo[NO_Value];
char studentName[NAME_Value];
} st;
typedef struct node
{
struct Student data;
struct node *next;
} Node, *Link;
void myMenu() //菜单界面
{
cout << "============================ 欢迎来到学生管理系统 ============================" << endl;
cout << "\t\t ----------------------------------------\n";
cout << "\t\t| |\n";
cout << "\t\t| 1.增加学生记录 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 2.删除学生记录 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 3.查找学生记录 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 4.修改学生记录 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 5.统计学生人数 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 6.显示学生记录 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 7.退出系统 |\n";
cout << "\t\t| |\n";
cout << "\t\t ----------------------------------------\n";
cout << "请输入您的选择: ";
}
void inputStudent(Link p) //每当要增加学生时便调用这个函数接收用户的输入
{
cout << "请输入学生的学号: ";
cin >> p->data.studentNo;
cout << "请输入学生的姓名: ";
cin >> p->data.studentName;
p->next = nullptr;
}
void inputStudentNo(char s[], char no[]) //每当要执行删除,修改和查询时便调用这个函数,接收用户输入的学号
{
cout << "请输入要" << s << "的学生学号:";
cin >> no;
}
bool addNode(Link head) //增加学生
{
Link p, q;
Link node;
node = new Node;
inputStudent(node); //调用这个函数接收用户输入要增加的学生的学号和姓名
q = head;
p = head->next;
if (head->next == nullptr)
{
head->next = node;
}
else
{
while (nullptr != p)
{
if (node->data.studentNo < p->data.studentNo)
{
q->next = node;
node->next = p;
return true;
}
else
{
q = p;
p = p->next;
}
}
q->next = node;
}
return true;
}
bool deleteNode(Link head) //删除学生
{
char no[NO_Value];
inputStudentNo("删除", no); //调用这个函数接收用户输入要删除的学生的学号
Link q = head;
Link p = head->next;
if (head == NULL || head->next == NULL)
{
return false;
}
while (p)
{
if (strcmp(p->data.studentNo, no) == 0)
{
q->next = p->next;
free(p);
cout << "删除成功!" << endl;
return true;
}
else
{
q = p;
p = p->next;
}
}
return false;
}
bool queryNode(Link head) //查找学生,通过学号查找
{
char no[NO_Value];
inputStudentNo("查找", no); //调用这个函数接收用户输入要查找的学生的学号
Link p = head->next;
if (head == NULL || head->next == NULL)
{
return false;
}
while (p)
{
if (strcmp(p->data.studentNo, no) == 0)
{
cout << "查找到学号 " << p->data.studentNo << " 学生的姓名为:" << p->data.studentName << endl;
return true;
}
else
{
p = p->next;
}
}
return false;
}
bool modifyNode(Link head) //修改学生
{
char no[NO_Value];
inputStudentNo("修改", no); //调用这个函数接收用户输入要修改的学生的学号
Link p = head->next;
if (head == NULL || head->next == NULL)
{
return false;
}
while (p)
{
if (strcmp(p->data.studentNo, no) == 0)
{
cout << "请输入你要修改" << p->data.studentNo << "学生的姓名: ";
cin >> p->data.studentName;
cout << "修改成功!" << endl;
cout << "修改后学号 " << p->data.studentNo << " 学生的姓名为: " << p->data.studentName << endl;
return true;
}
else
{
p = p->next;
}
}
return false;
}
int countNode(Link head) //统计学生人数
{
Link p;
int count = 0;
p = head->next;
while (p)
{
count++;
p = p->next;
}
return count;
}
void displayNode(Link head) //显示系统现有的所有学生,也就是遍历整个链表输出链表所存储的数据,要注意如果为空就不进行遍历
{
Link p = head->next;
if (!p)
{
cout << "学生管理系统为空!" << endl;
}
else
{
while (p)
{
cout << "学生学号:" << p->data.studentNo << "\t";
cout << "学生姓名:" << p->data.studentName << endl;
p = p->next;
}
}
}
void clearLink(Link head) //释放整个链表的空间
{
Link q, p;
q = head;
p = head->next;
while (p)
{
q->next = p->next;
free(p);
p = q->next;
}
free(q);
}
int main()
{
int select;
int count;
Link head;
head = new Node;
head->next = nullptr;
while (1)
{
//菜单页面
myMenu();
scanf("%d", &select); //接收用户的选择
switch (select)
{
case 1:
//增加学生
if (addNode(head))
{
cout << "插入成功!" << endl;
}
system("pause");
system("cls");
break;
case 2:
//删除学生
if (!deleteNode(head))
{
cout << "删除失败,没有要删除的学生信息!" << endl;
}
system("pause");
system("cls");
break;
case 3:
//查找学生
if (!queryNode(head))
{
cout << "查询失败,没有要查询的学生信息!" << endl;
}
system("pause");
system("cls");
break;
case 4:
//修改学生
if (!modifyNode(head))
{
cout << "修改失败,没有要修改的学生信息!" << endl;
}
system("pause");
system("cls");
break;
case 5:
//统计学生人数
count = countNode(head);
cout << "学生人数为: " << count << endl;
system("pause");
system("cls");
break;
case 6:
//显示现有学生
displayNode(head);
system("pause");
system("cls");
break;
case 7:
//释放所有链表空间,终止程序
clearLink(head);
return 0;
default:
cout << "输入不正确,应该输入1到7之间的数字" << endl;
system("pause");
system("cls");
break;
}
}
system("pause");
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 一生雾梦!
评论
ValineDisqus