用顺序表求集合的交集、并集和差集

使用顺序表时, 需要定义一个数组来存储顺序表中的所有元素和定义一个整型变量来存储顺序表的长度。假定数组用data[MaxSize]表示,长度整型变量用length表示,并采用结构体类型表示,元素类型采用通用类型标识符ElemType,则顺序表的存储结构定义如下:

#define MaxSize 50
typedef int ElemType;
typedef struct{
	ElemType data[MaxSize];
	int length;
}SqList;

  1. 用顺序表,求集合A与B交集
      思路:求 C = A ⋂ B C=A \bigcap B C=AB, C C C中元素是 A 、 B A、B AB中的公共元素。扫描 A A A中的元素 A . d a t a [ i ] A.data[i] A.data[i],若它与 B B B中某个元素相同,表示是交集元素,将其放到 C C C中,算法如下:
//求A∩B
void Intersection(SqList *&A,SqList *&B,SqList *&C){
	int i,j,k=0;
	for (i=0;i<A->length;i++)
	{
		j=0;
		while(j<B->length && B->data[j]!=A->data[i])
			j++;
		if (j<B->length) //表示A->data[i]在B中,将其放到C中
		{
			C->data[k++]=A->data[i];
		}
	}
	C->length=k;

}
  1. 用顺序表,求集合A与B的并集
      思路:求 C = A ⋃ B C=A \bigcup B C=AB中元素为 A A A B B B中非重复出现的所有元素。现将 A A A复制到 C C C中,然后扫描 B B B中的元素 B . d a t a [ i ] B.data[i] B.data[i], 若它与 A A A中所有元素均不相同,表示是并集元素,将其放到 C C C中。算法如下:
//求A∪B
void Union(SqList *&A,SqList *&B,SqList *&C){
	int i,j,k=0;
	for(i=0;i< A->length;i++)
		C->data[i]=A->data[i];
	C->length=A->length;
	for (i=0;i< B->length;i++)
	{
		j=0;
		while(j< A->length && B->data[i] != A->data[j])
			j++;
		if(j==A->length)
			C->data[C->length+k++] = B->data[i];
		//k++;
	}
	C->length += k; //修改集合长度

}
  1. 用顺序表,求集合A与B之间的差集
    思路:求 C = A − B C=A-B C=AB, C C C中元素为 A A A中所有不属于 B B B的元素, 然后扫描 A A A中的元素 A . d a t a [ i ] A.data[i] A.data[i], 若它与 B B B中所有元素均不相同,表示是差集元素,将其放到 C C C中。算法如下:
//求A-B
void Different(SqList *&A, SqList *&B,SqList *&C){
	int i,j,k=0;
	for (i=0;i<A->length;i++)
	{
		j=0;
		while(j< B->length && B->data[j] != A->data[i])
			j++;
		if(j==B->length)  //表示A->data[i]不在B中,将其放到C中
			C->data[k++]=A->data[i];
	}
	C->length=k; //修改集合长度
}

完整代码如下:
    ShunBase.h和ShunMain.cpp要放到同一个目录下。
    头文件:ShunBase.h
    主文件:ShunMain.cpp

    1) 头文件: ShunBase.h

//头文件:ShunBase.h
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef int ElemType;
typedef struct{
	ElemType data[MaxSize];
	int length;
}SqList;

void InitList(SqList *&L){
	L=(SqList*)malloc(sizeof(SqList));
	L->length=0;
}

void DestroyList(SqList *L){
	free(L);
}

int ListEmpty(SqList *L){
	return (L->length==0);
}

int ListLength(SqList *L){
	return (L->length);
}

void DispList(SqList *L){
	int i;
	if(ListEmpty(L)) return;
	for(i=0;i<L->length;i++)
		printf("%d ",L->data[i]);
	printf("\n");
}

int GetElem(SqList *L,int i,ElemType &e){
	if(i<1 || i>L->length)
		return 0;
	e=L->data[i-1];
	return 1;
}

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;
	
}

