设计一个算法,将单链表L中的数据按照奇偶拆分,其中单链表L中保留偶数,奇数存入一个新的单链表A中,最后分别输出单链表L和A的元素。(提示:在单链表L中依次判断结点的奇偶性,偶数保留,奇数则先存入链表A中,然后从链表L中删除,接着判断下一个结点)。c语言代码
时间: 2024-09-30 17:08:45 浏览: 51
设计这样一个算法,我们可以创建两个单链表结构,一个用于原始链表L中的偶数,另一个用于奇数。下面是使用C语言实现的步骤:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 创建新节点函数
ListNode* createNode(int data) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (newNode != NULL) {
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
// 插入节点到链表尾部
void insertToList(ListNode** head, int data) {
ListNode* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
ListNode* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
// 检查并处理奇偶数
void splitList(ListNode** listHead, ListNode** evenHead, ListNode** oddHead) {
ListNode* current = *listHead;
while (current != NULL) {
// 判断当前节点是否为奇数
if (current->data % 2 != 0) {
insertToList(oddHead, current->data); // 将奇数插入奇数链表
} else {
insertToList(evenHead, current->data); // 偶数直接插入偶数链表
}
// 移动到下一个节点
current = current->next;
}
// 删除原始链表中的奇数节点
for (current = *listHead; current != NULL; current = current->next) {
if (current->data % 2 != 0) {
ListNode* temp = current->next;
free(current);
*listHead = temp;
}
}
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
ListNode* listHead = NULL;
ListNode* evenHead = NULL;
ListNode* oddHead = NULL;
// 假设我们已经有一个初始化好的单链表L,这里简化为手动添加元素
insertToList(&listHead, 1); // 奇数
insertToList(&listHead, 2); // 偶数
insertToList(&listHead, 3); // 奇数
insertToList(&listHead, 4); // 偶数
// 分割链表
splitList(&listHead, &evenHead, &oddHead);
// 输出结果
printf("Original List L: ");
printList(listHead);
printf("Even List A: ");
printList(evenHead);
printf("Odd List B: ");
printList(oddHead);
return 0;
}
```
这个程序首先定义了链表节点结构,并提供了一些辅助函数。`splitList` 函数实现了链表的分割操作,最后打印出原始链表L、偶数链表A和奇数链表B的内容。
阅读全文