1、写一个函数,实现链表的排序(使链表中元素的从无序到有序,要求从小到大)用c语言
时间: 2024-11-29 14:38:01 浏览: 57
在 C 语言中,链表排序通常采用归并排序(Merge Sort)算法,因为归并排序对链表操作比较友好,可以很好地处理插入操作。这里提供一个简化版的归并排序链表的例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 合并两个已排序的链表
ListNode* merge(ListNode* l1, ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
// 如果l1的小于l2,把l1的头结点接到结果链表
if (l1->val <= l2->val) {
l1->next = merge(l1->next, l2);
return l1;
} else {
l2->next = merge(l1, l2->next);
return l2;
}
}
// 归并排序链表
ListNode* sortList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head; // 基本情况:单个元素或空链表已经排序
}
// 找到中间节点
ListNode* slow = head;
ListNode* fast = head->next;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
// 分割链表
ListNode* mid = slow->next;
slow->next = NULL;
// 对两半分别递归排序并合并
ListNode* left = sortList(head);
ListNode* right = sortList(mid);
return merge(left, right);
}
// 打印链表
void printList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 创建示例链表
ListNode* unsortedList = malloc(sizeof(ListNode));
unsortedList->val = 5;
unsortedList->next = malloc(sizeof(ListNode));
unsortedList->next->val = 2;
unsortedList->next->next = malloc(sizeof(ListNode));
unsortedList->next->next->val = 8;
unsortedList->next->next->next = malloc(sizeof(ListNode));
unsortedList->next->next->next->val = 1;
unsortedList->next->next->next->next = malloc(sizeof(ListNode));
unsortedList->next->next->next->next->val = 4;
printf("Unsorted list: ");
printList(unsortedList);
ListNode* sortedList = sortList(unsortedList);
printf("Sorted list: ");
printList(sortedList);
return 0;
}
```
这个程序首先创建了一个未排序的链表,然后通过 `sortList` 函数应用归并排序。最后打印出排序后的链表。记得在使用之前检查内存分配是否成功。运行上述代码后,你应该会看到一个按升序排列的链表。
阅读全文