顺序表——求两集合交/并

文章目录


题目

实现线性表的顺序存储结构下的插入和删除操作,并用该存储结构实现集合A和集和B的交集和并集操作;
最终结果存储于集合 A当中。

#Examples 1
input
5
1 2 3 4 5
5
4 5 6 7 8
0
output
1 2 3 4 5 6 7 8 
#Examples 2
input
5
1 2 3 4 5
5
4 5 6 7 8
1
output
4 5 


Source Program

#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 100
#define REALLOC 10
typedef int Elemtype;

typedef struct node
{
	Elemtype* elem;
	int L_size;
	int len;
}sqlist;

int init(sqlist& L);//初始化
int find(sqlist& L, Elemtype x);//查找x
int insert(sqlist& L, int i, Elemtype x);//插入
int delet(sqlist& L, int i);//删除
void Union(sqlist& La, sqlist& Lb);//并集
void intersect(sqlist& La, sqlist& Lb);//交集 
int main()
{
	sqlist La, Lb;
	init(La); init(Lb);
	int n, m, x;
	puts("集合A元素个数:");
	scanf("%d", &n);
	puts("输入A中元素:");
	for (int i = 1; i <= n; i++)scanf("%d", &x), insert(La, i, x);
	puts("集合B元素个数:");
	scanf("%d", &m);
	puts("输入B中元素:");
	for (int i = 1; i <= m; i++)scanf("%d", &x), insert(Lb, i, x);
	puts("并集:0,交集:1");
	int op; scanf("%d", &op);//0并集,1交集
	if (op == 0)Union(La, Lb);
	else intersect(La, Lb);
	for (int i = 0; i < La.len; i++)
		printf("%d ", La.elem[i]);
	puts("");
	return 0;
}

int init(sqlist& L)//初始化
{
	L.elem = (int*)malloc(LISTSIZE * sizeof(Elemtype));
	if (!L.elem)
		return 0;
	L.len = 0;
	L.L_size = LISTSIZE;
	return 1;
}

int find(sqlist& L, Elemtype x)//查找x
{
	Elemtype* p;
	int i = 1;
	p = L.elem;
	while (i <= L.len && *(p++) != x)i++;
	if (i <= L.len)
		return 1;
	else return 0;
}

int insert(sqlist& L, int i, Elemtype x)//插入
{
	Elemtype* newbase;
	if (i<1 || i>L.len + 1)
		return 0;
	if (L.len >= L.L_size)
	{
		newbase = (Elemtype*)realloc(L.elem, (L.L_size + REALLOC) * sizeof(Elemtype));
		L.elem = newbase;
		L.L_size += REALLOC;
	}
	for (int j = L.len - 1; j >= i - 1; j--)
		L.elem[j + 1] = L.elem[j];
	L.elem[i - 1] = x;
	L.len++;
	return 1;
}

int delet(sqlist& L, int i)//删除
{
	//cout << "delet" << L.elem[i - 1] << endl;
	if (i<1 || i>L.len)
		return 0;
	for (int j = i; j < L.len; j++)
		L.elem[j - 1] = L.elem[j];
	L.len--;
	return 1;
}

void Union(sqlist& La, sqlist& Lb)//并集
{
	int alen = La.len;
	int blen = Lb.len;

	for (int i = 0; i < blen; i++)
		if (!find(La, Lb.elem[i]))
			insert(La, ++alen, Lb.elem[i]);
}

void intersect(sqlist& La, sqlist& Lb)//交集 
{
	int alen = La.len;
	int blen = Lb.len;
	for (int i = 1; i <= alen; i++)
		if (!find(Lb, La.elem[i - 1]))
			delet(La, i--);//删除后下标前移1
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值