请用c语言链表写一个学生成绩管理系统,要求能录入学生的姓名,学号,各科的分数,计算学生平均分并依靠平均分可以进行排名查询
时间: 2023-07-15 12:10:37 浏览: 107
c语言基于链表的学生成绩管理系统
以下是我写的一个简单的学生成绩管理系统,使用了链表来存储学生信息和成绩,使用了结构体来表示学生信息和成绩:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20 // 最大姓名长度
#define MAX_ID_LEN 10 // 最大学号长度
#define MAX_SUBJECTS 5 // 最大科目数
// 学生信息结构体
typedef struct student_info {
char name[MAX_NAME_LEN + 1]; // 姓名
char id[MAX_ID_LEN + 1]; // 学号
float scores[MAX_SUBJECTS]; // 各科成绩
float avg_score; // 平均分
struct student_info *next; // 链表指针
} StudentInfo;
// 创建新的学生信息节点
StudentInfo *create_student_info_node() {
StudentInfo *node = (StudentInfo *)malloc(sizeof(StudentInfo));
memset(node, 0, sizeof(StudentInfo));
node->next = NULL;
return node;
}
// 从键盘输入一个学生信息
void input_student_info(StudentInfo *node) {
printf("请输入学生姓名:");
scanf("%s", node->name);
printf("请输入学生学号:");
scanf("%s", node->id);
printf("请输入各科成绩(共 %d 科):\n", MAX_SUBJECTS);
for (int i = 0; i < MAX_SUBJECTS; i++) {
printf("请输入第 %d 科成绩:", i + 1);
scanf("%f", &node->scores[i]);
}
// 计算平均分
float total_score = 0;
for (int i = 0; i < MAX_SUBJECTS; i++) {
total_score += node->scores[i];
}
node->avg_score = total_score / MAX_SUBJECTS;
}
// 打印一个学生信息
void print_student_info(StudentInfo *node) {
printf("%s\t%s\t", node->name, node->id);
for (int i = 0; i < MAX_SUBJECTS; i++) {
printf("%.1f\t", node->scores[i]);
}
printf("%.1f\n", node->avg_score);
}
// 打印所有学生信息
void print_all_student_info(StudentInfo *head) {
printf("姓名\t学号\t");
for (int i = 0; i < MAX_SUBJECTS; i++) {
printf("科目%d\t", i + 1);
}
printf("平均分\n");
StudentInfo *node = head->next;
while (node) {
print_student_info(node);
node = node->next;
}
}
// 按平均分对学生信息进行排序
void sort_student_info_by_avg_score(StudentInfo *head) {
StudentInfo *p, *q, *pre;
int i, j;
for (i = 0, p = head->next; p; i++, p = p->next) {
for (j = 0, pre = head, q = pre->next; j < i; j++, pre = pre->next, q = q->next) {
if (p->avg_score > q->avg_score) {
pre->next = p;
head->next = p->next;
p->next = q;
break;
}
}
}
}
// 根据排名查询学生信息
void query_student_info_by_rank(StudentInfo *head) {
printf("请输入排名:");
int rank;
scanf("%d", &rank);
if (rank < 1) {
printf("无效排名!\n");
return;
}
StudentInfo *node = head->next;
for (int i = 1; node; i++, node = node->next) {
if (i == rank) {
printf("第 %d 名学生信息:\n", rank);
print_student_info(node);
return;
}
}
printf("排名超过学生总数!\n");
}
int main() {
// 创建头节点
StudentInfo *head = create_student_info_node();
// 录入学生信息
printf("请输入学生数量:");
int count;
scanf("%d", &count);
for (int i = 0; i < count; i++) {
StudentInfo *node = create_student_info_node();
printf("请输入第 %d 个学生信息:\n", i + 1);
input_student_info(node);
// 将新节点插入链表尾部
StudentInfo *tail = head;
while (tail->next) {
tail = tail->next;
}
tail->next = node;
}
// 按平均分排序
sort_student_info_by_avg_score(head);
// 打印所有学生信息
printf("所有学生信息(按平均分排序):\n");
print_all_student_info(head);
// 根据排名查询学生信息
query_student_info_by_rank(head);
// 释放所有节点内存
StudentInfo *node = head->next;
while (node) {
StudentInfo *next = node->next;
free(node);
node = next;
}
free(head);
return 0;
}
```
这个程序可以先输入学生数量,然后逐个录入每个学生的姓名、学号和各科成绩。录入完成后会按照平均分对学生信息进行排序,并输出所有学生信息。然后可以通过输入排名来查询某个学生的信息。
阅读全文