纵使疾风来,人生不言弃
大家好!我是Cx_330
本篇博客是用c语言实现的用单链表的形式实现一个简单的学生管理系统,基本涵盖的单链表的所有相关的基础操作,希望对正在用c语言学习链表那一章节的人有所帮助,同时自己也回顾一下单链表的相关操作
实现内容
1.利用单链表建立学生基本信息表;
2.浏览每个学生的信息;
3.根据学号查询某个学生的基本信息;
4.添加学生信息到单链表中;
5、删除一个学生的信息。
实现代码
头文件源码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int ElemType;
typedef struct Student_List{
ElemType Id_num;
ElemType age;
char name[20];
struct Student_List* next;
} Student_List, * stu;
void menu();
stu InitList();
void Creat_StudentInfo(stu s);
void Show_StudentInfo(stu s);
void Add_Student(stu s);
void Find_StudentInfo(stu s);
void Del_StudentInfo(stu s);
功能实现源码
#include"LinkList.h"
void menu()
{
printf("\n############################################\n");
printf(" 1.建立学生基本信息 \n");
printf(" 2.浏览学生基本信息 \n");
printf(" 3.根据学号查询信息 \n");
printf(" 4.添加学生基本信息 \n");
printf(" 5.删除学生基本信息 \n");
printf("############################################\n");
}
stu InitList() {
stu s = (stu)malloc(sizeof(Student_List));
if (s) {
s->next = NULL;
return s;
}
else {
printf("malloc fail...\n");
exit(-1);
}
}
void Creat_StudentInfo(stu s) {
stu r = s;
int count;
int num;
int age;
char arr[20];
printf("请输入要初建的学生个数 :");
scanf("%d",&count);
while (count--) {
printf("\n请输入学号信息 :");
scanf("%d",&num);
printf("请输入要添加学生信息的姓名 :");
scanf("%s",arr);
printf("请输入要添加学生信息的年龄 :");
scanf("%d", &age);
stu ptr = (stu)malloc(sizeof(Student_List));
ptr->next = NULL;
ptr->Id_num = num;
ptr->age = age;
strcpy(ptr->name,arr);
if (!r) {
r = ptr;
}
else {
stu x = r;
while (x->next) {
x = x->next;
}
x->next = ptr;
}
}
printf("初始化成功.\n");
}
void Show_StudentInfo(stu s) {
stu r = s->next;
while (r) {
printf("%d %s %d\n",r->Id_num,r->name,r->age);
r = r->next;
}
}
void Add_Student(stu s) {
int num;
char arr[20];
int age;
printf("请输入要添加学生信息的学号 :");
scanf("%d",&num);
printf("请输入要添加学生信息的年龄 :");
scanf("%d", &age);
printf("请输入要添加学生信息的姓名 :");
scanf("%s",arr);
stu x = (stu)malloc(sizeof(Student_List));
x->next = NULL;
x->Id_num = num;
x->age = age;
strcpy(x->name,arr);
stu p = s->next,pro=s;
while (p && p->Id_num < num) {
pro = p;
p = p->next;
}
if (!p) {
pro->next = x;
}
else {
x->next = p;
pro->next = x;
printf("添加成功\n");
}
}
void Find_StudentInfo(stu s) {
stu ptr=s->next;
int num;
printf("请输入要查询学生的学号 :");
scanf("%d",&num);
while (ptr) {
if (ptr->Id_num == num) {
break;
}
ptr = ptr->next;
}
if (!ptr) {
printf("\n查询失败.\n");
}
else {
printf("\n查询成功.\n该学生的学号为 :%d\n",ptr->Id_num);
}
}
void Del_StudentInfo(stu s)
{
stu ptr = s->next,pro=s;
int num;
printf("请输入要删除学生的学号 :");
scanf("%d",&num);
while (ptr && ptr->Id_num != num) {
pro = ptr;
ptr = ptr->next;
}
if (ptr == NULL) {
printf("删除失败\n");
return;
}
else {
pro->next = ptr->next;
free(ptr);
ptr = NULL;
printf("删除成功.\n");
}
}
main函数实现源码
#include"LinkList.h"
int main()
{
int input;
stu s = InitList();
do
{
menu();
printf("请输入一个选项 :");
scanf("%d",&input);
switch (input)
{
case 1:
Creat_StudentInfo(s);
break;
case 2:
Show_StudentInfo(s);
break;
case 3:
Find_StudentInfo(s);
break;
case 4:
Add_Student(s);
break;
case 5:
Del_StudentInfo(s);
break;
default :
printf("输入错误,请重新输入一个合理的选项\n");
break;
}
} while (input);
return 0;
}
实现过程中遇到的问题
我当时赋值学生姓名的时候是直接使p->name=St_name;在添加学生的姓名的时候开始我一直采用这种方法,但是当我遍历的时候发现姓名全部都是最后一次输入的姓名。就像这样。
- 解决方案
我当时调试的时候发现开始的时候输入 李四,王五的时候都还对,
但是当我输入张三的时候发现前两个名字都变为张三了。
然后我意识到我每次输入的时候都是让p->name=St_name,St_name
没有改变所以每次输入后以前的名字也都被赋值成一样的了。
通过思考,我想到一个方法,就是通过使用strcpy()这个赋值函数
进行姓名的赋值。strcpy(p->name,St_name)这样的话就是把每次的
姓名直接拷贝给结点里面的信息了。这样的话就不会出现姓名重叠的现象了
实现效果
总结
通过这个简单的学生信息管理的实现,可以增加我们对单链表基础相关的知识,对于我自己来说,当时遇到的那个学生赋值的那个问题,刚开始的时候不知道是怎么回事,自己简单的以为只需要 scanf(“%s”,p->name);就可以了。但是没有考虑到要是不拷贝的话,arr的最后改变会直接影响到前面所有学生的姓名的。我觉得这个小点对我自己的收获挺大的。希望也对其他小伙伴有帮助!
但凡不能杀死你的,最终都会试你变得更强大!
OK!
以上就是本篇博客的所有内容了。
看到最后的小伙伴给个素质三连吧😄😄😄
同时在这里给自己打个气!!!
希望明天的体测发挥出自己真正的实力!!!
争取冲向80+!
勇夺国奖!
加油!