有n个记录存储在带头结点的双向链表中,现用双向冒泡排序法对其按升序进行排序,请用c语言写出这种排序算法并给出测试结果
时间: 2024-03-17 13:47:38 浏览: 116
好的,这是一个双向冒泡排序的C语言实现:
```c
#include <stdio.h>
struct ListNode {
int val;
struct ListNode *next;
struct ListNode *prev;
};
void swap(struct ListNode *a, struct ListNode *b) {
int tmp = a->val;
a->val = b->val;
b->val = tmp;
}
void bubbleSort(struct ListNode *head) {
if (!head || !head->next) {
return;
}
int swapped;
struct ListNode *p, *q, *last = NULL;
do {
swapped = 0;
p = head->next;
while (p->next != last) {
q = p->next;
if (p->val > q->val) {
swap(p, q);
swapped = 1;
}
p = p->next;
}
last = p;
p = p->prev;
while (p != head && p->next != last) {
q = p->prev;
if (p->val < q->val) {
swap(p, q);
swapped = 1;
}
p = p->prev;
}
last = p;
} while (swapped);
}
int main() {
struct ListNode n1 = {4, NULL, NULL};
struct ListNode n2 = {3, NULL, NULL};
struct ListNode n3 = {1, NULL, NULL};
struct ListNode n4 = {2, NULL, NULL};
n1.next = &n2;
n2.prev = &n1;
n2.next = &n3;
n3.prev = &n2;
n3.next = &n4;
n4.prev = &n3;
struct ListNode *p = &n1;
printf("before sorting: ");
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
bubbleSort(&n1);
p = &n1;
printf("after sorting: ");
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
return 0;
}
```
本代码先定义了一个双向链表的结构体`ListNode`,其中包括了一个整型的值,以及指向前一个和后一个节点的指针。然后,定义了一个`swap`函数用于交换两个节点的值。最后,实现了一个`bubbleSort`函数,使用双向冒泡排序算法对链表进行排序。最后在`main`函数中创建了一个测试链表,并对其进行排序,然后打印出排序前后的值。
测试结果如下:
```
before sorting: 4 3 1 2
after sorting: 1 2 3 4
```
可以看到,链表已经按照升序排列。
阅读全文