基于链表的学生管理系统
基于链表的学生管理系统
前言
快到大一期末了,C语言课也结课了,期末作业学生管理系统,在写代码的过程中在老师讲课的基础上再加上一些创新的地方,前前后后写代码改bug差不多三四天,没想到居然写成了,收获了许多经验。二话不多说直接上代码,记得点赞收藏!
功能
- 通过文件导入到程序链表
- 通过程序链表保存到文件
- 主菜单显示
- 输入学生列表信息
- 添加学生列表
- 添加单个学生信息
- 修改某个学生信息
- 删除某个学生信息
- 对学生的学生成绩排序并输出
- 对学生的学生学号排序并输出
整体思路
利用链表建立,添加,删除来对信息的读入和输出
利用链表的归并排序算法(速度快)来对链表进行排序
增加一些容错机制,,,
通过函数模块化来对项目进行管理
通过主菜单help()函数来囊括所有函数
XD
Function.h
#pragma once
/***************
* 学生数据
* 编号 id
* 姓名 name
* 分数 score
* 下一个学生数据
****************/
struct Person
{
int id;
char name[20];
int score;
struct Person* next;
};
//链表存入文件
void saveFile();
//文件读取数据到链表
struct Person* loadFile();
//主菜单显示
int help();
//查询某个学生信息
void searchInfo();
//修改某个学生信息
void modifyInfo();
//将两个学生信息列表按成绩有序归并
struct Person* mergeScoreList(struct Person* node1, struct Person* node2);
//将两个学生信息列表按学号有序归并
struct Person* mergeIdList(struct Person* node1, struct Person* node2);
//将学生信息按成绩排序
struct Person* sortScoreList(struct Person* head);
//将学生信息按学号排序
struct Person* sortIdList(struct Person* head);
//删除学生信息
void deleteInfo();
//添加学生信息
void addInfo();
//添加学生信息列表
void addInfoList();
//展示学生信息列表
void displayList();
Function.cpp
#include "Function.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern struct Person* head;
void saveFile()
{
FILE* fp;
struct Person* p1 = head;
if ((fp = fopen("Student.txt", "w")) == NULL)
{
printf("File set failed!\n");
return;
}
while (p1 != NULL)
{
fprintf(fp, "%d\t%s\t%d\n", p1->id, p1->name, p1->score);
p1 = p1->next;
}
fclose(fp);
}
struct Person* loadFile()
{
int i = 0;
char tname[20];
int tid;
int tscore;
FILE* fp;
Person* p1 = NULL;
Person* p2 = NULL;
Person* head = NULL;
if ((fp = fopen("Student.txt", "r")) == NULL)
{
printf("File set failed!\n");
return NULL;
}
while (fscanf(fp, "%d%s%d", &tid, tname, &tscore) != EOF)
{
p1 = (Person*)malloc(sizeof(Person));
p1->next = NULL;
p1->id = tid;
strcpy(p1->name, tname);
p1->score = tscore;
if (i == 0)
{
head = p1;
p2 = p1;
i = 1;
}
else
{
p2->next = p1;
p2 = p1;
}
}
return head;
}
void searchInfo()
{
int tid;
struct Person* p1 = head;
printf("宁要查询的学生学号为?\n");
scanf("%d", &tid);
while (p1 != NULL)
{
if (p1->id == tid)
{
printf("学号\t姓名\t成绩\n");
printf("%d\t%s\t%d\n", p1->id, p1->name, p1->score);
break;
}
p1 = p1->next;
}
if (p1 == NULL)
printf("未找到该学号!\n");
}
void deleteInfo()
{
int tid;
int i;
char tch;
struct Person* p1 = head;
struct Person* tp = head;
printf("您要删除的学生学号为?\n");
scanf("%d", &tid);
getchar();
for (i = 0;; i++)
{
if (i == 0 && p1->id == tid)
{
printf("确定删除姓名为 %s 的信息?(Y\\N)\n", p1->name);
tch = getchar();
getchar();
if (tch == 'Y')
{
head = head->next;
free(p1);
printf("删除成功\n");
break;
}
else
{
printf("删除失败\n