使用C语言写一个函数,实现链表的排序(使链表中元素的从无序到有序,要求从小到大
时间: 2023-07-25 20:27:32 浏览: 312
链表排序算法——C语言实现
5星 · 资源好评率100%
好的,下面是一个基于插入排序的链表排序的示例代码,使用C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
ListNode* insertionSortList(ListNode* head) {
// 如果链表为空或只有一个节点,直接返回
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* dummy = (ListNode*)malloc(sizeof(ListNode)); // 创建一个虚拟头节点
dummy->next = head;
ListNode* lastSorted = head; // 表示已经有序的链表尾节点
ListNode* cur = lastSorted->next; // 表示待排序的节点
while (cur) {
if (lastSorted->val <= cur->val) { // 如果已排序节点的值小于等于待排序节点的值,则直接更新lastSorted指针
lastSorted = lastSorted->next;
} else { // 否则需要在已排序链表中找到待排序节点的插入位置
ListNode* prev = dummy;
while (prev->next->val <= cur->val) { // 寻找待排序节点的插入位置
prev = prev->next;
}
lastSorted->next = cur->next; // 先将待排序节点从原位置删除
cur->next = prev->next; // 将待排序节点插入到prev和prev->next之间
prev->next = cur;
}
cur = lastSorted->next;
}
return dummy->next;
}
// 创建一个链表
ListNode* createList(int* arr, int n) {
if (n == 0) { // 如果数组为空,返回NULL
return NULL;
}
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->val = arr[0];
head->next = NULL;
ListNode* cur = head;
for (int i = 1; i < n; i++) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = arr[i];
newNode->next = NULL;
cur->next = newNode;
cur = cur->next;
}
return head;
}
// 打印链表
void printList(ListNode* head) {
ListNode* cur = head;
while (cur) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
int arr[] = {4, 2, 1, 3};
int n = sizeof(arr) / sizeof(int);
ListNode* head = createList(arr, n);
printf("排序前:");
printList(head);
ListNode* sortedHead = insertionSortList(head);
printf("排序后:");
printList(sortedHead);
return 0;
}
```
在这个示例代码中,我们使用了插入排序的思想,每次将一个待排序节点插入到已排序链表的合适位置。时间复杂度为 $O(n^2)$。
希望这个示例代码能够帮助你实现链表的排序。
阅读全文