用c语言链表知识编写一个学生成绩统计程序,要求能录入学生姓名学号成绩,并能依据平均分由大到小插入排序
时间: 2024-02-03 13:13:18 浏览: 72
下面是一个示例程序,实现了链表存储学生信息,并按照平均分由大到小进行插入排序。具体实现中,每个节点表示一个学生,包含学号、姓名和成绩三个字段。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
char id[20]; // 学号
char name[30]; // 姓名
float score; // 成绩
struct student *next; // 下一个节点指针
};
// 插入一个节点到链表中,按照平均分由大到小排序
void insert(struct student **head, struct student *node) {
struct student *prev = NULL;
struct student *curr = *head;
while (curr != NULL && curr->score > node->score) {
prev = curr;
curr = curr->next;
}
if (prev == NULL) {
node->next = *head;
*head = node;
} else {
prev->next = node;
node->next = curr;
}
}
// 打印链表中的所有节点
void print_list(struct student *head) {
struct student *curr = head;
while (curr != NULL) {
printf("%s %s %.2f\n", curr->id, curr->name, curr->score);
curr = curr->next;
}
}
int main() {
struct student *head = NULL;
char id[20], name[30];
float score;
int n;
printf("请输入学生人数:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的学号、姓名和成绩:", i + 1);
scanf("%s %s %f", id, name, &score);
struct student *node = (struct student *)malloc(sizeof(struct student));
strcpy(node->id, id);
strcpy(node->name, name);
node->score = score;
node->next = NULL;
insert(&head, node);
}
printf("按照平均分由大到小排名结果如下:\n");
print_list(head);
return 0;
}
```
注意,这里的链表插入排序是按照平均分由大到小进行排序的,而不是按照某个字段的字典序或数值大小进行排序。如果需要按照其他字段排序,可以在 `insert` 函数中对比相应的字段并进行调整。
阅读全文