线性表的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。用c语言
时间: 2024-10-27 15:08:08 浏览: 23
线性表(如单链表)在构建递增有序的正整数链表、链表划分以及合并操作中可以有多种应用。以下是用C语言实现这一过程的一个简单步骤:
首先,我们需要创建一个结构体表示链表节点,包含数值和指向下一个节点的指针:
```c
typedef struct ListNode {
int value;
struct ListNode* next;
} ListNode;
```
1. **构造递增有序正整数链表**:
- 可以从用户输入或预设数组开始,遍历并插入到链表中。
```c
void insertToList(ListNode** head, int num) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->value = num;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
ListNode* current = *head;
while (current->value < num && current->next != NULL) {
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}
```
2. **链表分解为奇数表和偶数表**:
- 遍历原链表,分别维护两个新的链表,奇数表和偶数表。
```c
void splitList(ListNode** oddHead, ListNode** evenHead, ListNode* head) {
ListNode* oddCurr = oddHead;
ListNode* evenCurr = evenHead;
while (head != NULL) {
if (head->value % 2 == 0) {
evenCurr->next = head;
evenCurr = evenCurr->next;
} else {
oddCurr->next = head;
oddCurr = oddCurr->next;
}
head = head->next;
}
oddCurr->next = NULL;
evenCurr->next = NULL;
}
```
3. **合并两个链表为递减链表**:
- 创建一个新的链表头,然后按降序顺序连接两个链表。
```c
ListNode* mergeLists(ListNode* oddHead, ListNode* evenHead) {
ListNode* resultHead = NULL, *curr = NULL;
if (oddHead != NULL && evenHead != NULL) {
if (oddHead->value > evenHead->value) {
curr = oddHead;
oddHead = oddHead->next;
} else {
curr = evenHead;
evenHead = evenHead->next;
}
} else if (oddHead == NULL) {
curr = evenHead;
} else {
curr = oddHead;
}
while (oddHead != NULL || evenHead != NULL) {
if (oddHead != NULL && (evenHead == NULL || oddHead->value > evenHead->value)) {
curr->next = oddHead;
oddHead = oddHead->next;
} else {
curr->next = evenHead;
evenHead = evenHead->next;
}
curr = curr->next;
}
curr->next = NULL;
return resultHead;
}
```
现在你有了完整的函数,可以根据需要调用它们来完成整个过程:
```c
int main() {
// 初始化链表头
ListNode* head = NULL;
// 插入元素...
// ...
// 分解奇偶链表
ListNode* oddHead, *evenHead;
splitList(&oddHead, &evenHead, head);
// 合并链表
ListNode* mergedList = mergeLists(oddHead, evenHead);
// 打印结果...
// ...
return 0;
}
```
阅读全文