某非空单链表L中的所有元素为整数,设计一个算法将所有小于10的结点移到所有大于等于10的结点的前面,用C语言
时间: 2024-11-04 19:10:11 浏览: 9
在C语言中,我们可以设计一个遍历单链表并操作节点的过程来完成这个任务。这里是一个简单的算法实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入新节点
Node* insert(Node* head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = head;
return newNode;
}
// 合并两个部分的链表
void mergeLists(Node** start, Node** end) {
if (*start == NULL || *end == NULL)
return;
// 将小值链表插入大值链表之前
if ((*start)->data < (*end)->data) {
Node* temp = *start;
while (temp != NULL && temp->data < 10) {
Node* current = temp->next;
temp->next = *end;
temp = current;
}
if (temp != NULL) { // 如果小值链表还有剩余
temp->next = *start; // 然后把剩下的链接回去
} else {
*start = *end; // 如果小值链表已清空,则直接指向大值链表头
}
} else {
mergeLists(start, &(*start)->next);
}
}
// 主函数示例
int main() {
Node* listHead = NULL; // 初始化链表头部为空
Node* node;
// 添加一些节点到链表
for (int i = 5; i <= 20; ++i) {
node = insert(listHead, i);
}
// 将小于10的节点移到大于等于10的节点前面
mergeLists(&listHead, NULL);
// 打印调整后的链表
Node* temp = listHead;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
return 0;
}
阅读全文