学生管理系统–(链表)
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 后查看