c语言实现对链表进行冒泡排序
时间: 2023-10-13 21:29:08 浏览: 105
用C语言来实现冒泡排序
以下是C语言实现对链表进行冒泡排序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 定义链表节点创建函数
struct ListNode* createNode(int val) {
struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 定义链表插入函数
void insertNode(struct ListNode **head, int val) {
struct ListNode *node = createNode(val);
if (*head == NULL) {
*head = node;
} else {
struct ListNode *cur = *head;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = node;
}
}
// 定义链表打印函数
void printList(struct ListNode *head) {
struct ListNode *cur = head;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
// 定义链表冒泡排序函数
void bubbleSortList(struct ListNode *head) {
if (head == NULL || head->next == NULL) {
return;
}
struct ListNode *cur = head;
while (cur != NULL) {
struct ListNode *prev = NULL;
struct ListNode *next = cur->next;
while (next != NULL) {
if (cur->val > next->val) {
if (prev != NULL) {
prev->next = next;
} else {
head = next;
}
cur->next = next->next;
next->next = cur;
prev = next;
next = cur->next;
} else {
prev = cur;
cur = next;
next = next->next;
}
}
cur = head;
}
}
int main() {
struct ListNode *head = NULL;
insertNode(&head, 3);
insertNode(&head, 1);
insertNode(&head, 4);
insertNode(&head, 2);
printf("Before sort: ");
printList(head);
bubbleSortList(head);
printf("After sort: ");
printList(head);
return 0;
}
```
以上代码中,我们首先定义了链表节点的结构体,并实现了链表节点的创建、插入和打印函数。然后我们定义了链表冒泡排序的函数,具体实现如下:
1. 如果链表为空或只有一个节点,则直接返回。
2. 从头节点开始遍历链表,对于每个节点cur,从cur的下一个节点next开始遍历链表。
3. 如果cur的值大于next的值,则交换cur和next的位置,即将next节点插入到cur节点之前。
4. 接着继续从cur的下一个节点开始遍历链表,直到链表尾部。
5. 重复以上步骤,直到链表中所有节点都被遍历过。
最后在main函数中,我们创建了一个未排序的链表,然后调用bubbleSortList函数进行排序,并打印排序后的结果。
阅读全文