数据结构作业:求交并补集

#include <iostream>
using namespace std;
#define MaxSize 100
typedef char ElemType;

//定义顺序表结构体类型 
typedef struct
{
	ElemType data[MaxSize];
	int length;
} SqList;

//建立一个顺序表
void CreateList(SqList*& L, ElemType a[], int n)
{
	for (int i = 0; i < n; i++)
		L->data[i] = a[i];
	L->length = n;
}

//分配存放线性表的空间
void InitList(SqList*& L)
{
	L = new SqList;
	L->length = 0;
}

//判定是否为空表
bool ListEmpty(SqList* L)
{
	return(0 == L->length);
}

//销毁线性表
void DestroyList(SqList*& L)
{
	delete L;
}

//输出线性表
void DispList(SqList* L)
{
	if (ListEmpty(L))
		return;
	for (int i = 0; i < L->length; i++)
		cout << L->data[i] << "   ";
	cout << endl;
}

//按元素值查找
int LocateElem(SqList* L, ElemType e)
{
	int i = 0;
	while (i < L->length && L->data[i] != e)
		i++;
	if (i >= L->length)
		return 0;
	else
		return i + 1;
}

//删除数据元素
bool ListDelete(SqList*& L, int i, ElemType& e)
{
	int j;
	if (i<1 || i>L->length)
		return false;
	i--;	   /*将顺序表逻辑位序转化为elem下标即物理位序*/
	e = L->data[i];
	for (j = i; j < L->length - 1; j++)
		L->data[j] = L->data[j + 1];
	/*将data[i]之后的元素前移一个位置*/
	L->length--;	/*顺序表长度减1*/
	return true;
}

//插入数据元素
bool ListInsert(SqList*& L, int i, ElemType e)
{
	if (i<1 || i>L->length + 1)
		return false;
	i--;
	for (int j = L->length; j > i; j--)
		L->data[j] = L->data[j - 1];

	L->data[i] = e;
	L->length++;
	return true;
}

//求并集 A ∪B 
void UnionList(SqList* L1, SqList* L2, SqList*& L)
{
	int len = L1->length;
	//将L1元素拷贝到L 
	for (int i = 0; i < len; i++)
		ListInsert(L, i + 1, L1->data[i]);

	//遍历L2,查找未出现在L的元素
	for (int i = 0; i < L2->length; i++)
		if (!LocateElem(L, L2->data[i]))
			ListInsert(L, ++len, L2->data[i]);

	DispList(L);
}

//求交集 A ∩B 
void PublicList(SqList* L1, SqList* L2, SqList*& L)
{
	//遍历L1,查询在L2中有无此元素
	int k = 1, len = L1->length;
	for (int i = 0; i < len; i++)
		if (LocateElem(L2, L1->data[i])) //查询成功,插入L 
			ListInsert(L, k++, L1->data[i]);

	DispList(L);
}

//求差集 A-B or B-A 
void DiffList(SqList* L1, SqList* L2, SqList*& L)
{
	//其实求差集就是用被减数L1 与L1和L2的交集 再取一次差就可以了,这里直接采用 
	SqList* L3;
	InitList(L3);

	/*----------------------------------------------------------------------------*/
	//遍历L1,查询在L2中有无此元素
	int k = 1, len = L1->length;
	for (int i = 0; i < len; i++)
		if (LocateElem(L2, L1->data[i])) //查询成功,插入L3 
			ListInsert(L3, k++, L1->data[i]);
	// 现在L3中存储的是 L1  ∩L2 

	/*----------------------------------------------------------------------------*/
	
	//遍历L1,查询在L3中有无此元素
	k = 1, len = L1->length;
	for (int i = 0; i < len; i++)
		if (!LocateElem(L3, L1->data[i])) //查询失败,插入L 
			ListInsert(L, k++, L1->data[i]);

	DispList(L);
}
int main()
{
	SqList* A, * B, * C;
	InitList(A);
	InitList(B);
	InitList(C);
	ElemType a[4] = { 'A','B','C','D' };
	ElemType b[5] = { 'B','C','E','F','G' };
	CreateList(A, a, 4);
	cout << endl << "线性表A的元素为:";
	DispList(A);

	CreateList(B, b, 5);
	cout << endl << "线性表B的元素为:";
	DispList(B);

	cout << endl << "A ∪B 为: ";
	UnionList(A, B, C);
	InitList(C);

	cout << endl << "A ∩B 为: ";
	PublicList(A, B, C);
	InitList(C);

	cout << endl << "A - B 为: ";
	DiffList(A, B, C);
	InitList(C);

	cout << endl << "B - A 为: ";
	DiffList(B, A, C);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值