求解一般集合的并集问题。
已知两个集合A和B,现要求一个新的集合A=AUB。例如,设
A=(7,5,3,11)
B=(2,6,3)
合并后 A=(7,5,3,11,2,6)
输入格式:
第一行输入集合A的元素个数,第二行输入集合A的各元素值。
第三行输入集合B的元素个数,第四行输入集合B的各元素值。
输出格式:
输出完成合并后的集合A。
输入样例:
在这里给出一组输入。例如:
4
7 5 3 11
3
2 6 3
输出样例:
在这里给出相应的输出。例如:
7 5 3 11 2 6
下面是我的代码,希望对你有所帮助:
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define OVERFLOW -1
typedef int ElemType;
typedef struct {
ElemType* elem;
int length;
}SqList;
void InitList(SqList& L);
void ListDelete(SqList& L, int i);
void ListPrint(SqList L);
int main()
{
SqList La, Lb;
InitList(La);
InitList(Lb);
int n1, n2;
scanf("%d", &n1);
for (int i = 0; i < n1; ++i)
{
scanf("%d", &La.elem[i]);
La.length++;
}
scanf("%d", &n2);
for (int i = 0; i < n2; ++i)
{
scanf("%d", &Lb.elem[i]);
Lb.length++;
}
SqList L;
InitList(L);
for (int j = 0; j < La.length; j++)//先把La表中的数据拷贝到L表中
L.elem[j] = La.elem[j];
for (int i = 0; i < Lb.length; i++)//把Lb表中的与La表中的相同的删去
for (int j = 0; j < La.length; j++)
{
if (Lb.elem[i] == La.elem[j])
{
ListDelete(Lb, i);
i--;
break;//就不用在进行比较了,退出这一层循环,返回上一层循环
}
}
L.length = La.length + Lb.length;
for (int j = La.length, i = 0; j < L.length; j++, i++)//把加工后的Lb表中的拷贝到L表中
L.elem[j] = Lb.elem[i];
ListPrint(L);
}
void InitList(SqList& L)//创建一个空的顺序表
{
L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem)
exit(OVERFLOW);//内存分配失败
L.length = 0;
}
void ListDelete(SqList& L, int i)//删除元素
{
ElemType* p, * q;
if (i >= 0 && i < L.length)
{
p = &L.elem[i];
q = L.elem + L.length - 1;
for (; p <= q; p++)
*p = *(p + 1);
}
--L.length;
}
void ListPrint(SqList L)//打印顺序表
{
int i;
for (i = 0; i < L.length; i++)
printf("%d ", L.elem[i]);
}