线性表的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。c语言源代码
时间: 2024-10-24 08:13:03 浏览: 29
线性表和链表的定义和使用
线性表应用到这个场景中,可以使用链表数据结构来存储正整数,并通过特定算法完成对链表的分割和合并。首先,我们需要创建一个递增的正整数链表,然后根据链表元素的奇偶性将其拆分成两个子链表。
以下是C语言的一个简化版实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点并初始化
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL) {
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
// 合并两个已排序链表成递减链表
Node* mergeSortedLists(Node* list1, Node* list2) {
if (list1 == NULL) return list2;
if (list2 == NULL) return list1;
// 比较两个链表头部并选择较小的那个
if (list1->data > list2->data) {
list1->next = mergeSortedLists(list1->next, list2);
return list1;
} else {
list2->next = mergeSortedLists(list1, list2->next);
return list2;
}
}
// 分解链表为奇数表和偶数表
void splitList(Node* head, Node** oddList, Node** evenList) {
Node* oddTemp = *oddList = NULL;
Node* evenTemp = *evenList = NULL;
Node* current = head;
while (current != NULL) {
if (current->data % 2 == 0) {
if (evenTemp == NULL) {
*evenList = current;
evenTemp = current->next;
} else {
evenTemp->next = current;
evenTemp = current->next;
}
} else {
if (oddTemp == NULL) {
*oddList = current;
oddTemp = current->next;
} else {
oddTemp->next = current;
oddTemp = current->next;
}
}
current = current->next;
}
}
int main() {
Node* inputList = createNode(1); // 示例链表,你可以在此处添加更多节点
// 其他操作...
Node* oddList = NULL;
Node* evenList = NULL;
splitList(inputList, &oddList, &evenList);
// 递减合并两个链表
Node* result = mergeSortedLists(oddList, evenList);
// 打印结果
while (result != NULL) {
printf("%d ", result->data);
result = result->next;
}
return 0;
}
```
在这个示例里,我们首先创建了一个链表,然后用`splitList`函数按奇偶性将其拆分为两个链表。最后,使用`mergeSortedLists`合并这两个子链表,形成一个递减的链表。
阅读全文