C语言程序设计代码,根据线性表的链式存储按学号对学生信息排序
时间: 2024-09-13 22:12:40 浏览: 50
在C语言中,对链表进行按学号排序通常会涉及到结构体、链表节点以及自定义比较函数。下面是一个基本的例子,假设我们有一个`Student`结构体,包含学号`id`和姓名`name`,以及链表结构`Node`:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int id; // 学号
char name[50]; // 姓名
struct Node* next;
} Student;
// 比较函数,用于qsort中的元素比较
int compareStudents(const void *a, const void *b) {
return (*(const Student*)a).id - (*(const Student*)b).id;
}
// 合并两个已排序的链表
void mergeSorted(Student **head, Student **other) {
if (*head == NULL || (*other == NULL && (*other != (Student *)NULL))) {
if (*other != NULL)
*head = *other;
else
return;
} else if (*((Student *)other)->id <= *((Student *)head)->id) {
(*other)->next = *head;
*head = *other;
}
mergeSorted(&(*head)->next, other);
}
// 对链表进行排序
void sortStudents(Student **head) {
qsort(*head, 1, sizeof(Student), compareStudents); // 使用快速排序算法
Student *aux = NULL;
while (*head != NULL) {
aux = *head->next;
free(head);
head = aux;
}
// 重构链表
mergeSorted(head, &aux);
}
// 添加学生到链表
void addStudent(Student** head, int id, char name[]) {
Student* newNode = (Student*)malloc(sizeof(Student));
newNode->id = id;
strcpy(newNode->name, name);
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
Student* current = *head;
while (current->next != NULL && current->next->id < id) {
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
// 打印链表
void printList(Student *head) {
while (head != NULL) {
printf("学号:%d 姓名:%s\n", head->id, head->name);
head = head->next;
}
}
int main() {
// 初始化链表并添加学生数据,然后按学号排序
Student *students = NULL;
// ... (添加学生代码)
sortStudents(&students);
printList(students);
return 0;
}
```
在这个例子中,首先定义了链表节点和相关的操作,如添加学生、打印链表等。然后通过`compareStudents`函数实现了按照学号的升序排序,最后使用`sortStudents`函数对整个链表进行排序。
阅读全文