C语言-学生管理系统源代码

一、学生管理系统算法分析(增删改查)

1.插入学生信息(需要具备数据结构基础)

建立头结点、建立新结点函数、建立新结点并插入数据

void InsertStudent() {//插入函数
	int x;
	struct Student S;
	printf("请输入学生的数目:");
	scanf("%d", &x);
	for (int i = 1; i <= x; i++) {
		printf("请分别输入第%d个同学姓名:\n",i);
		scanf("%s", &S.name);
		printf("请分别输入第%d个同学年龄:\n",i);
		scanf("%d", &S.age);
		printf("请分别输入第%d个同学电话:\n",i);
		scanf("%s", &S.tel);
		printf("请分别输入第%d个同学住址:\n",i);
		scanf("%s", &S.addr);
		CreatNodeList(StudentNode, S);
	}
}
struct Node* CreatNode() //建立头节点
{
	struct Node* HeadNode = (struct Node*)malloc(sizeof(struct Node));
	HeadNode->Next = NULL;
	return HeadNode;
}
struct Node* CreatNewNode(struct Student data) 
{//建立新结点函数
	struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));
	NewNode->data = data;
	NewNode->Next = NULL;
	return NewNode;
}
void CreatNodeList(struct Node* HeadNode, struct Student data) 
{//建立新节点并插入数据
	struct Node* NewNode = CreatNewNode(data);
	NewNode->Next = HeadNode->Next;
	HeadNode->Next = NewNode;
}

2.删除学生信息

删除结点

void deletestudent() {//删除节点|
	char name[10];
	printf("请输入需要删除的学生名字:\n");
	scanf("%s", &name);
	deletenode(StudentNode, name);
}
void deletenode(struct Node* headnode, char* name) 
{//删除节点操作
	struct Node* posnode = headnode->Next;
	struct Node* posnodefront = headnode;
	if (posnode == NULL) {
		printf("数据为空,无法删除");
	}
	else
	{
		while (strcmp(posnode->data.name, name)) 
		{
			posnodefront = posnode;
			posnode = posnodefront->Next;
			if (posnode == NULL) { printf("未找到指定位置,无法删除"); return; }
		}
		posnodefront->Next = posnode->Next;
		free(posnode);
	}
}

3.查找学生信息

查找结点、打印单个结点、浏览信息

struct Node* SearchNode(struct Node* StudentNode, char* name) {
//查找节点
	struct Node* pMove = StudentNode->Next;
	if (pMove == NULL) {
		printf("未找到该学生");
		return(pMove);
	}
	else
	{
		while (strcmp(pMove->data.name, name)) 
		{
			pMove = pMove->Next;
			if (pMove == NULL)break;
		}
		return pMove;
	}
}
void PrintList(struct Node* StudentNode) 
{//打印单个节点
	printf("姓名\t年龄\t电话\t\t住址\n");
	printf("%s\t%d\t%s\t%s\n", StudentNode->data.name, StudentNode->data.age, StudentNode->data.tel, StudentNode->data.addr);
}
void PrintNode(struct Node* StudentNode) 
{//浏览信息
	struct Node* pow = StudentNode->Next;
	printf("姓名\t年龄\t电话\t\t住址\n");
	while (pow) {
		printf("%s\t%d\t%s\t%s\n", pow->data.name, pow->data.age, pow->data.tel, pow->data.addr);
		pow = pow->Next;
	}
}

4.创建菜单

void SystemMenu() {//学生管理系统菜单
	printf("---------------------学生信息管理系统---------------------------\n");
	printf("\t\t\t1.插入信息\n");
	printf("\t\t\t2.浏览信息\n");
	printf("\t\t\t3.删除信息\n");
	printf("\t\t\t4.修改信息\n");
	printf("\t\t\t5.查找信息\n");
	printf("\t\t\t6.退出系统\n");
	printf("-----------------------------------------------------------------\n");
}

5.在菜单的基础上插入相应函数执行对应功能

目的在于信息的读取

void KeyRecive() {
	int x;	
	struct Student s;//学生人数
	scanf("%d", &x);
	switch (x)
	{
	case 1:
		printf("\t【插入信息】\n");
		InsertStudent();//插入学生信息
		SaveFile1(S1, StudentNode);
		printf("插入操作执行完成!-------------");
		break;
	case 2:
		printf("\t【浏览信息】\n");
		PrintNode(StudentNode);
		printf("浏览操作执行完成--------------");
		break;
	case 3:
		printf("\t【删除信息】\n");
		deletestudent();
		SaveFile1(S1, StudentNode);
		printf("删除操作执行完成---------------");
		break;
	case 4:
		printf("\t【更改信息】\n");
		printf("请输入更改的姓名:");
		scanf("%s", &s.name);
		if (SearchNode(StudentNode, s.name) == NULL) //异常处理报错
		{
			printf("未找到相关信息!\n");
		}
		else
		{
			struct Node* s1 = SearchNode(StudentNode, s.name);
			printf("请输入新的学生信息:\n");
			printf("请输入同学姓名:\n");
			scanf("%s", &s1->data.name);
			printf("请输入同学年龄:\n");
			scanf("%d", &s1->data.age);
			printf("请输入同学电话:\n");
			scanf("%s", &s1->data.tel);
			printf("请输入同学住址:\n");
			scanf("%s", &s1->data.addr);
			printf("修改操作执行完成---------------");
			SaveFile1(S1, StudentNode);
		}
		break;
	case 5:
		printf("\t【查找信息】\n");
		printf("请输入查找的姓名:");
		scanf("%s", &s.name);
		if (SearchNode(StudentNode, s.name) == NULL) {
			printf("未找到相关信息!\n");
		}
		else
		{
			PrintList(SearchNode(StudentNode, s.name));
			printf("查找操作执行完成---------------");
		}
		break;
	default:printf("输入数据有误,重新输入"); KeyRecive();
		break;
	case 6:
		printf("\t【退出系统】\n");
		exit(0);
		break;
	}
}

