用c语言构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表
时间: 2024-10-24 11:08:01 浏览: 25
在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 = NULL;
if (*head == NULL) {
*head = newNode;
} else {
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
return *head;
}
// 判断是否为偶数
int is_even(int num) {
return num % 2 == 0;
}
// 分解链表为奇数链表和偶数链表
void split_list(Node** odd_head, Node** even_head, Node* input) {
Node* current = input;
while (current != NULL) {
if (is_even(current->data)) {
insert(even_head, current->data);
} else {
insert(odd_head, current->data);
}
current = current->next;
}
}
// 合并奇偶链表成递减链表
Node* merge_decreasing(Node* odd_head, Node* even_head) {
if (odd_head == NULL) return even_head;
if (even_head == NULL) return odd_head;
if (odd_head->data > even_head->data) {
odd_head->next = merge_decreasing(odd_head->next, even_head);
return odd_head;
} else {
even_head->next = merge_decreasing(odd_head, even_head->next);
return even_head;
}
}
// 打印链表
void print_list(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
Node* inputHead = NULL; // 初始化输入链表
// ... 具体填充输入链表 ...
Node* oddListHead = NULL;
Node* evenListHead = NULL;
split_list(&oddListHead, &evenListHead, inputHead);
Node* mergedHead = merge_decreasing(oddListHead, evenListHead);
print_list(mergedHead); // 输出结果
return 0;
}
```
在`main`函数里,你需要提供一个已经排序的递增正整数链表作为`inputHead`,然后调用上述函数完成链表的分解和合并。注意,这个程序假设输入链表是非空且已排序的。
阅读全文