纯c语言链表实现学生信息管理系统.(你学会了吗?)

纵使疾风来,人生不言弃

                  大家好!我是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+!
勇夺国奖!
加油!
  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值