帮我写一个C语言代码,动态链表排序用冒泡法排序
时间: 2023-05-26 08:02:47 浏览: 139
以下是一个用C语言的动态链表排序代码,使用冒泡排序法:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data; // 存储的数据
struct node *next; // 下一个节点的指针
} Node, *NodePtr;
NodePtr createNode(int data) {
NodePtr newNode = (NodePtr)malloc(sizeof(Node)); // 分配内存空间
newNode->data = data; // 存储数据
newNode->next = NULL; // 初始化下一个节点的指针为 NULL
return newNode;
}
NodePtr insertNode(NodePtr list, NodePtr newNode) {
if (list == NULL) { // 链表为空,插入新节点
list = newNode;
} else {
NodePtr cur = list;
NodePtr pre = NULL;
while (cur != NULL) { // 找到需要插入的位置
if (newNode->data < cur->data) {
break;
}
pre = cur; // 保存当前节点
cur = cur->next; // 遍历链表
}
if (pre == NULL) { // 插入链表头部
newNode->next = list;
list = newNode;
} else { // 插入链表中间或尾部
pre->next = newNode;
newNode->next = cur;
}
}
return list;
}
void printList(NodePtr list) {
NodePtr cur = list;
while (cur != NULL) {
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
NodePtr bubbleSort(NodePtr list) {
NodePtr cur = list;
NodePtr pre = NULL;
NodePtr tail = NULL;
if (list == NULL || list->next == NULL) { // 链表为空或只有一个节点,不需要排序
return list;
}
while (tail != list->next) { // 冒泡排序
pre = list;
cur = list->next;
while (cur != tail) {
if (cur->data < pre->data) { // 交换相邻节点的数据
int temp = cur->data;
cur->data = pre->data;
pre->data = temp;
}
pre = cur; // 遍历链表
cur = cur->next;
}
tail = pre; // 更新尾节点
}
return list;
}
int main() {
int n, data;
NodePtr list = NULL;
printf("请输入链表节点个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个节点的数值:", i+1);
scanf("%d", &data);
NodePtr newNode = createNode(data); // 创建新节点
list = insertNode(list, newNode); // 插入新节点
}
printf("排序前的链表:");
printList(list);
list = bubbleSort(list); // 使用冒泡排序法排序链表
printf("排序后的链表:");
printList(list);
return 0;
}
```
阅读全文