链表学生管理系统–(直接上代码)

发布于:2023-01-04 ⋅ 阅读:(162) ⋅ 点赞:(0)

学生管理系统–(链表)

1,前言

已经走嵌入式好一段时间了,今天回过头来,重新写了一遍这个系统,作为为学C语言入门考查的项目,掌握增删查改尤为重要,做这个项目,基本学C的内容都用到了,即使到了现在,也不能随心应手的把这个项目写出来,看来以后还是需要多练。

2,开发系统环境

win10系统,写的代码软件为vs2017的版本,因为用到了系统文件操作,需要修改vs2017的默认设置,需要将你的系统属性,SDL检测,设置为 否 ,如图所示。

在这里插入图片描述

3,效果图

txt文件默认保存在代码所在位置。

在这里插入图片描述
在这里插入图片描述

4,直接上代码。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

struct student
{
	char name[20];
	char num[20];
	int math;
	int english;
	int py;
	int sum;
	int average;  
};

//数据结构(链表)
struct Node
{
	struct student data;
	struct Node* next;
};
struct Node* list;
//创建表头 --> 创建结构体变量
struct Node* createHead()
{
	struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
	assert(headNode);    //断言:判断当前指针是否为空,为空引发断点   
	headNode->next = NULL;
	return headNode;
};
//创建节点
struct Node* createNode(struct student data)
{
	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
	assert(newNode);
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}
//插入数据
void insertData(struct Node* headNode, struct student data)
{
	struct Node* newNode = createNode(data);
	newNode->next = headNode->next;
	headNode->next = newNode;
}
//打印链表
void printList(struct Node* headNode)
{
	struct Node* pmove = headNode->next;
	printf("姓名\t编号\t数学\t英语\tpy\t总分\t平均分\n");
	while (pmove != NULL)
	{
		printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n", 
			pmove->data.name,
			pmove->data.num, 
			pmove->data.math, 
			pmove->data.english, 
			pmove->data.py, 
			pmove->data.sum,
			pmove->data.average);
		pmove = pmove->next;
	}
}
//删
void deleteDataByName(struct Node* headNode, const char* name)
{
	struct Node* preNode = headNode;
	struct Node* curNode = headNode->next;
	while (curNode != NULL && strcmp(curNode->data.name,name))
	{
		preNode = curNode;
		curNode = preNode->next;
	}
	if (curNode == NULL)
	{
		printf("删除失败,没有找到指定数据!\n");
		free(curNode);
	}
}
//查
struct Node* searchDataByName(struct Node* headNode,const char* name)
{
	struct Node* pmove = headNode->next;
	while (pmove != NULL && strcmp(pmove->data.name, name))
	{
		pmove = pmove->next;
	}
}

//管理系统文件操作
//写文件
void saveToFile(struct Node* headNode, const char* fileName)
{
	struct Node* pmove = headNode->next;
	FILE* fp = fopen(fileName, "w");
	while (pmove != NULL)
	{
		fprintf(fp, "%s\t%s\t%d\t%d\t%d\t%d\t%d\n",
			pmove->data.name,
			pmove->data.num,
			pmove->data.math,
			pmove->data.english,
			pmove->data.py,
			pmove->data.sum,
			pmove->data.average);
		pmove = pmove->next;
	}fclose(fp);
}
//读文件 
void readToFile(struct Node* headNode, const char* fileName)
{
	FILE* fp = fopen(fileName, "r");
	if (fp == NULL)
	{
		fp = fopen(fileName, "w+");
		fclose(fp);
	}
	struct student temp;
	while (fscanf(fp, "%s\t%s\t%d\t%d\t%d\t%d\t%d\n",
		temp.name,
		temp.num,
		&temp.math,
		&temp.english,
		&temp.py,
		&temp.sum,
		&temp.average) != EOF)
	{
		insertData(list, temp);
	}
	fclose(fp);
}

//菜单
void makeMenu() //制作菜单
{
	printf("--------【学生管理系统】--------\n");
	printf("\t\t0.退出功能\n"); //  \t是水平制作符(tab = 4个空格)
	printf("\t\t1.录入功能\n");
	printf("\t\t2.浏览功能\n");
	printf("\t\t3.查找功能\n");
	printf("\t\t4.修改功能\n");
	printf("\t\t5.删除功能\n");
	printf("--------------------------------\n");
	printf("\t\t请输入选择(0~5)\n");
}

//选择
void keyDown()
{
	int userkey = 0;
	struct student temp; //用于接收用户输入
	struct Node* result; 
	scanf_s("%d", &userkey);
	switch (userkey)
	{
		case 0:
			printf("----【退出模块】----\n");
			system("pause");
			exit(0);
			break;
		case 1:
			printf("----【录入功能】----\n");
			printf("请输入学生信息(name,num,math,english,py) \n");
			scanf_s("%s%s%d%d%d", temp.name, 20, temp.num, 20, &temp.math, &temp.english, &temp.py);
			//手动处理:
			temp.sum = temp.math + temp.english + temp.py;
			temp.average = temp.sum/3;
			insertData(list, temp);
			saveToFile(list,"student.txt");
			break;
		case 2:
			printf("----【浏览功能】----\n");
			printList(list);
			break;
		case 3:
			printf("----【查找功能】----\n");
			printf("请输入要查找的名字:");
			scanf_s("%s", temp.name, 20);   //scanf_s  vs的增强版函数,20代表长度
			result = searchDataByName(list, temp.name);
			if (result == NULL) {
				printf("未找到结果! \n");
			}
			else {
				printf("姓名\t编号\t数学\t英语\tpy\t总分\t平均分\n");
				printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t",
					result->data.name,
					result->data.num,
					result->data.math,
					result->data.english,
					result->data.py,
					result->data.sum,
					result->data.average);
			}		
			break;
		case 4:
			printf("----【修改功能】----\n");
			printf("请输入要修改学生的名字:");
			scanf_s("%s", temp.name, 20);   //scanf_s  vs的增强版函数,20代表长度
			result = searchDataByName(list, temp.name);
			if (result == NULL) {
				printf("未找到结果! \n");
			}
			else {
				printf("请输入新的学生信息(name,num,math,english,py):");
				scanf_s("%s%s%d%d%d", 
					result->data.name, 20, 
					result->data.num, 20, 
					&result->data.math, 
					&result->data.english, 
					&result->data.py);
				//手动处理:
				result->data.sum = result->data.math + result->data.english + result->data.py;
				result->data.average = result->data.sum / 3;
				saveToFile(list, "student.txt");
			}
			break;
		case 5:
			printf("----【删除功能】----\n");
			printf("请输入要删除学生的名字:");
			scanf_s("%s", temp.name, 20);   //scanf_s  vs的增强版函数,20代表长度
			deleteDataByName(list, temp.name);
			saveToFile(list, "student.txt");
			break;
	}

}

int main()
{
	list = createHead();
	readToFile(list, "student.txt");
	//insertData(list, 1);
	//insertData(list, 666);
	//printList(list); printf("\n");
	while (1)
	{
		makeMenu();
		keyDown();
		system("pause");   //按任意键继续
		system("cls");	   //清屏
	}
	
	
	return 0;
}


本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到