用C语言编写一个集合的交,并和差运算的程序怎么写啊?

Python020

用C语言编写一个集合的交,并和差运算的程序怎么写啊?,第1张

/*第一,你的题意不明,我只能输入两个集合了【互异性由输入保证】*/

#include<stdio.h>

#include<string.h>

void main()

{

char temp[60]="",str1[30]="",str2[30]="",i,j,l1,l2,ch

printf("STR1:")

gets(str1)

printf("STR2:")

gets(str2)

l1=strlen(str1)

l2=strlen(str2)

//交集

printf("\n交集:\n{")

for(i=0i<l1i++)

for(j=0j<l2j++)

if(str1[i]==str2[j]) printf("%c,",str1[i])

printf("\b}\n")

//并集偷懒的算法: 合并->排序->删除相同

printf("\n并集:\n{")

/*合并*/sprintf(temp,"%s%s",str1,str2)

/*排序*/

for(i=0i<l1+l2-1i++)

for(j=i+1j<l1+l2j++)

if(temp[i]>temp[j])

{

char ch

ch=temp[i]

temp[i]=temp[j]

temp[j]=ch

}

/*删除相同字符*/

for(i=j=1i<l1+l2i++)

if(temp[i]!=temp[j-1]) temp[j++]=temp[i]

temp[j]='\0'

for(i=0i<ji++)

printf("%c,",temp[i])

printf("\b}\n")

//CuA

printf("\nCuA:\n{")

for(ch='a'ch<='z'ch++)

{

for(i=0i<l1i++)

if(ch==str1[i]) goto NOT

printf("%c,",ch)

NOT:if(0)

}

printf("\b}\n")

//CuB

printf("\nCuB:\n{")

for(ch='a'ch<='z'ch++)

{

for(i=0i<l2i++)

if(ch==str2[i]) goto NOT2

printf("%c,",ch)

NOT2:if(0)

}

printf("\b}\n")

}

可以用二个一维数组,

再用两个for循环来判断结果:交,并,差

在for循环中,用一个if来判断一下,是不是a[0]==b[j],只要有相等的,就令之放在c[0]

这就是交集!!

并集就好求吧,

只要令c[i]=a[i],再来一个就是c[i+j+1]=b[j](因为我这里是考虑j=0开始的,然后自加差就是在交上改动一下就可以了,只要是a[0]!=b[j],就把它放到c[]这个数组里面去~!!!!

1:并集的程序。

求集合LA和集合LB的并集

#define NULL 0

struct JD

{ int data

struct JD *next

}

int find(int number,struct JD *h)

{ while(h->data)

{ if(h->data!=number)

{ h=h->next

continue

}

else

return 0

}

return 1

}

struct JD * make()

{ struct JD *h=NULL,*p=NULL

int number,tf

h=(struct JD *)malloc(sizeof(struct JD))

scanf("%d",&h->data)

p=h

while(p->data)

{ p->next=(struct JD *)malloc(sizeof(struct JD))

p=p->next

p->data=0

scanf("%d",&number)

tf=find(number,h)

if(tf)

p->data=number

else

continue

}

return h

}

void print(struct JD *h)

{ while(h->data)

{ printf("%d ",h->data)

h=h->next

}

}

struct JD * change(struct JD *la,struct JD *lb)

{ struct JD *h,*p,*s,*q

int number,tf

p=lb

while(p->data)

{ number=p->data

tf=find(number,la)

p=p->next

if(tf)

{ s=(struct JD *)malloc(sizeof(struct JD))

s->data=number

s->next=la

la=s

}

else

continue

}

return la

}

void del(struct JD *h)

{ struct JD *p=h->next

while(h->data)

{ free(h)

h=p

p=p->next

}

free(h)

}

main()

{ struct JD *la,*lb

printf("\n\nGive the number to LA :\n\n")

la=make()

printf("\nLA is: ")

print(la)

printf("\n\nGive the number to LB :\n\n")

lb=make()

printf("\nLB is: ")

print(lb)

la=change(la,lb)

printf("\n\n\nThe new LA=LA||LB is: ")

print(la)

del(la)

del(lb)

printf("\n\n\nPass any key to exit...!\n")

getch()

}

********** 程序运行结果 **********

Give the number to LA :

1↓

2↓

3↓

5↓

0↓

LA is: 1 2 3 5

Give the number to LB :

6↓

7↓

3↓

2↓

9↓

0↓

LB is: 6 7 3 2 9

The new LA=LA||LB is: 9 7 6 1 2 3 5

--------------------------------------------------

Pass any key to exit...!

#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

}