int ListInsert(SqList *&L,int i,ElemType e){
	int j;
	if(i<1 || i>L->length+1)
		return 0;
	i--;  //将逻辑序号转化为存储序号
	for(j=L->length;j>i;j--) //将data[i]及其以后元素,依次后移
		L->data[j]=L->data[j-1];
	L->data[i]=e;  //在i处插入元素e
	L->length++;  //顺序表长度加1
	return 1;
}

int ListDelete(SqList *&L,int i,ElemType &e){
	int j;
	if(i<1 || i>L->length)
		return 0;
	i--;
	e=L->data[i];
	for(j=i;j<L->length-1;j++)
		L->data[j]=L->data[j+1];
	L->length--;
	return 1;
	
}

    2) 主文件: ShunMain.cpp

//主函数.cpp
#include <stdlib.h>
#include "ShunBase.h"
#include <stdio.h>

//求A∩B
void Intersection(SqList *&A,SqList *&B,SqList *&C){
	int i,j,k=0;
	for (i=0;i<A->length;i++)
	{
		j=0;
		while(j< B->length && B->data[j]!=A->data[i])
			j++;
		if (j< B->length) //表示A->data[i]在B中,将其放到C中
		{
			C->data[k++]=A->data[i];
		}
	}
	C->length=k;

}

//求A∪B
void Union(SqList *&A,SqList *&B,SqList *&C){
	int i,j,k=0;
	for(i=0;i< A->length;i++)
		C->data[i]=A->data[i];
	C->length=A->length;
	for (i=0;i< B->length;i++)
	{
		j=0;
		while(j< A->length && B->data[i] != A->data[j])
			j++;
		if(j==A->length)
			C->data[C->length+k++] = B->data[i];
		//k++;
	}
	C->length += k; //修改集合长度

}

//求A-B
void Different(SqList *&A, SqList *&B,SqList *&C){
	int i,j,k=0;
	for (i=0;i<A->length;i++)
	{
		j=0;
		while(j< B->length && B->data[j] != A->data[i])
			j++;
		if(j==B->length)  //表示A->data[i]不在B中,将其放到C中
			C->data[k++]=A->data[i];
	}
	C->length=k; //修改集合长度
}




int main()
{
	//printf("1+2=3\n");

	SqList *Ls = (SqList *)malloc(sizeof(SqList));
	Ls->length=0;
	
	//printf("%d\n",Ls->length);
	//插入元素
// 	int i=0;
// 	for (i=0;i<10;i++)
// 	{
// 		ListInsert(Ls,i,i);
// 	}
// 	DispList(Ls);
// 	ElemType e;
// 	//获取第一个元素
// 	GetElem(Ls,1,e);
// 	printf("\n%d\n",e);
// 	//获取第三个元素
// 	GetElem(Ls,3,e);
// 	printf("%d\n",e);
// 	//在第3个元素之后,插入15
// 	ListInsert(Ls,3,15);
// 	DispList(Ls);

	SqList *A = (SqList*)malloc(sizeof(SqList));
	A->length=0;
	A->data[0]=2;
	A->data[1]=5;
	A->data[2]=10;
	A->data[3]=7;
	A->data[4]=16;
	A->length=5;

	SqList *B = (SqList*)malloc(sizeof(SqList));
	B->data[0]=3;
	B->data[1]=5;
	B->data[2]=7;
	B->length=3;

	SqList *C = (SqList*)malloc(sizeof(SqList));
	C->length=0;

	DispList(A);
	DispList(B);
	//1) C=A∩B
	//Intersection(A,B,C);	

	//2) C=A∪B
	Union(A,B,C);

	//3) C=A-B
	//Different(A,B,C);

	DispList(C);
	
	system("pause");
	return 0;
}

效果如下:

图(1) 交集 C = A ∩ B
图(2) 并集 C = A ∪ B
图(3) 差集 C = A-B

图示操作如下:

图(4) A与B的交集为C

图(5) A与B的并集为C

图(6)差集C = A-B
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值