单链表选择排序c语言
时间: 2023-12-05 15:37:08 浏览: 141
好的,单链表选择排序的C语言实现可以分为以下几个步骤:
1. 定义链表节点结构体,包括数据域和指向下一个节点的指针域。
2. 定义链表排序函数,函数参数为链表头节点指针。
3. 在排序函数中,使用两个指针变量p和q,分别指向当前未排序部分的头节点和尾节点。
4. 在未排序部分中,找到最小值节点,并将其从未排序部分中删除。
5. 将最小值节点插入到已排序部分的尾部。
6. 重复步骤4和5,直到所有节点都被排序。
下面是单链表选择排序的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 定义链表排序函数
void selectionSortList(ListNode* head) {
ListNode *p = head, *q = NULL, *minNode = NULL, *minPrev = NULL;
while (p != NULL) {
minNode = p;
minPrev = NULL;
q = p->next;
while (q != NULL) {
if (q->val < minNode->val) {
minNode = q;
minPrev = p;
}
p = p->next;
q = q->next;
}
if (minNode != p) {
if (minPrev != NULL) {
minPrev->next = minNode->next;
} else {
head = minNode->next;
}
minNode->next = p;
if (p == head) {
head = minNode;
} else {
minPrev->next = minNode;
}
p = minNode;
} else {
p = p->next;
}
}
}
// 创建链表
ListNode* createList(int* nums, int numsSize) {
ListNode *head = NULL, *tail = NULL;
for (int i = 0; i < numsSize; i++) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = nums[i];
node->next = NULL;
if (head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
// 打印链表
void printList(ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
int nums[] = {3, 1, 4, 2, 5};
int numsSize = sizeof(nums) / sizeof(int);
ListNode *head = createList(nums, numsSize);
printf("Before sorting: ");
printList(head);
selectionSortList(head);
printf("After sorting: ");
printList(head);
return 0;
}
```
阅读全文