1、定义一个学生结构体,包括学号、姓名和分数三个数据分量。 4、从键盘上输入10个学生的信息(使用第1步中定义的结构体),存放到一个学生链表中 5、写一个函数对以上链表中的学生按分数进行排序(以链表头指针为参数)。
时间: 2024-10-07 16:00:55 浏览: 27
首先,我们可以定义一个名为`Student`的结构体来表示学生,包含学号、姓名和分数这三个属性:
```c
struct Student {
int id;
char name[50];
float score;
};
```
接下来,我们需要编写一个函数来输入10个学生的信息并将它们放入链表中。这里我们假设有一个名为`createStudentList`的函数,它接收一个`Student**`类型的参数,代表链表的头指针:
```c
void createStudentList(struct Student **head) {
int number;
printf("请输入学生数量:");
scanf("%d", &number);
if (*head == NULL) {
*head = (struct Student *)malloc(sizeof(struct Student));
(*head)->id = -1; // 首节点特殊标记,便于后续查找
(*head)->score = 0.0f;
}
for (int i = 0; i < number; i++) {
struct Student *newStudent = (struct Student *)malloc(sizeof(struct Student));
printf("请输入学生 %d 的信息:\n", i + 1);
scanf("%d", &newStudent->id);
fgets(newStudent->name, sizeof(newStudent->name), stdin); // 使用fgets防止换行符影响输入
newStudent->score = (float)scanf("%f", &newStudent->score); // 转换输入的整数分数为浮点数
// 将新学生插入链表
if (*head == NULL) {
(*head) = newStudent;
} else {
struct Student *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newStudent;
}
}
}
```
现在我们有了一个链表,想要按分数对学生进行排序,可以创建一个辅助函数,如`sortStudentsByScore`,接受链表头指针作为参数,采用冒泡排序或归并排序等算法:
```c
// 假设这里使用冒泡排序简化演示,实际项目中建议使用更高效的排序算法
void sortStudentsByScore(struct Student **head) {
if (*head == NULL || (*head)->next == NULL) {
return;
}
struct Student *temp = *head;
while (temp->next != NULL) {
for (struct Student *current = *head; current->next != NULL; current = current->next) {
if (current->score > current->next->score) {
struct Student *tempTemp = current->next;
current->next = tempTemp->next;
tempTemp->next = current;
current = tempTemp;
}
}
temp = current;
}
}
```
最后,调用这两个函数即可:
```c
int main() {
struct Student *studentListHead = NULL;
createStudentList(&studentListHead);
sortStudentsByScore(&studentListHead);
// 打印排序后的学生列表
printStudentList(studentListHead);
return 0;
}
// 示例:打印链表中的学生
void printStudentList(struct Student *head) {
while (head != NULL) {
printf("学号:%d, 姓名:%s, 分数:%f\n", head->id, head->name, head->score);
head = head->next;
}
}
```
阅读全文