用c语言求两个集合的交集,并集,差集

如题所述

#include <stdio.h>
#include <string.h>
#include <conio.h>

#define ARR_LEN 255 /*数组长度上限*/
#define elemType char /* 集合元素数据类型 */

/* 集合数据结构 */
typedef struct set {
elemType data[ARR_LEN];
int length;
} set;

/* 初始化集合 */
void initSet (set *S) {
S->length = 0;


/* 交集 */
/* A与B的交集(A∩B):既属于A又属于B的元素构成的集合 */
int setIntersection (set A, set B, set *dest) {
int i = 0, j = 0, k = 0;
dest->length = 0;
for (i=0; i<A.length; i++) { /* 外循环遍历A */
for (j=0; j<B.length; j++) { /* 内循环遍历B */
if (A.data[i] == B.data[j]) { /* 既属于A又属于B的元素,存入dest */
dest->data[k] = A.data[i];
k++;
}
}
}
dest->length = k;
if (dest->length)
return 1;
else
return 0;
}

/* 并集 */
/* A与B的并集(A∪B):A与B所有元素构成的集合 */
int setUnion (set A, set B, set *dest) {
int i = 0, j = 0, k = 0;
dest->length = 0;
for (i=0; i<A.length; i++) { /* 外循环遍历A */
for (j=0; j<B.length; j++) { /* 内循环遍历B */
if (A.data[i] == B.data[j]) /* 既属于A又属于B的元素,跳过 */
break;
}
if (j == B.length) { /* 属于A但不属于B的元素,存入dest */
dest->data[k] = A.data[i];
k++;
}
}
for (j=0; j<B.length; j++) { /* B的所有元素,存入dest */
dest->data[k] = B.data[j];
k++;
}
dest->length = k;
if (dest->length)
return 1;
else
return 0;
}

/* 补集 */
/* B在A中的相对补集(A\B):属于A但不属于B的元素构成的集合 */
int setComplement (set A, set B, set *dest) {
int i = 0, j = 0, k = 0;
dest->length = 0;
for (i=0; i<A.length; i++) { /* 外循环遍历A */
for (j=0; j<B.length; j++) { /* 内循环遍历B */
if (A.data[i] == B.data[j]) /* 既属于A又属于B的元素,跳过 */
break;
}
if (j == B.length) { /* 属于A但不属于B的元素,存入dest */
dest->data[k] = A.data[i];
k++;
}
}
dest->length = k;
if (dest->length)
return 1;
else
return 0;
}

/* 打印集合内容 */
int printSet (set S) {
int i;
if (S.length == 0) {
puts ("The set is empty! ");
return 0;
}
for (i=0; i<S.length; i++)
printf ("%c", S.data[i]);
putchar ('\n');
return 1;
}

int main (void) {
set A, B;
set AIB, AUB, ACB; /* 交集、并集、补集 */

initSet (&A); initSet (&B);
initSet (&AIB); initSet (&AUB); initSet (&ACB);

strcpy (A.data, "123");
A.length = strlen (A.data);
strcpy (B.data, "4532");
B.length = strlen (B.data);

printf ("A:\t");
printSet (A);
printf ("B:\t");
printSet (B);
putchar ('\n');

printf ("A∩B:\t");
setIntersection (A, B, &AIB);
printSet (AIB);

printf ("A∪B:\t");
setUnion (A, B, &AUB);
printSet (AUB);

printf ("A\B:\t");
setComplement (A, B, &ACB);
printSet (ACB);

getch (); /*屏幕暂留*/
return 0;
}

温馨提示:答案为网友推荐,仅供参考