C语言基础篇02:单链表实现学生成绩管理系统

前言

	上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手。
详细讲解下如何在原来单链表的基础上实现一个简单的管理系统。
	上篇文章入口:[单链表的实现](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;

详细设计

增加成绩信息

	一般情况下,学生的学号都会是唯一的,或者也可以以姓名作为唯一,
当然这个牵扯到详细的设计。在一般情况下我们都知道,姓名可能重复,但是
在学校里学号应该是唯一的,所以我们以学生的学号作为主键,那么我们就知道,当
学号重复的时候,当前数据就不应该被插入了,于是我们有了下面两段代码
// An highlighted block
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;
}

删除成绩信息

	删除成绩信息也就是删除单链表内,符合条件的某个节点,那么一般我们会提供
一个条件作为删除的,在这里我是以学号作为删除条件
// An highlighted block
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:这里有个地方要注意,结构体可以用=号进行赋值,但是如果是数组的话不可以直接
赋值,要用具体的拷贝函数。
// An highlighted block
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;
}

查询学生信息和浏览学生信息

	这两个放到一起来说,其实两个功能没有本质上的区别,都是对单链表的遍历。查询顾名思义,根据某种条件
查找符合条件的学生信息进行打印。浏览则是把每一个学生成绩信息都打印出来
// An highlighted block
void SelectSocreForID(char *id)//查询学号为xx的成绩信息
{
	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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值