设计一个算法求集合A和集合B两个集合的并集,用线性表顺序存储结构实现,用c语言
时间: 2024-04-29 21:22:12 浏览: 125
算法思路:
1. 分别遍历集合A和集合B中的元素,将它们加入到一个新的集合C中;
2. 对集合C中的元素进行去重操作,即如果集合C中已经存在该元素,则不再加入。
代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
typedef int ElemType; // 元素类型
typedef struct {
ElemType data[MaxSize]; // 存储元素的数组
int length; // 顺序表的长度
} SqList;
// 初始化一个顺序表
void InitList(SqList *L) {
L->length = 0;
}
// 向顺序表中插入一个元素
int ListInsert(SqList *L, int i, ElemType e) {
int j;
if (i < 1 || i > L->length + 1) {
return 0; // 插入位置不合法
}
if (L->length >= MaxSize) {
return 0; // 顺序表已满
}
for (j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1]; // 将第i个元素及之后的元素后移
}
L->data[i - 1] = e; // 在位置i处插入元素e
L->length++; // 长度加1
return 1; // 成功插入
}
// 遍历顺序表,打印所有元素
void PrintList(SqList L) {
int i;
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
// 求两个集合的并集
void Union(SqList A, SqList B, SqList *C) {
int i;
// 将集合A中的元素依次加入集合C中
for (i = 0; i < A.length; i++) {
ListInsert(C, C->length + 1, A.data[i]);
}
// 将集合B中的元素依次加入集合C中
for (i = 0; i < B.length; i++) {
ListInsert(C, C->length + 1, B.data[i]);
}
// 对集合C中的元素进行去重
int j;
for (i = 0; i < C->length; i++) {
for (j = i + 1; j < C->length;) {
if (C->data[j] == C->data[i]) { // 如果与前面的元素重复
// 将后面的元素前移
int k;
for (k = j; k < C->length; k++) {
C->data[k] = C->data[k + 1];
}
C->length--; // 长度减1
} else {
j++; // 继续比较下一个元素
}
}
}
}
int main() {
SqList A, B, C;
int i, n, m, e;
printf("请输入集合A的元素个数:");
scanf("%d", &n);
printf("请依次输入集合A中的%d个元素:", n);
for (i = 0; i < n; i++) {
scanf("%d", &e);
ListInsert(&A, A.length + 1, e);
}
printf("请输入集合B的元素个数:");
scanf("%d", &m);
printf("请依次输入集合B中的%d个元素:", m);
for (i = 0; i < m; i++) {
scanf("%d", &e);
ListInsert(&B, B.length + 1, e);
}
InitList(&C);
Union(A, B, &C);
printf("集合A和集合B的并集为:");
PrintList(C);
return 0;
}
```
注意事项:
1. 本算法中假设集合元素是整数类型,如果是其他类型,需要修改代码中的元素类型定义和输入方式。
2. 本算法中的去重操作采用暴力枚举的方式,时间复杂度为 O(n^2),当集合元素较多时效率较低,可以考虑使用其他高效的去重算法。
阅读全文