循环单链表的冒泡排序 c语言
时间: 2023-05-27 11:05:24 浏览: 121
冒泡排序的C语言实现
以下是循环单链表的冒泡排序的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义循环单链表的结构体
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkedList;
// 创建循环单链表
LinkedList createLinkedList(int n) {
LinkedList head = (LinkedList) malloc(sizeof(Node)); // 创建头结点
head->next = head; // 初始化头结点的next指针指向自身
LinkedList p = head; // 创建指向头结点的指针p
int i, data;
for (i = 0; i < n; i++) {
printf("请输入第%d个数据:", i + 1);
scanf("%d", &data);
LinkedList q = (LinkedList) malloc(sizeof(Node)); // 创建新节点
q->data = data; // 新节点的数据为输入的数据
q->next = p->next; // 新节点的next指针指向头结点的下一个节点
p->next = q; // 头结点的next指针指向新节点
p = q; // p指向新节点
}
return head;
}
// 输出循环单链表
void printLinkedList(LinkedList head) {
LinkedList p = head->next;
while (p != head) {
printf("%d ", p->data);
p = p->next;
}
}
// 冒泡排序
void bubbleSort(LinkedList head) {
LinkedList p = head->next;
while (p->next != head) {
LinkedList q = p->next;
while (q != head) {
if (p->data > q->data) {
int temp = p->data;
p->data = q->data;
q->data = temp;
}
q = q->next;
}
p = p->next;
}
}
int main() {
int n;
printf("请输入循环单链表的节点个数:");
scanf("%d", &n);
LinkedList head = createLinkedList(n); // 创建循环单链表
printf("排序前:");
printLinkedList(head); // 输出排序前的循环单链表
bubbleSort(head); // 对循环单链表进行冒泡排序
printf("\n排序后:");
printLinkedList(head); // 输出排序后的循环单链表
return 0;
}
```
注意,在循环单链表中,头结点的next指针指向的是第一个节点,所以在访问循环单链表时,需要从头结点的下一个节点开始访问。在冒泡排序中,需要两个指针p和q分别指向相邻的两个节点,如果p的数据比q的数据大,则交换它们的数据。循环单链表的冒泡排序的时间复杂度为O(n^2)。
阅读全文