编写一个C语言程序,以单链表的首结点值x为基准,将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前。 并输出运行结果。并输出结果。
时间: 2024-09-28 10:03:45 浏览: 32
在C语言中,你可以使用指针和循环来实现这个功能。以下是一个简单的示例程序,它假设链表节点结构包含一个整数值和指向下一个节点的指针:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 合并链表
void splitList(Node** head, int x) {
if (*head == NULL || (*head)->data >= x) {
return; // 如果链表为空或头节点的数据大于等于x,直接返回
}
Node* lessThanX = *head;
Node* equalOrGreater = (*head)->next;
while (equalOrGreater != NULL) {
if (equalOrGreater->data < x) {
lessThanX->next = equalOrGreater->next;
equalOrGreater->next = NULL;
} else {
break; // 找到第一个大于或等于x的节点,跳出循环
}
lessThanX = equalOrGreater;
equalOrGreater = equalOrGreater->next;
}
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 创建链表示例数据
Node* list = createNode(5); // 初始链表:5 -> NULL
list = createNode(3); // 链接新的节点:3 -> 5 -> NULL
list = createNode(7); // 链接新的节点:3 -> 5 -> 7 -> NULL
// 分割链表
int x = 5;
splitList(&list, x);
// 输出分割后的链表
printf("List with elements less than or equal to %d: ", x);
printList(list);
// 输出剩余部分链表
if (lessThanX->next != NULL) { // 检查是否还有大于x的元素
printf("List with elements greater than %d: ", x);
printList(lessThanX->next);
} else {
printf("No elements greater than %d found in the original list.\n", x);
}
return 0;
}
```
当你运行这个程序,它会按照描述的方式分割链表,并打印出两个部分的结果。
阅读全文