要解决这个问题,首先需要定义一个结构体来存储学生信息,然后使用单链表来存储这些信息。接下来,根据你的需求,我们将逐步实现插入、排序和逆序操作。 步骤1:定义结构体和链表节点 ```c #include <stdio.h> #include <stdlib.h> typedef struct Student { int id; char name[20]; int score; struct Student *next; } Student; Student *head = NULL; // 定义头节点 ``` 步骤2:初始化链表并插入初始学生信息 ```c void insertInitialStudents() { Student *newStudent, *current; newStudent = (Student *)malloc(sizeof(Student)); newStudent->id = 1; strcpy(newStudent->name, "王令"); newStudent->score = 98; newStudent->next = NULL; head = newStudent; current = head; for (int i = 2; i <= 9; i++) { newStudent = (Student *)malloc(sizeof(Student)); switch (i) { case 2: newStudent->id = 3; strcpy(newStudent->name, "张成"); newStudent->score = 67; break; case 3: newStudent->id = 5; strcpy(newStudent->name, "陈晨"); newStudent->score = 74; break; case 4: newStudent->id = 7; strcpy(newStudent->name, "王家"); newStudent->score = 82; break; case 5: newStudent->id = 2; strcpy(newStudent->name, "张都"); newStudent->score = 68; break; case 6: newStudent->id = 9; strcpy(newStudent->name, "万洪"); newStudent->score = 73; break; default: break; } if (i != 9) { newStudent->next = NULL; current->next = newStudent; current = newStudent; } } } ``` 步骤3:插入新学生信息 ```c void insertStudent(int id, char *name, int score) { Student *newStudent = (Student *)malloc(sizeof(Student)); newStudent->id = id; strcpy(newStudent->name, name); newStudent->score = score; newStudent->next = NULL; Student *current = head; while (current->next != NULL) { current = current->next; } current->next = newStudent; } ``` 步骤4:排序并输出 ```c void sortAndPrint() { Student *a, *b, *c; int tempId; char tempName[20]; int tempScore; for (a = head; a != NULL; a = a->next) { for (b = a->next; b != NULL; b = b->next) { if (a->score > b->score) { tempId = a->id; strcpy(tempName, a->name); tempScore = a->score; a->id = b->id; strcpy(a->name, b->name); a->score = b->score; b->id = tempId; strcpy(b->name, tempName); b->score = tempScore; } } } printf("Sorted List:\n"); for (c = head; c != NULL; c = c->next) { printf("%d %s %d\n", c->id, c->name, c->score); } } ``` 步骤5:逆序输出 ```c void reversePrint() { Student *current = head; if (current == NULL || current->next == NULL) return; Student *prev = NULL; Student *next = NULL; while (current != NULL) { next = current->next; current->next = prev; prev = current; current = next; } head = prev; printf("Reversed Sorted List:\n"); for (current = head; current != NULL; current = current->next) { printf("%d %s %d\n", current->id, current->name, current->score); } } int main() { insertInitialStudents(); insertStudent(12, "林嘉", 84); sortAndPrint(); reversePrint(); return 0; } ``` 以上代码实现了从初始化链表、插入新学生信息、排序并输出,再到逆序输出的全部功能。注意,这里的排序是基于分数从小到大的顺序进行的,而逆序输出则是将排序后的链表反转,使得分数从大到小排列。 [2024-07-22 16:25:54 | AI写代码神器 | 1067点数解答]