设c={a1,b1,a2,b2,…an,bn}为一线性表,采用带头结点的单链表lc存储,编写一程序将其拆分为两个线性表。是的a={a1,a2,…an},b={bn,bn-1,…b1}。
时间: 2023-04-20 13:01:28 浏览: 268
将带头结点的单链表实现线性表的功能
4星 · 用户满意度95%
可以按照以下步骤拆分c为a和b两个线性表:
1. 创建两个带头结点的单链表la和lb,分别用于存储a和b。
2. 从lc的第一个结点开始遍历,依次将a1、a2、…an插入到la的尾部,将bn、bn-1、…b1插入到lb的尾部。
3. 遍历完lc后,la和lb中分别存储了a和b两个线性表。
下面是具体的代码实现:
// 定义单链表结点类型
typedef struct Node {
int data;
struct Node* next;
} Node;
// 拆分线性表c为a和b
void splitList(Node* lc, Node** la, Node** lb) {
// 创建la和lb的头结点
*la = (Node*)malloc(sizeof(Node));
(*la)->next = NULL;
*lb = (Node*)malloc(sizeof(Node));
(*lb)->next = NULL;
// 遍历lc,将a和b分别插入到la和lb的尾部
Node* p = lc->next;
while (p != NULL) {
// 将a插入到la的尾部
Node* aNode = (Node*)malloc(sizeof(Node));
aNode->data = p->data;
aNode->next = NULL;
(*la)->next = aNode;
*la = aNode;
// 将b插入到lb的尾部
Node* bNode = (Node*)malloc(sizeof(Node));
bNode->data = p->next->data;
bNode->next = NULL;
(*lb)->next = bNode;
*lb = bNode;
// 继续遍历lc
p = p->next->next;
}
// 将la和lb的头结点删除
Node* temp = (*la);
(*la) = (*la)->next;
free(temp);
temp = (*lb);
(*lb) = (*lb)->next;
free(temp);
}
阅读全文