C语言实现,有线性表C={z,v,2z,..,an,bn}采用带头结点的单链表LC存放,编写代码将LC拆分为两个单链表LA、LB,使得A={z,...,an}, B=...,b2,b1}。
时间: 2025-01-05 11:46:38 浏览: 7
以下是用C语言实现将单链表LC拆分为两个单链表LA和LB的代码:
```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));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 拆分链表
void splitList(Node* LC, Node** LA, Node** LB) {
*LA = createNode(0); // 创建头结点
*LB = createNode(0);
Node* pA = *LA;
Node* pB = *LB;
Node* p = LC->next; // 从LC的第一个实际节点开始
while (p != NULL) {
pA->next = createNode(p->data); // 将当前节点添加到LA
pA = pA->next;
if (p->next != NULL) {
pB->next = createNode(p->next->data); // 将下一个节点添加到LB
pB = pB->next;
p = p->next->next; // 跳过两个节点
} else {
break; // 如果LC的长度为奇数,结束循环
}
}
}
// 打印链表
void printList(Node* head) {
Node* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 主函数示例
int main() {
// 创建示例链表LC: {1, 2, 3, 4, 5, 6}
Node* LC = createNode(0);
LC->next = createNode(1);
LC->next->next = createNode(2);
LC->next->next->next = createNode(3);
LC->next->next->next->next = createNode(4);
LC->next->next->next->next->next = createNode(5);
LC->next->next->next->next->next->next = createNode(6);
// 拆分链表
Node* LA;
Node* LB;
splitList(LC, &LA, &LB);
// 打印结果
printf("链表LA: ");
printList(LA);
printf("链表LB: ");
printList(LB);
return 0;
}
```
这段代码的主要步骤如下:
1. 定义链表节点结构。
2. 创建新节点的函数。
3. 拆分链表的函数 `splitList`:
- 创建LA和LB的头结点。
- 遍历LC链表,交替将节点添加到LA和LB。
- 如果LC的长度为奇数,LB会比LA少一个节点。
4. 打印链表的函数。
5. 主函数中创建示例链表LC,调用拆分函数,然后打印结果。
使用这段代码,你可以将一个线性表C拆分为两个单链表LA和LB,其中LA包含C中的奇数位置元素,LB包含C中的偶数位置元素。
阅读全文