6.文件操作

读取和保存

void ReadFromFile(char* filename, struct Node* StudentNode) 
{
	FILE* fp = fopen(filename, "r");
	if (fp == NULL) 
	{
		fp = fopen(filename, "w");
	}
	struct Student data;
	while (fscanf(fp, "%s\t%d\t%s\t%s\n", &data.name, &data.age,
		&data.tel, &data.addr) != EOF) 
	{
		CreatNodeList(StudentNode, data);
		memset(&data, 0, sizeof(data));
	}
	fclose(fp);
}
void SaveFile1(char* filename, struct Node* StudentNode) 
{
	FILE* fp = fopen(filename, "w");
	struct Node* pow = StudentNode->Next;
	while (pow) {
		fprintf(fp, "%s\t%d\t%s\t%s\n", pow->data.name, pow->data.age, pow->data.tel, pow->data.addr);
		pow = pow->Next;
	}
	fclose(fp);
}

7.实现主函数功能

int main(void) {
	StudentNode = CreatNode();
	ReadFromFile(S1, StudentNode);
	while (1) 
	{
		SystemMenu();
		KeyRecive();
		system("pause");
		system("cls");
	}
}

运行代码如下:

#define _CRT_SECURE_NO_WARNINGS
//指定的源文件的开头定义
#include <stdio.h>
#include <stdlib.h>
#include <String.h>
//初始化所有函数
void SystemMenu();//菜单
void KeyRecive();//接受信息
void InsertStudent();//插入学生信息
struct Node* CreatNode();//创建结构体
struct Node* CreatNewNode(struct Student data);//结构体的数据域
void CreatNodeList(struct Node* HeadNode, struct Student data);
void deletestudent();//删除信息
void deletenode(struct Node* headnode, char* name);
//struct Node* changenode(struct Node* S);
struct Node* SearchNode(struct Node* StudentNode, char* name);
void PrintNode(struct Node* StudentNode);
void PrintList(struct Node* StudentNode);
void ReadFromFile(char* filename, struct Node* StudentNode);//读取文件
void SaveFile1(char* filename, struct Node* StudentNode);//保存文件
struct Node* StudentNode;
char S1[5] = { 's','.','t','x','t' };
struct Student {
	char name[20];//名字
	int age;//年龄
	char tel[20];//电话
	char addr[20];//住址
};
struct Node {//定义结构体 的数据域和指针
	struct Student data;
	struct Node* Next;
};
void SystemMenu() {//学生管理系统菜单
	printf("---------------------学生信息管理系统---------------------------\n");
	printf("\t\t\t1.插入信息\n");
	printf("\t\t\t2.浏览信息\n");
	printf("\t\t\t3.删除信息\n");
	printf("\t\t\t4.修改信息\n");
	printf("\t\t\t5.查找信息\n");
	printf("\t\t\t6.退出系统\n");
	printf("-----------------------------------------------------------------\n");
}
void KeyRecive() {
	int x;	
	struct Student s;//学生人数
	scanf("%d", &x);
	switch (x)
	{
	case 1:
		printf("\t【插入信息】\n");
		InsertStudent();//插入学生信息
		SaveFile1(S1, StudentNode);
		printf("插入操作执行完成!-------------");
		break;
	case 2:
		printf("\t【浏览信息】\n");
		PrintNode(StudentNode);
		printf("浏览操作执行完成--------------");
		break;
	case 3:
		printf("\t【删除信息】\n");
		deletestudent();
		SaveFile1(S1, StudentNode);
		printf("删除操作执行完成---------------");
		break;
	case 4:
		printf("\t【更改信息】\n");
		printf("请输入更改的姓名:");
		scanf("%s", &s.name);
		if (SearchNode(StudentNode, s.name) == NULL) //异常处理报错
		{
			printf("未找到相关信息!\n");
		}
		else
		{
			struct Node* s1 = SearchNode(StudentNode, s.name);
			printf("请输入新的学生信息:\n");
			printf("请输入同学姓名:\n");
			scanf("%s", &s1->data.name);
			printf("请输入同学年龄:\n");
			scanf("%d", &s1->data.age);
			printf("请输入同学电话:\n");
			scanf("%s", &s1->data.tel);
			printf("请输入同学住址:\n");
			scanf("%s", &s1->data.addr);
			printf("修改操作执行完成---------------");
			SaveFile1(S1, StudentNode);
		}
		break;
	case 5:
		printf("\t【查找信息】\n");
		printf("请输入查找的姓名:");
		scanf("%s", &s.name);
		if (SearchNode(StudentNode, s.name) == NULL) {
			printf("未找到相关信息!\n");
		}
		else
		{
			PrintList(SearchNode(StudentNode, s.name));
			printf("查找操作执行完成---------------");
		}
		break;
	default:printf("输入数据有误,重新输入"); KeyRecive();
		break;
	case 6:
		printf("\t【退出系统】\n");
		exit(0);
		break;
	}
}
void InsertStudent() {//插入函数
	int x;
	struct Student S;
	printf("请输入学生的数目:");
	scanf("%d", &x);
	for (int i = 1; i <= x; i++) {
		printf("请分别输入第%d个同学姓名:\n",i);
		scanf("%s", &S.name);
		printf("请分别输入第%d个同学年龄:\n",i);
		scanf("%d", &S.age);
		printf("请分别输入第%d个同学电话:\n",i);
		scanf("%s", &S.tel);
		printf("请分别输入第%d个同学住址:\n",i);
		scanf("%s", &S.addr);
		CreatNodeList(StudentNode, S);
	}
}
struct Node* CreatNode() //建立头节点
{
	struct Node* HeadNode = (struct Node*)malloc(sizeof(struct Node));
	HeadNode->Next = NULL;
	return HeadNode;
}
struct Node* CreatNewNode(struct Student data) 
{//建立新结点函数
	struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));
	NewNode->data = data;
	NewNode->Next = NULL;
	return NewNode;
}
void CreatNodeList(struct Node* HeadNode, struct Student data) 
{//建立新节点并插入数据
	struct Node* NewNode = CreatNewNode(data);
	NewNode->Next = HeadNode->Next;
	HeadNode->Next = NewNode;
}
void deletestudent() {//删除节点|
	char name[10];
	printf("请输入需要删除的学生名字:\n");
	scanf("%s", &name);
	deletenode(StudentNode, name);
}
void deletenode(struct Node* headnode, char* name) 
{//删除节点操作
	struct Node* posnode = headnode->Next;
	struct Node* posnodefront = headnode;
	if (posnode == NULL) {
		printf("数据为空,无法删除");
	}
	else
	{
		while (strcmp(posnode->data.name, name)) 
		{
			posnodefront = posnode;
			posnode = posnodefront->Next;
			if (posnode == NULL) { printf("未找到指定位置,无法删除"); return; }
		}
		posnodefront->Next = posnode->Next;
		free(posnode);
	}
}
struct Node* SearchNode(struct Node* StudentNode, char* name) {
//查找节点
	struct Node* pMove = StudentNode->Next;
	if (pMove == NULL) {
		printf("未找到该学生");
		return(pMove);
	}
	else
	{
		while (strcmp(pMove->data.name, name)) 
		{
			pMove = pMove->Next;
			if (pMove == NULL)break;
		}
		return pMove;
	}
}
void PrintList(struct Node* StudentNode) 
{//打印单个节点
	printf("姓名\t年龄\t电话\t\t住址\n");
	printf("%s\t%d\t%s\t%s\n", StudentNode->data.name, StudentNode->data.age, StudentNode->data.tel, StudentNode->data.addr);
}
void PrintNode(struct Node* StudentNode) 
{//浏览信息
	struct Node* pow = StudentNode->Next;
	printf("姓名\t年龄\t电话\t\t住址\n");
	while (pow) {
		printf("%s\t%d\t%s\t%s\n", pow->data.name, pow->data.age, pow->data.tel, pow->data.addr);
		pow = pow->Next;
	}
}
void ReadFromFile(char* filename, struct Node* StudentNode) 
{
	FILE* fp = fopen(filename, "r");
	if (fp == NULL) 
	{
		fp = fopen(filename, "w");
	}
	struct Student data;
	while (fscanf(fp, "%s\t%d\t%s\t%s\n", &data.name, &data.age,
		&data.tel, &data.addr) != EOF) 
	{
		CreatNodeList(StudentNode, data);
		memset(&data, 0, sizeof(data));
	}
	fclose(fp);
}
void SaveFile1(char* filename, struct Node* StudentNode) 
{
	FILE* fp = fopen(filename, "w");
	struct Node* pow = StudentNode->Next;
	while (pow) {
		fprintf(fp, "%s\t%d\t%s\t%s\n", pow->data.name, pow->data.age, pow->data.tel, pow->data.addr);
		pow = pow->Next;
	}
	fclose(fp);
}
int main(void) {
	StudentNode = CreatNode();
	ReadFromFile(S1, StudentNode);
	while (1) 
	{
		SystemMenu();
		KeyRecive();
		system("pause");
		system("cls");
	}
}

插入操作运行结果

 浏览操作运行结果

删除操作运行结果

 修改操作运行结果

 查找操作运行结果

查找失败

 查找成功

 退出系统

  • 25
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@斯里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值