C语言使用链表实现冒泡排序代码实现
时间: 2023-09-09 13:05:17 浏览: 161
使用C语言实现冒泡排序
### 回答1:
C语言使用链表实现冒泡排序的代码实现如下:
struct listNode {
int data;
struct listNode *next;
};
void BubbleSort(struct listNode* head) {
struct listNode *p, *q;
int temp;
if (head == NULL || head->next == NULL) return;
for (p = head; p->next != NULL; p = p->next) {
for (q = head; q->next != NULL; q = q->next) {
if (q->data > q->next->data) {
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
}
}
}
### 回答2:
下面是用C语言实现冒泡排序算法的链表形式的代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
if (newNode == NULL) {
printf("内存分配失败\n");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
struct Node* insertNode(struct Node* head, int data) {
if (head == NULL) {
return createNode(data);
} else {
struct Node* newNode = createNode(data);
newNode->next = head;
return newNode;
}
}
struct Node* bubbleSort(struct Node* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct Node* current;
struct Node* next;
int swapped;
do {
swapped = 0;
current = head;
while (current->next != NULL) {
next = current->next;
if (current->data > next->data) {
int temp = current->data;
current->data = next->data;
next->data = temp;
swapped = 1;
}
current = next;
}
} while (swapped);
return head;
}
void printList(struct Node* head) {
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
struct Node* head = NULL;
int n, data;
printf("请输入要排序的数字个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个数字:", i+1);
scanf("%d", &data);
head = insertNode(head, data);
}
printf("排序前的链表:");
printList(head);
head = bubbleSort(head);
printf("排序后的链表:");
printList(head);
return 0;
}
```
以上代码创建了一个称为 Node 的结构体,表示链表中的节点。`createNode` 函数用于创建新的节点,`insertNode` 函数用于向链表插入节点。`bubbleSort` 函数用于实现冒泡排序算法并返回排好序的链表头节点。
在主函数中,首先获取要排序的数字个数,并逐个插入到链表中。然后调用 `bubbleSort` 对链表进行排序,最后打印排序前和排序后的链表。
请注意,这里的冒泡排序算法是从头节点开始两两比较相邻节点的值,如果顺序不对则交换。算法会一直遍历链表直到没有发生交换操作,即达到最佳排序顺序为止。
### 回答3:
冒泡排序是一种简单的排序算法,通过反复交换相邻元素的位置来实现排序。使用链表实现冒泡排序需要以下步骤:
1. 定义链表节点结构体,包含一个整型数据域和一个指向下一个节点的指针域。
2. 创建链表,并向其中插入待排序的元素。
3. 定义一个排序函数,用于对链表进行冒泡排序。函数内部使用两层循环,外层循环遍历链表的节点个数次,内层循环进行相邻节点的比较和交换操作。
在内层循环中,如果当前节点的数据大于下一个节点的数据,则交换它们的位置;否则,继续比较下一对节点。
通过这样的循环操作,每次内层循环结束后,链表最后的节点就是当前未排序部分的最大值。
外层循环重复执行该过程,每次只需要遍历到上一轮未排序部分的前一个节点。
4. 在排序函数中添加适当的边界判断和指针操作,确保链表正确排序。
5. 输出排序后的链表。
以下是一个使用链表实现冒泡排序的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node* next; // 指针域
} Node;
// 创建链表
Node* createList(int arr[], int size) {
Node* head = NULL;
Node* tail = NULL;
for (int i = 0; i < size; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 冒泡排序
void bubbleSort(Node* head) {
if (head == NULL || head->next == NULL) {
return;
}
Node* p;
Node* q = NULL;
int swapped;
do {
swapped = 0;
p = head;
while (p->next != q) {
if (p->data > p->next->data) {
int temp = p->data;
p->data = p->next->data;
p->next->data = temp;
swapped = 1;
}
p = p->next;
}
q = p;
} while (swapped);
}
// 打印链表
void printList(Node* head) {
Node* p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int arr[] = {4, 2, 6, 3, 1, 5};
int size = sizeof(arr) / sizeof(arr[0]);
Node* head = createList(arr, size);
bubbleSort(head);
printList(head);
return 0;
}
```
运行结果为:1 2 3 4 5 6,表示链表已经成功按照升序进行冒泡排序。
阅读全文