文章目录
前言
该程序不涉及数据库,利用链表数据结构,实现了学生成绩的增、删、改、查、求平均分以及根据平均分排序的功能。系统主要运用以下知识点:
- 单链表
- 结构体
- 函数封装
- 插入排序
- 分文件编写
一、程序介绍

在该系统中,使用链表作为存储学生成绩信息的数据结构。每个节点表示一个学生,包含学生的学号、姓名和成绩信息等字段。每个成绩信息包括语文、英语和数学成绩。
该系统具有以下功能:
求平均分:可以计算学生的平均成绩。添加学生成绩:可以添加一个新的学生及其成绩信息。删除学生成绩:可以删除指定学号的学生及其成绩信息。修改学生成绩:可以修改指定学号的学生的成绩信息。展示学生成绩:展示所有的学生成绩信息。查询学生成绩:可以根据学号查询指定学生的成绩信息。根据平均分排序:可以对学生成绩按照平均分进行排序。
二、面向结果

三、程序实现
1.搭建框架
建立main.c、student.h、student.c文件,分别添加头文件。
在main.c中,通过do-while搭配switch-case搭建所需框架。
#include "student.h"
void menu()
{
printf("*************************************\n");
printf(" * 学生成绩管理系统————帮助菜单 *\n");
printf("*************************************\n");
printf(" * 1. 添加学生信息 *\n");
printf(" * 2. 查看学生信息 *\n");
printf(" * 3. 计算平均分 *\n");
printf(" * 4. 依平均分排序 *\n");
printf(" * 5. 查找学生信息 *\n");
printf(" * 6. 删除学生信息 *\n");
printf(" * 7. 修改学生信息 *\n");
printf(" * 8. 清屏 *\n");
printf(" * 0. 退出 *\n");
printf("*************************************\n");
}
int main(int argc, char const *argv[])
{
int input;
do
{
menu();
printf("请输入:");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
printf("已退出!\n");//退出
break;
case 1:
printf("add\n"); //添加学生信息
break;
case 2:
//查看学生信息
break;
case 3:
//计算平均分
break;
case 4:
//依平均分排序
break;
case 5:
//查找学生信息
break;
case 6:
//删除学生信息
break;
case 7:
//修改学生信息
break;
case 8:
//清屏
break;
default:
printf("输入指令有误!\n");
break;
}
} while (input);
return 0;
}
2.类型定义
#include <stdio.h>
// 构造学生构造体
typedef struct student
{
int xuehao;
char name[20];
int chinese;
int math;
int english;
float avg;
}student;
//构造链表,数据域为学生信息
typedef struct Node
{
student stu;
struct Node* next;
}Node;
3.函数实现
3.1 初始化链表
头节点数据域中的chinese可用来记录后面节点的数量。
- 为头节点开辟空间
memset初始化头节点数据域- 指针域置NULL
- 返回头节点指针
// 初始化
Node* initList();
{
Node* p = (Node*)malloc(sizeof(Node));//开辟空间
memset(&p->stu, 0, sizeof(student));//将头节点的学生信息清零
p->next = NULL;
return p; //返回头节点指针
}
3.2 添加学生信息

- 开辟空间存放节点
- 初始化节点
- 用户输入学生信息(学号自动生成)
- 头节点后插入节点
- 头节点chinese+1
//头插法添加
void addStudent(Node* list)
{
Node* node = (Node*)malloc(sizeof(Node));
memset(&node->stu, 0, sizeof(student));//将节点的学生信息清零
node->stu.xuehao = list->stu.chinese + 1000;//学号=节点数(初始为0)+1
printf("请输入姓名:");
scanf("%s", node->stu.name);//数组名即地址
printf("请输入语文成绩:");
scanf("%d", &node->stu.chinese);
printf("请输入数学成绩:");
scanf("%d", &node->stu.math);
printf("请输入英语成绩:");
scanf("%d", &node->stu.english);
node->next = list->next;
list->next = node;
list->stu.chinese++;//头节点数据域中的chinese用来保存后面节点数量,所以++
printf("插入成功!\n");
}

3.3 查看学生信息
- 移动头节点指针,指向第一个节点
- 打印数据,指针移到下一个节点
- 当头节点移到最后节点后面时,停止打印
// 展示学生信息</

最低0.47元/天 解锁文章
2772





