将单链表按基准划分。以单链表的首结点值x为基准将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前。c语言代码
时间: 2024-09-25 13:09:42 浏览: 75
在C语言中,你可以通过遍历链表并维护两个指针分别指向小于和大于等于基准值的部分,来实现这个功能。以下是简单的步骤和代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入节点到链表
void insert(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
// 遍历链表并分割
void splitList(Node** head, int x, Node** lessThanX, Node** greaterEqualX) {
Node* current = *head;
Node* lessHead = *lessThanX;
Node* greaterHead = *greaterEqualX;
while (current != NULL) {
if (current->data < x) { // 如果当前节点值小于x,添加到lessHead链表
lessHead->next = current;
lessHead = lessHead->next;
}
else { // 否则添加到greaterHead链表
greaterHead->next = current;
greaterHead = greaterHead->next;
}
current = current->next; // 移动到下一个节点
}
// 结束遍历后,lessHead需要链接到greaterHead
lessHead->next = *greaterHead;
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
Node* head = NULL;
Node* lessThanX = NULL;
Node* greaterEqualX = NULL;
// 初始化链表和插入元素
insert(&head, 5);
insert(&head, 3);
insert(&head, 8);
insert(&head, 2);
insert(&head, 7);
// 指定基准值
int x = 6;
splitList(&head, x, &lessThanX, &greaterEqualX);
printf("链表 (<= %d):", x);
printList(lessThanX);
printf("\n链表 (>= %d):", x);
printList(greaterEqualX);
return 0;
}
```
在这个代码中,`splitList`函数会根据给定的基准值x,创建两个新的链表,一个包含所有小于x的节点,另一个包含所有大于等于x的节点。运行这段代码后,你会看到原始链表被正确地按照基准值进行了划分。
阅读全文