
大一大二的计算机类学生可以直接应用,该项目功能十分简洁,有利于进行期末答辩。应用到的知识点在学习的过程中老师都会讲解,并没有难理解的部分。数据采用链表的形式进行存储,没有与文件进行交接。采用的编译软件是vs2022,如果使用dev或者clion第一行代码记得去掉。
本系统所用到的知识点和前两篇系统中的知识点相似,在这里不在对各各部分知识点进行过多赘述。如果想要了解各各部分知识点,欢迎去浏览前两篇系统。链接如下:
图书管理系统
企业员工管理系统
特色:排序功能是本文章的一大特色,针对此功能使用了指针。对学生的增删改查都可以使用姓名或者学号对其进行操作,本文使用了found对信息进行标注,这点也值得去借鉴。如果有更好的改进方法欢迎提出。
while (1) 循环确保程序在执行完一个功能后继续等待用户输入。
stumenu() 函数用于显示功能菜单,用户可以根据菜单选择操作。
1. 添加学生信息 (addstu)
调用 addstu(child) 函数,用于向系统中添加新的学生信息。
2. 查询学生信息
提供两种查询方式:按姓名查询和按学号查询。
根据用户输入的方式,调用 namefind(child) 或 numfind(child) 函数来实现查询操作。
3. 删除学生信息
提供两种删除方式:按姓名删除和按学号删除。
根据用户输入的方式,调用 namedel(child) 或 numdel(child) 函数来实现删除操作。
4. 修改学生信息
提供两种修改方式:按姓名修改和按学号修改。
根据用户输入的方式,调用 namechange(child) 或 numchange(child) 函数来实现修改操作。
5. 成绩分析 (advgrade)
调用 advgrade(child) 函数,进行学生成绩分析或高级分析操作。
6. 学生排序 (sordstu)
调用 sordstu(child) 函数,对学生信息进行排序操作。
7. 打印学生信息 (printstu)
调用 printstu(child) 函数,将当前所有学生信息打印输出。
0. 退出程序
输入 0 可以退出程序,调用 exit(0) 函数。
默认情况
如果用户输入了不在菜单选项内的数字,会提示输入有误,并继续显示菜单供用户选择。
输入验证
对于涉及用户输入的地方(如查询方式、删除方式、修改方式),代码使用 scanf 函数获取用户的选择,并进行简单的输入验证和错误处理,确保用户输入的是有效选项。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 添加stdlib.h以包含malloc和free函数声明
int numstu = 0;//全局变量记录学生人数
// 学生信息
typedef struct student {
int id; // 学号
char name[20]; // 姓名(增大数组以容纳更长的名字)
char sex[3]; // 性别(使用字符类型)
int age; // 年龄
int math; // 高数成绩
int eng; // 英语成绩
int cyy; // C语言成绩
struct student* next;
} stu;1.预处理指令 #define _CRT_SECURE_NO_WARNINGS:
这是针对某些编译器(比如Visual Studio)的预处理指令,用于避免编译器产生关于安全函数的警告信息。
2.头文件包含:
<stdio.h>:包含了标准输入输出函数,如 printf 和 scanf。
<string.h>:包含了字符串处理函数,如 strcpy 和 strlen。
<stdlib.h>:包含了内存分配函数 malloc 和 free 的声明,用于动态内存管理。
3.全局变量 numstu:
numstu 用于记录当前系统中的学生人数,初始化为0,会在程序中随着学生信息的添加而增加。
4.结构体 student 的定义:
typedef struct student { ... } stu;
id:整数类型,用于存储学生的学号。
name:字符数组,长度为20,用于存储学生的姓名。这里给出了注释,建议增大数组以容纳更长的名字。
sex:字符数组,长度为3,用于存储学生的性别。
age:整数类型,用于存储学生的年龄。
math、eng、cyy:分别是整数类型,用于存储学生的高数、英语和C语言成绩。
next:指向下一个学生信息结构体的指针,支持链表形式的存储方式。
// 函数声明
stu* initstu();
void addstu(stu* child);
void printstu(stu* child);
void namedel(stu* child);
void numdel(stu* child);
void numchange(stu* child);
void namechange(stu* child);
void namefind(stu* child);
void numfind(stu* child);
void advgrade(stu* child);
void mpstu(int arrstu[], stu** array, int n);
void sordstu(stu* child);
void arrarray(stu* child, stu** array, int max_size);
void funstu(stu *child);
void stumenu();注:因为本系统中所使用的函数都是在主函数(main)下面,所以要进行声明。如果主函数在最下面则不需要声明操作。
// 主函数
int main() {
stu* child = initstu();
while (1)
{
funstu(child);
}
return 0;
}主函数只对链表进行了初始化操作,为了增加代码的可读性,我选择将功能函数进行打包,存放到了funstu函数当中,只需要在主函数中添加一个死循环便可完成功能函数的不断调用。
//菜单界面
void stumenu()
{
printf("*******************************************************\n");
printf("* 欢迎进入学生成绩管理系统v1.0 *\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("* 0.退出系统 *\n");
printf("*******************************************************\n");
}因为是控制台程序,界面优化方面并没有进行过多的操作,只是为了不显得太唐突,简单做了一个菜单显示界面。
//功能界面
void funstu(stu *child)
{
int a;
while (1)
{
stumenu();
printf("请输入你要使用的功能:");
scanf("%d", &a);
switch (a)
{
case 1:
addstu(child);
break;
case 2:
int b;
printf("****************请输入你要查询的方式*****************\n");
printf("*******************1.按姓名查询**********************\n");
printf("*******************2.按学号查询**********************\n");
scanf("%d", &b);
if (b == 1) namefind(child);
else if (b == 2) numfind(child);
else printf("输入有误!!!\n");
break;
case 3:
printf("****************请输入你要删除的方式*****************\n");
printf("*******************1.按姓名删除**********************\n");
printf("*******************2.按学号删除**********************\n");
int c;
scanf("%d", &c);
if (c == 1) namedel(child);
else if (c == 2) numdel(child);
else printf("输入有误!!!\n");
break;
case 4:
printf("****************请输入你要删除的方式*****************\n");
printf("*******************1.按姓名删除**********************\n");
printf("*******************2.按学号删除**********************\n");
int d;
scanf("%d", &d);
if (d == 1) namechange(child);
else if (d == 2) numchange(child);
else printf("输入有误!!!\n");
break;
case 5:
advgrade(child);
break;
case 6:
sordstu(child);
break;
case 7:
printstu(child);
break;
case 0:
exit(0);
break;
default:
printf("输入有误!!!\n");
break;
}
}
}对学生信息的增、删、改、查、排序...进行打包,通过主菜单的不断循环即可实现其功能,当然也可以不用功能函数将其进行打包,完全可以将此函数放在主函数中,但是可读性会有所下降。
// 初始化学生信息
stu* initstu()
{
stu* child = (stu*)malloc(sizeof(stu));
if (child == NULL) {
perror("分配内存失败");
exit(EXIT_FAILURE);
}
child->next = NULL;
return child;
}因为学生的信息是使用链表进行存储的,所以要对头部进行初始化操作。
注:分配内存的格式一定要牢记,别忘记头文件#include<stdlib.h>的使用。
// 增加学生信息
void addstu(stu* child)
{
stu* node = (stu*)malloc(sizeof(stu));
if (node == NULL) {
perror("分配内存失败");
exit(EXIT_FAILURE);
}
printf("请输入你想要添加学生的信息:\n");
printf("学号:");
scanf("%d", &node->id);
printf("姓名:");
scanf("%s", node->name);
printf("性别:");
scanf("%s", node->sex);
printf("年龄:");
scanf("%d", &node->age);
printf("高数成绩:");
scanf("%d", &node->math);
printf("英语成绩:");
scanf("%d", &node->eng);
printf("C语言成绩:");
scanf("%d", &node->cyy);
node->next = NULL;
numstu += 1;
while (child->next != NULL) {
child = child->next;
}
child->next = node;
}
为了更好的使用此系统,以及下面其余功能的操作,建议多录入几个学生的信息。在这里我输入了3名同学的信息。
//删除学生信息
//按姓名删除
void namedel(stu* child)
{
int found = 0;
char name[100];
printf("请输入你要删除学生的姓名:");
scanf("%s", name);
stu* temp = child->next;
stu* pre = child;
while (temp != NULL)
{
if (strcmp(temp->name, name) == 0)
{
found = 1;
pre->next = temp->next;
free(temp);
break;
}
printf("删除成功\n");
temp = temp->next;
pre = pre->next;
}
if(found==0) printf("没有找到该生!!!\n");
}
//按学号删除
void numdel(stu* child)
{
int found = 0;
int idnum=0;
printf("请输入你要删除学生的学号:");
scanf("%d", &idnum);
stu* temp = child->next;
stu* pre = child;
while (temp != NULL)
{
if (temp->id==idnum)
{
found = 1;
pre->next = temp->next;
free(temp);
printf("删除成功\n");
break;
}
temp = temp->next;
pre = pre->next;
}
if (found == 0) printf("没有找到该生!!!\n");
}
//修改学生信息
//按姓名修改
void namechange(stu* child)
{
int found = 0;
char name[20];
stu* temp = child->next;
printf("请输入你要修改学生的姓名:");
scanf("%s", name);
while (temp != NULL)
{
if (strcmp(temp->name, name) == 0)
{
found = 1;
printf("请输入你想要修改学生的信息\n");
printf("学号:");
scanf("%d", &temp->id);
printf("姓名:");
scanf("%s", temp->name);
printf("性别:");
scanf("%s", temp->sex);
printf("年龄:");
scanf("%d", &temp->age);
printf("高数成绩:");
scanf("%d", &temp->math);
printf("英语成绩:");
scanf("%d", &temp->eng);
printf("C语言成绩:");
scanf("%d", &temp->cyy);
printf("修改成功!\n");
break;
}
temp = temp->next;
}
if (found == 0) printf("没有找到该学生!\n");
}
//按学号修改
void numchange(stu* child)
{
int id;
int found = 0;
stu* temp = child->next;
printf("请输入你要修改学生的学号:");
scanf("%d", &id);
while (temp != NULL)
{
if (temp->id==id)
{
found = 1;
printf("请输入你想要修改学生的信息\n");
printf("学号:");
scanf("%d", &temp->id);
printf("姓名:");
scanf("%s", temp->name);
printf("性别:");
scanf("%s", temp->sex);
printf("年龄:");
scanf("%d", &temp->age);
printf("高数成绩:");
scanf("%d", &temp->math);
printf("英语成绩:");
scanf("%d", &temp->eng);
printf("C语言成绩:");
scanf("%d", &temp->cyy);
printf("修改成功!\n");
break;
}
temp = temp->next;
}
if (found == 0) printf("没有找到该学生!\n");
}
//查找学生信息
//按姓名查找
void namefind(stu* child)
{
int found = 0;
char name[20];
stu* temp = child->next;
printf("请输入你要查找学生的姓名:");
scanf("%s", name);
while (temp != NULL)
{
if (strcmp(temp->name, name) == 0)
{
found = 1;
printf("===============================该生信息如下=============================\n");
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
break;
}
temp = temp->next;
}if (found == 0) printf("没有查询到该生。\n");
}
//按学号查找
void numfind(stu* child)
{
int id;
int found = 0;
stu* temp = child->next;
printf("请输入你要查找学生的学号:");
scanf("%d", &id);
while (temp != NULL)
{
if (temp->id == id)
{
found = 1;
printf("==============================该生信息如下=============================\n");
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
break;
}
temp = temp->next;
}
if (found == 0) printf("没有查询到该生。\n");
}

//计算平均分
void advgrade(stu* child)
{
char grade[20];
double sum=0;
printf("请输入你要查询的科目:");
scanf("%s", grade);
stu* temp = child->next;
stu* adv = child->next;
while (temp != NULL)
{
if (strcmp("高数", grade) == 0)
{
while (adv != NULL)
{
sum += adv->math;
adv = adv->next;
}
sum =sum / numstu;
printf("高数平均成绩为:%.2lf\n", sum);
break;
}
else if (strcmp("英语", grade) == 0)
{
while (adv != NULL)
{
sum += adv->eng;
adv = adv->next;
}
sum =sum / numstu;
printf("英语平均成绩为:%.2lf\n", sum);
break;
}
else if (strcmp("C语言", grade) == 0)
{
while (adv != NULL)
{
sum += adv->cyy;
adv = adv->next;
}
sum = sum / numstu;
printf("C语言平均成绩为:%.2lf\n", sum);
break;
}
else
{
printf("输入有误!!!\n");
break;
}
temp = temp->next;
}
}
注:查询的结果会自动保存两位小数,C语言查询时"C"一定要大写!!!
// 冒泡排序函数,接受 stu 结构体指针数组和数组长度作为参数
void mpstu(int arrstu[], stu** array, int n)
{
stu *temp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
// 比较节点的 id 字段,需要使用指针访问
if (arrstu[j]>arrstu[j+1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
void arrarray(stu* child, stu** array, int max_size)
{
stu* head = child->next;
int count = 0;
//遍历链表,将结点存入数组
while (head != NULL && count < max_size)
{
array[count] = head;
head = head->next;
count++;
}
}
void sordstu(stu* child)
{
stu* arr[100];
int arrstu[100] = { 0 };//定义一个整形数组,存储id
int max_size = 100;
arrarray(child, arr, max_size);
stu* temp = arr[0];
for (int i = 0; i < numstu; i++)
{
arrstu[i] = temp->id;
temp = temp->next;
}
mpstu(arrstu,arr, numstu);
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
for (int a = 0; a < numstu; a++)
{
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", arr[a]->id, arr[a]->name, arr[a]->sex, arr[a]->age, arr[a]->math, arr[a]->eng, arr[a]->cyy);
}
}stu 结构体的定义包含学生的各种信息,如学号 (id)、姓名 (name)、性别 (sex)、年龄 (age)、以及各科成绩等。stu 结构体中的 next 字段用于指向下一个节点,通过这个指针可以遍历整个链表。arrarray 函数):
arrarray 函数接受一个链表头指针 child,将链表中的节点依次存储到 array 数组中。这个函数主要通过遍历链表来实现,将每个节点的指针存储到数组中,直到达到数组的最大容量或链表结束。mpstu 函数):
mpstu 函数实现了冒泡排序算法,对 arrstu 数组进行排序,同时保证 array 数组中的指针顺序也随之调整。排序的依据是比较学生的学号 (id)。sordstu 的实现:
sordstu 函数是整个程序的主函数,它首先调用 arrarray 函数将链表中的节点指针存入 arr 数组中。arr 数组,将每个学生节点的学号 (id)提取出来存入 arrstu 数组中,为后续的排序做准备。mpstu 函数对 arrstu 和 arr 数组进行排序。printf 函数输出排序后的学生信息,包括学号、姓名、性别、年龄以及各科成绩等信息。arrarray 和 mpstu 函数中使用了指针操作,对链表节点进行访问和交换。//输出所有学生信息
void printstu(stu* child)
{
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
stu* hand = child->next;
while (hand != NULL)
{
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", hand->id, hand->name, hand->sex, hand->age, hand->math, hand->eng, hand->cyy);
hand = hand->next;
}
}

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 添加stdlib.h以包含malloc和free函数声明
int numstu = 0;//全局变量记录学生人数
// 学生信息
typedef struct student {
int id; // 学号
char name[20]; // 姓名(增大数组以容纳更长的名字)
char sex[3]; // 性别(使用字符类型)
int age; // 年龄
int math; // 高数成绩
int eng; // 英语成绩
int cyy; // C语言成绩
struct student* next;
} stu;
// 函数声明
stu* initstu();
void addstu(stu* child);
void printstu(stu* child);
void namedel(stu* child);
void numdel(stu* child);
void numchange(stu* child);
void namechange(stu* child);
void namefind(stu* child);
void numfind(stu* child);
void advgrade(stu* child);
void mpstu(int arrstu[], stu** array, int n);
void sordstu(stu* child);
void arrarray(stu* child, stu** array, int max_size);
void funstu(stu *child);
void stumenu();
// 主函数
int main() {
stu* child = initstu();
while (1)
{
funstu(child);
}
return 0;
}
//菜单界面
void stumenu()
{
printf("*******************************************************\n");
printf("* 欢迎进入学生成绩管理系统v1.0 *\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("* 0.退出系统 *\n");
printf("*******************************************************\n");
}
//功能界面
void funstu(stu *child)
{
int a;
while (1)
{
stumenu();
printf("请输入你要使用的功能:");
scanf("%d", &a);
switch (a)
{
case 1:
addstu(child);
break;
case 2:
int b;
printf("****************请输入你要查询的方式*****************\n");
printf("*******************1.按姓名查询**********************\n");
printf("*******************2.按学号查询**********************\n");
scanf("%d", &b);
if (b == 1) namefind(child);
else if (b == 2) numfind(child);
else printf("输入有误!!!\n");
break;
case 3:
printf("****************请输入你要删除的方式*****************\n");
printf("*******************1.按姓名删除**********************\n");
printf("*******************2.按学号删除**********************\n");
int c;
scanf("%d", &c);
if (c == 1) namedel(child);
else if (c == 2) numdel(child);
else printf("输入有误!!!\n");
break;
case 4:
printf("****************请输入你要删除的方式*****************\n");
printf("*******************1.按姓名删除**********************\n");
printf("*******************2.按学号删除**********************\n");
int d;
scanf("%d", &d);
if (d == 1) namechange(child);
else if (d == 2) numchange(child);
else printf("输入有误!!!\n");
break;
case 5:
advgrade(child);
break;
case 6:
sordstu(child);
break;
case 7:
printstu(child);
break;
case 0:
exit(0);
break;
default:
printf("输入有误!!!\n");
break;
}
}
}
// 初始化学生信息
stu* initstu()
{
stu* child = (stu*)malloc(sizeof(stu));
if (child == NULL) {
perror("分配内存失败");
exit(EXIT_FAILURE);
}
child->next = NULL;
return child;
}
// 增加学生信息
void addstu(stu* child)
{
stu* node = (stu*)malloc(sizeof(stu));
if (node == NULL) {
perror("分配内存失败");
exit(EXIT_FAILURE);
}
printf("请输入你想要添加学生的信息:\n");
printf("学号:");
scanf("%d", &node->id);
printf("姓名:");
scanf("%s", node->name);
printf("性别:");
scanf("%s", node->sex);
printf("年龄:");
scanf("%d", &node->age);
printf("高数成绩:");
scanf("%d", &node->math);
printf("英语成绩:");
scanf("%d", &node->eng);
printf("C语言成绩:");
scanf("%d", &node->cyy);
node->next = NULL;
numstu += 1;
while (child->next != NULL) {
child = child->next;
}
child->next = node;
}
//删除学生信息
//按姓名删除
void namedel(stu* child)
{
int found = 0;
char name[100];
printf("请输入你要删除学生的姓名:");
scanf("%s", name);
stu* temp = child->next;
stu* pre = child;
while (temp != NULL)
{
if (strcmp(temp->name, name) == 0)
{
found = 1;
pre->next = temp->next;
free(temp);
break;
}
printf("删除成功\n");
temp = temp->next;
pre = pre->next;
}
if(found==0) printf("没有找到该生!!!\n");
}
//按学号删除
void numdel(stu* child)
{
int found = 0;
int idnum=0;
printf("请输入你要删除学生的学号:");
scanf("%d", &idnum);
stu* temp = child->next;
stu* pre = child;
while (temp != NULL)
{
if (temp->id==idnum)
{
found = 1;
pre->next = temp->next;
free(temp);
printf("删除成功\n");
break;
}
temp = temp->next;
pre = pre->next;
}
if (found == 0) printf("没有找到该生!!!\n");
}
//修改学生信息
//按姓名修改
void namechange(stu* child)
{
int found = 0;
char name[20];
stu* temp = child->next;
printf("请输入你要修改学生的姓名:");
scanf("%s", name);
while (temp != NULL)
{
if (strcmp(temp->name, name) == 0)
{
found = 1;
printf("请输入你想要修改学生的信息\n");
printf("学号:");
scanf("%d", &temp->id);
printf("姓名:");
scanf("%s", temp->name);
printf("性别:");
scanf("%s", temp->sex);
printf("年龄:");
scanf("%d", &temp->age);
printf("高数成绩:");
scanf("%d", &temp->math);
printf("英语成绩:");
scanf("%d", &temp->eng);
printf("C语言成绩:");
scanf("%d", &temp->cyy);
printf("修改成功!\n");
break;
}
temp = temp->next;
}
if (found == 0) printf("没有找到该学生!\n");
}
//按学号修改
void numchange(stu* child)
{
int id;
int found = 0;
stu* temp = child->next;
printf("请输入你要修改学生的学号:");
scanf("%d", &id);
while (temp != NULL)
{
if (temp->id==id)
{
found = 1;
printf("请输入你想要修改学生的信息\n");
printf("学号:");
scanf("%d", &temp->id);
printf("姓名:");
scanf("%s", temp->name);
printf("性别:");
scanf("%s", temp->sex);
printf("年龄:");
scanf("%d", &temp->age);
printf("高数成绩:");
scanf("%d", &temp->math);
printf("英语成绩:");
scanf("%d", &temp->eng);
printf("C语言成绩:");
scanf("%d", &temp->cyy);
printf("修改成功!\n");
break;
}
temp = temp->next;
}
if (found == 0) printf("没有找到该学生!\n");
}
//查找学生信息
//按姓名查找
void namefind(stu* child)
{
int found = 0;
char name[20];
stu* temp = child->next;
printf("请输入你要查找学生的姓名:");
scanf("%s", name);
while (temp != NULL)
{
if (strcmp(temp->name, name) == 0)
{
found = 1;
printf("===============================该生信息如下=============================\n");
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
break;
}
temp = temp->next;
}if (found == 0) printf("没有查询到该生。\n");
}
//按学号查找
void numfind(stu* child)
{
int id;
int found = 0;
stu* temp = child->next;
printf("请输入你要查找学生的学号:");
scanf("%d", &id);
while (temp != NULL)
{
if (temp->id == id)
{
found = 1;
printf("==============================该生信息如下=============================\n");
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
break;
}
temp = temp->next;
}
if (found == 0) printf("没有查询到该生。\n");
}
//计算平均分
void advgrade(stu* child)
{
char grade[20];
double sum=0;
printf("请输入你要查询的科目:");
scanf("%s", grade);
stu* temp = child->next;
stu* adv = child->next;
while (temp != NULL)
{
if (strcmp("高数", grade) == 0)
{
while (adv != NULL)
{
sum += adv->math;
adv = adv->next;
}
sum =sum / numstu;
printf("高数平均成绩为:%.2lf\n", sum);
break;
}
else if (strcmp("英语", grade) == 0)
{
while (adv != NULL)
{
sum += adv->eng;
adv = adv->next;
}
sum =sum / numstu;
printf("英语平均成绩为:%.2lf\n", sum);
break;
}
else if (strcmp("C语言", grade) == 0)
{
while (adv != NULL)
{
sum += adv->cyy;
adv = adv->next;
}
sum = sum / numstu;
printf("C语言平均成绩为:%.2lf\n", sum);
break;
}
else
{
printf("输入有误!!!\n");
break;
}
temp = temp->next;
}
}
// 冒泡排序函数,接受 stu 结构体指针数组和数组长度作为参数
void mpstu(int arrstu[], stu** array, int n)
{
stu *temp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
// 比较节点的 id 字段,需要使用指针访问
if (arrstu[j]>arrstu[j+1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
void arrarray(stu* child, stu** array, int max_size)
{
stu* head = child->next;
int count = 0;
//遍历链表,将结点存入数组
while (head != NULL && count < max_size)
{
array[count] = head;
head = head->next;
count++;
}
}
void sordstu(stu* child)
{
stu* arr[100];
int arrstu[100] = { 0 };//定义一个整形数组,存储id
int max_size = 100;
arrarray(child, arr, max_size);
stu* temp = arr[0];
for (int i = 0; i < numstu; i++)
{
arrstu[i] = temp->id;
temp = temp->next;
}
mpstu(arrstu,arr, numstu);
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
for (int a = 0; a < numstu; a++)
{
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", arr[a]->id, arr[a]->name, arr[a]->sex, arr[a]->age, arr[a]->math, arr[a]->eng, arr[a]->cyy);
}
}
//输出所有学生信息
void printstu(stu* child)
{
printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
stu* hand = child->next;
while (hand != NULL)
{
printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", hand->id, hand->name, hand->sex, hand->age, hand->math, hand->eng, hand->cyy);
hand = hand->next;
}
}