前言
上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手。
详细讲解下如何在原来单链表的基础上实现一个简单的管理系统。
上篇文章入口:[单链表的实现](https://blog.csdn.net/qq_39625143/article/details/121420507?spm=1001.2014.3001.5501)
需求分析
在各位同学的C语言入门课程中,很常见的会遇到各类管理系统的题目,
其实这些题目的要求大同小异,无外乎四个操作,增删改查。而在以后的工作中,
许多后端的工程师面里的最大的要求也就是增删改查。当然后面牵扯到大数据量的处理
数据库的优化等等...
那么一个简单的学生成绩管理系统应该具备或者说基本的功能应该有,
学生成绩的录入、查询、修改、删除、以及统计,其中可能还牵扯到读写文件。
那么在已知这个的条件下,比较适合作为点链表存储的内容应该是学生信息结构体
typedef struct STUDENTINOF
{
char id[BSIZE];
char name[BSIZE];
char major[BSIZE];
int C;
int computer;
int physics;
int atomic;
int optics;
}s_info;
typedef struct STUDENTNODE
{
s_info info;
struct STUDENTNODE * next;
}s_node;
详细设计
增加成绩信息
一般情况下,学生的学号都会是唯一的,或者也可以以姓名作为唯一,
当然这个牵扯到详细的设计。在一般情况下我们都知道,姓名可能重复,但是
在学校里学号应该是唯一的,所以我们以学生的学号作为主键,那么我们就知道,当
学号重复的时候,当前数据就不应该被插入了,于是我们有了下面两段代码
s_node * CreateNode(s_info data)
{
s_node * node = (s_node*)malloc(sizeof(s_node));
node->next = NULL;
node->info = data;
return node;
}
int FindStudent(char *id)
{
s_node * node = h_node->next;
while (node != NULL)
{
if (strcmp(node->info.id, id) == 0)
{
return 1;
}
node = node->next;
}
return 0;
}
int AddStudent(s_info info)
{
s_node * node = NULL;
if (FindStudent(info.id) == 1)return 0;
node = CreateNode(info);
node->next = h_node->next;
h_node->next = node;
return 1;
}
删除成绩信息
删除成绩信息也就是删除单链表内,符合条件的某个节点,那么一般我们会提供
一个条件作为删除的,在这里我是以学号作为删除条件
int DeleteINode(char *id)
{
s_node * node = h_node;
s_node * temp = NULL;
while (node->next != NULL)
{
if (strcmp(node->next->info.id, id) == 0)
{
temp = node->next;
node->next = temp->next;
free(temp);
return 1;
}
node = node->next;
}
return 0;
}
修改成绩信息
修改和删除类似,不过修改是不需要释放节点,只需要吧数据进行修改,所以可以先找到节点的指针,然后把修改后
的数据赋值给节点内当前数据。ps:这里有个地方要注意,结构体可以用=号进行赋值,但是如果是数组的话不可以直接
赋值,要用具体的拷贝函数。
int UpdateINode(s_info info)
{
s_node * node = h_node;
while (node->next != NULL)
{
if (strcmp(node->next->info.id, info.id) == 0)
{
node->next->info = info;
return 1;
}
node = node->next;
}
return 0;
}
查询学生信息和浏览学生信息
这两个放到一起来说,其实两个功能没有本质上的区别,都是对单链表的遍历。查询顾名思义,根据某种条件
查找符合条件的学生信息进行打印。浏览则是把每一个学生成绩信息都打印出来
void SelectSocreForID(char *id)
{
s_node * node = h_node->next;
while (node != NULL)
{
if (strcmp(node->info.id, id) == 0)
{
printf("学号:%s\n姓名:%s\n专业:%s\nC语言:%d\n计算物理学:%d\n大学物理:%d\n原子物理:%d\n光学:%d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);
return;
}
node = node->next;
}
printf("未查找到对应学生信息\n");
}
void SelectSocreForName(char *name)
{
s_node * node = h_node->next;
printf(" 学号\t\t 姓名 \t 专业\tC语言\t计算物理学\t大学物理\t原子物理\t光学\n");
while (node != NULL)
{
if (strcmp(node->info.name, name) == 0)
{
printf("%s\t%8s\t%6s\t%5d\t%10d\t%8d\t%8d\t%4d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);
}
node = node->next;
}
}
void SelectSocreForMajor(char *major)
{
s_node * node = h_node->next;
printf(" 学号\t\t 姓名 \t 专业\tC语言\t计算物理学\t大学物理\t原子物理\t光学\n");
while (node != NULL)
{
if (strcmp(node->info.major, major) == 0)
{
printf("%s\t%8s\t%6s\t%5d\t%10d\t%8d\t%8d\t%4d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);
}
node = node->next;
}
}
void SelectAllStudent()
{
s_node * node = h_node->next;
printf(" 学号\t\t 姓名 \t 专业\tC语言\t计算物理学\t大学物理\t原子物理\t光学\n");
while (node != NULL)
{
printf("%s\t%8s\t%6s\t%5d\t%10d\t%8d\t%8d\t%4d\n", node->info.id, node->info.name, node->info.major, node->info.C, node->info.computer, node->info.physics, node->info.atomic, node->info.optics);
node = node->next;
}
}
void SelectSocre(char *id, int subject)
{
s_node * node = h_node->next;
while (node != NULL)
{
if (strcmp(node->info.id, id) == 0)
{
switch (subject)
{
case 1:
printf("C语言成绩:%d\n", node->info.C);
return;
case 2:
printf("计算物理学成绩:%d\n", node->info.computer);
return;
case 3:
printf("大学物理成绩:%d\n", node->info.physics);
return;
case 4:
printf("原子物理成绩:%d\n", node->info.atomic);
return;
case 5:
printf("光学成绩:%d\n", node->info.optics);
return;
default:
return;
}
}
node = node->next;
}
printf("未查找到成绩信息\n");
}
void SelectSocreCount(char *id)
{
s_node * node = h_node->next;
while (node != NULL)
{
if (strcmp(node->info.id, id) == 0)
{
printf("总成绩:%d\n", node->info.C + node->info.computer + node->info.physics + node->info.atomic + node->info.optics);
}
node = node->next;
}
}
总结
以上就是对一个完整的操作单链表的管理系统,这里略去了界面录入这一块,需要的可以到我的csdn资源里下载,
也可以留下邮箱,博主给你们发送,总而言之希望这篇博文对朋友们的单链表学习有所帮助
资源地址[C语言学生成绩管理系统](https://download.csdn.net/download/qq_39625143/46722059)