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