集合A与B的并集操作
假设有两个整数集合A和B,它们分别由两个线性表LA和LB表示。这里,线性表的数据元素即是集合的成员。(A/B为纯集合)
要求实现一个新的集合A = A∪B,使得A依然为纯集合。线性表采用链式存储方式,数据元素类型为"int"。
附加题:线性表的拆分
给定一个带头结点的单链表L = (a1, b1, a2, b2, …, an, bn),设计一个算法将其拆分成两个带头结点的单链表L1和L2,其中L1 = (a1, a2, …, an),L2 = (bn, bn-1, …, b1),并要求L1使用L的头结点。
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LinkNode;
void InitList(LinkNode *L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
// 初始化第一个数据节点
LinkNode *node = (LinkNode*)malloc(sizeof(LinkNode));
L->next = node;
}
void CreateList(LinkNode* L, int arr[], int n) {
LinkNode *node = L;
for (int i = 0; i < n; i++) {
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = arr[i];
node->next = s;
node = s;
}
node->next = NULL;
}
void MergeList(LinkNode* A, LinkNode* B) {
LinkNode *p = A;
LinkNode *q = B;
// 比较两个链表的数据,小的接到合并链表里
while (p->next != NULL && q->next != NULL) {
if (p->next->data < q->next->data) {
p = p->next;
} else {
LinkNode *temp = q->next;
q->next = temp->next;
temp->next = p->next;
p->next = temp;
p = temp;
}
}
// 如果B链表还没结束,直接接到A链表
if (q->next != NULL) {
p->next = q->next;
}
}
// 打印链表
void PrintList(LinkNode* L) {
LinkNode* p = L->next;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkNode A, B;
int arr1[] = {1, 3, 5};
int arr2[] = {2, 4, 6};
InitList(&A);
InitList(&B);
CreateList(&A, arr1, 3);
CreateList(&B, arr2, 3);
//打印数组A,数组B
printf("数组A:");
PrintList(&A);
printf("数组B:");
PrintList(&B);
//合并数组
MergeList(&A, &B);
// 调用PrintList打印结果
printf("数组A∪B:");
PrintList(&A);
return 0;
}
运行结果如图:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LinkNode;
// split函数定义
void split(LinkNode *&L, LinkNode *&L1, LinkNode *&L2) {
LinkNode *p = L->next;
LinkNode *q, *r1;
L1 = L;
r1 = L1;
L2 = (LinkNode *)malloc(sizeof(LinkNode));
L2->next = NULL;
while (p != NULL) {
r1->next = p;
r1 = p;
p = p->next;
q = p->next;
p->next = L2->next;
L2->next = p;
p = q;
}
r1->next = NULL;
}
void PrintList(LinkNode *L) {
LinkNode *p = L->next;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkNode *L, *L1, *L2;
int arr[] = {3,7,1,2,5,0,1,2};
// 初始化链表L
L = (LinkNode*) malloc(sizeof(LinkNode));
L->next = NULL;
for(int i = 0; i < 8; i++) {
LinkNode *node = (LinkNode*) malloc(sizeof(LinkNode));
node->data = arr[i];
node->next = L->next;
L->next = node;
}
printf("初始化的链表为:");
PrintList(L);
// 拆分链表
split(L, L1, L2);
printf("拆分链表后的链表为:\n");
// 打印结果
PrintList(L1);
PrintList(L2);
return 0;
}
运行结果如图: