C语言实现集合运算(交并差补)
C语言入门,写的不好多多指教!
//输入两个整数集合A、B,求出交集、并集以及B在A中的余集,输入时按照大小顺序输入。
#include<stdio.h>
#define MAX 1000//最大输入个数
int bubbleSort(int *A,int len)//冒泡排序
{
int i,j,t;
for(i = 0;i < len-1;i++)
{
for(j = 0;j < len-i-1;j++)
{
if(A[j] > A[j+1])
{
t = A[j+1];
A[j+1] = A[j];
A[j] = t;
}
}
}
}
//求并集,思路是把B集合赋值给buffer,然后从A中找B中不一样的
//每找到一个,就接到buffer后面,最后再排序一下,就可以得到有顺序的并集
//不确定能否找到一个不需要排序的方法??
int unionSet(int *A,int *B,int lenA,int lenB)
{
int i,j;
int flag,index = lenB;
int *buffer = (int *)malloc(sizeof(int) * (lenA+lenB));//开辟内存存储A和B的并之后的集合
for(i = 0;i< lenA+lenB;i++)//初始化buffer空间。
{
buffer[i] = -1;
}
for(i = 0;i < lenB;i++)
{
buffer[i] = B[i];
}
for(i = 0;i < lenA;i++)
{
flag = 1;
for(j = 0;j < lenB;j++)
{
if(A[i] == B[j])
{
flag = 0;
}
}
if(flag)
{
buffer[index] = A[i];
index++;
}
}
bubbleSort(buffer,lenA+lenB);
for(i = 0;i < lenA+lenB;i++)
{
if(buffer[i] != -1)
printf("%d ",buffer[i]);
}
printf("\n");
}
//交集思路:遍历数组A,和B中的每一个值比较,如果相同,flag = 1,就加入到buffer缓冲数组中,就可以找到所有的相同元素
//因为输入本来就是有序的,所以不需要排序。
int intersection(int *A,int *B,int lenA,int lenB)//交集
{
int i,j;
int flag,index = 0,len = lenA > lenB ? lenA:lenB;
int *buffer = (int *)malloc(sizeof(int) * len);
for(i = 0;i < lenA;i++)
{
flag = 0;
for(j = 0;j < lenB;j++)
{
if(A[i] == B[j])
flag = 1;
}
for(j = 0;j < index;j++)
{
if(A[i] == buffer[j])
flag = 0;
}
if(flag)
{
buffer[index] = A[i];
index++;
}
}
for(i = 0;i< index;i++)
printf("%d ",buffer[i]);
printf("\n");
}
//补集就就和交集相反
int complementary(int *A,int *B,int lenA,int lenB)//补集(余集)
{
int i,j;
int flag,index = 0;
int *buffer = (int *)malloc(sizeof(int) * lenA);
for(i = 0;i < lenA;i++)
{
flag = 1;
for(j = 0;j < lenB;j++)
{
if(A[i] == B[j])
flag = 0;
}
if(flag)
{
buffer[index] = A[i];
index++;
}
}
for(i = 0;i < index;i++)
printf("%d ",buffer[i]);
printf("\n");
}
int main()
{
int a[MAX],b[MAX];//存储输入的集合
int i = 0,m = 0,n = 0;
scanf("%d",&n);
for(i = 0;i < n;i++)
scanf("%d",&a[i]);
//for(i = 0;i < n;i++)
// printf("%d ",a[i]);
scanf("%d",&m);
for(i = 0;i < n;i++)
scanf("%d",&b[i]);
printf("\n");
intersection(a,b,n,m);//交集
unionSet(a,b,n,m);//并集
complementary(a,b,n,m);//补集(余集)
}