写一份C语言带表头结点单链表的排序代码
时间: 2024-10-04 19:03:26 浏览: 33
在C语言中,我们可以通过定义结构体表示链表节点,然后编写函数对链表进行排序。这里以冒泡排序为例,展示如何对带有表头结点的单链表进行升序排列:
首先,我们需要定义链表节点结构体和链表结构体:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 定义链表结构体
typedef struct LinkedList {
ListNode* head;
} LinkedList;
```
接下来是插入节点、比较元素以及冒泡排序链表的函数:
```c
// 插入节点到链表尾部
void insert(LinkedList* list, int value) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = value;
newNode->next = NULL;
if (list->head == NULL) {
list->head = newNode;
} else {
ListNode* temp = list->head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
// 比较两个节点并交换它们的位置(用于冒泡排序)
void swapNodes(ListNode** a, ListNode** b) {
int temp = (*a)->data;
(*a)->data = (*b)->data;
(*b)->data = temp;
}
// 冒泡排序链表节点
void bubbleSortList(LinkedList* list) {
ListNode* temp = list->head;
ListNode* lastUnsorted = NULL;
while (temp != NULL && temp->next != NULL) {
for (ListNode* current = temp; current->next != NULL; current = current->next) {
// 如果当前节点的数据大于下一个节点的数据,交换它们的位置
if (current->data > current->next->data) {
swapNodes(¤t, ¤t->next);
}
// 更新lastUnsorted的位置,如果相邻两个节点未排序,则lastUnsorted更新为当前节点
if (current->data > lastUnsorted->data) {
lastUnsorted = current;
}
}
// 当一轮遍历结束后,最后一个未排序的节点会变成已排序的,移动temp到lastUnsorted后一位
temp = lastUnsorted->next;
lastUnsorted->next = NULL;
}
}
```
最后,我们可以创建一个链表并调用这些函数进行排序:
```c
int main() {
LinkedList list;
list.head = NULL;
// 插入一些数据
insert(&list, 5);
insert(&list, 2);
insert(&list, 7);
insert(&list, 1);
insert(&list, 9);
printf("Original list: ");
printList(&list); // 打印原始链表
bubbleSortList(&list);
printf("\nSorted list: ");
printList(&list); // 打印排序后的链表
return 0;
}
```
这里的`printList`函数用来打印链表的节点,你可以根据需要自己实现。
阅读全文