请利用单链表的基本运算实现以下功能:有一个单链表LA,数据域全部存放整数,设计算法将其拆分成两个单链表LA和LB,使得LA单链表中含有所有元素值为偶数的结点,LB单链表中含有所有元素值为奇数的结点,且保持原来的相对次序,输出LS和LB两个单链表中的元素值。用C语言实现算法
时间: 2024-03-02 11:54:17 浏览: 102
c语言实现链表的基本操作,链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
以下是用C语言实现的算法:
```c
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
void splitList(Node *LA, Node **LB) {
Node *p = LA, *q = NULL;
while (p != NULL) {
if (p->data % 2 == 0) {
q = p;
p = p->next;
} else {
if (*LB == NULL) {
*LB = p;
} else {
q->next = p->next;
p->next = *LB;
*LB = p;
p = q->next;
}
}
}
if (q != NULL) {
q->next = NULL;
}
}
void printList(Node *L) {
Node *p = L;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node *LA = NULL, *LB = NULL;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
Node *p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = LA;
LA = p;
}
splitList(LA, &LB);
printList(LA);
printList(LB);
return 0;
}
```
首先定义一个链表的结构体`Node`,包含数据域`data`和指向下一个节点的指针`next`。
然后定义`splitList`函数,输入参数为指向LA链表头的指针`LA`和指向LB链表头的指针的指针`LB`。函数的作用是将LA链表中所有元素值为偶数的结点拆分出来存放到LA中,所有元素值为奇数的结点拆分出来存放到LB中。拆分后保持原来的相对次序。
函数实现:定义两个指针`p`和`q`,分别指向LA链表头和其前一个结点。遍历LA链表,如果`p`指向的结点的元素值为偶数,则直接将`p`指针向后移动一位;如果`p`指向的结点的元素值为奇数,则将该结点从LA链表中删除,并插入到LB链表头部。`q`指针用于辅助删除和插入操作。
最后定义`printList`函数,输入参数为指向链表头的指针`L`,函数的作用是遍历链表并输出所有元素值。
在主函数中,首先读入输入的整数,然后依次将它们插入到LA链表中。最后调用`splitList`函数将LA链表拆分成LA和LB两个链表,并调用`printList`函数输出它们的元素值。
阅读全文