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

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

#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

}

定义两个数组存放这两个集合,再定义银让一个数组存放它们的集合,用锋迹局类似冒泡排序的算法,遍历数组1中的第一个元素和数组2中每一个元素,若有相同的,州昌则把这个元素放入第三个数组,继续遍历,知道数组1遍历完所有元素,那数组3中的元素,即为两个数组(集合)的交集。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12548975.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存