用C语言 尝试通过线性链表实现按照学生成绩排序的在线排序,并且利用文件操作避免接下来的问题重复进行输入操作
时间: 2024-05-11 22:14:06 浏览: 9
注:以下代码为较完整的程序示例,仅供参考,具体实现方式可能因人而异。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_LENGTH 20
// 定义学生结构体
typedef struct Student {
char name[MAX_NAME_LENGTH];
int score;
struct Student *next;
} Student;
// 插入学生节点,按照分数从高到低排序
void insert(Student **head, Student *newNode) {
Student *cur = *head;
Student *prev = NULL;
while (cur && cur->score > newNode->score) {
prev = cur;
cur = cur->next;
}
if (!prev) {
newNode->next = *head;
*head = newNode;
} else {
newNode->next = cur;
prev->next = newNode;
}
}
// 读取学生信息文件,返回学生链表头节点
Student *readFile(char *filename) {
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL) {
printf("Error opening file.\n");
exit(1);
}
Student *head = NULL;
char name[MAX_NAME_LENGTH];
int score;
while (fscanf(fp, "%s %d", name, &score) != EOF) {
Student *newNode = (Student *)malloc(sizeof(Student));
if (!newNode) {
printf("Memory allocation error.\n");
exit(1);
}
strcpy(newNode->name, name);
newNode->score = score;
newNode->next = NULL;
insert(&head, newNode);
}
fclose(fp);
return head;
}
// 打印学生信息
void print(Student *head) {
printf("Name\tScore\n");
while (head) {
printf("%s\t%d\n", head->name, head->score);
head = head->next;
}
}
int main() {
char filename[] = "students.txt";
Student *head = readFile(filename);
print(head);
return 0;
}
```