用顺序表表示集合,编写程序实现集合交、并、差运算

用顺序表表示集合,编写程序实现集合交、并、差运算,第1张

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define LISTINCREAMENT 10

typedef struct status

{

int *elem

int length

int listsize

int incrementsize

}SqList

void AuB(SqList A,SqList B,SqList &C)

void AnB(SqList A,SqList B,SqList &D)

void A_B(SqList &A,SqList B)

int GetElem(SqList L,int i)

int LocateElem(SqList L,int e)

void ListDelete(SqList &A,int i)

void main()

{

SqList A,B,C,D

int i,a,b

printf("输入集合A的元素个数:a = ")

scanf("%d",&a)

printf("输入集合B的元素个数:b = ")

scanf("%d",&b)

A.elem = (int *)malloc(a*sizeof(int))

B.elem = (int *)malloc(b*sizeof(int))

C.elem = (int *)malloc((a>b?a:b)*sizeof(int))

D.elem = (int *)malloc((a<b?a:b)*sizeof(int))

if(!A.elem || !B.elem || !C.elem || !D.elem)

{

printf("error!")

exit(0)

}

else

{

A.length = 0

A.listsize = a

B.length = 0

B.listsize = b

C.length = 0

C.listsize = (a>b)?a:b

D.length = 0

D.listsize = (a<b)?a:b

}

printf("高陵输入集合A的元素仔指:念念配")

for(i = 0i <ai++)

{

scanf("%d",(A.elem+i))

A.length++

}

printf("输入集合B的元素:")

for(i = 0i <bi++)

{

scanf("%d",(B.elem+i))

B.length++

}

AuB(A,B,C)

AnB(A,B,D)

A_B(A,D)

}

//定义函数A并B

void AuB(SqList A,SqList B,SqList &C)

{

int i,j,k,e,*newbase

for(i = 0i <A.lengthi++)

{

C.elem[i] = A.elem[i]

C.length++

}

for(j = 0j <B.lengthj++)

{

e = GetElem(B,j)

k = LocateElem(C,e)

if(k == 0)

{

if((C.length) >= C.listsize)//扩容

{

newbase = (int *)realloc(C.elem,(C.listsize+LISTINCREAMENT)*sizeof(int))

if(!newbase)

exit(0)

C.elem = newbase

C.listsize += LISTINCREAMENT

}

C.elem[C.length] = B.elem[j]

C.length++

}

}

printf("A B的并集C = {")

for(k = 0k <C.lengthk++)

printf("%d ",*(C.elem+k))

printf("}\n")

}

//定义函数A交B

void AnB(SqList A,SqList B,SqList &D)

{

int i,k,t,*p

p = D.elem

for(i = 0i <A.lengthi++)

{

t = GetElem(A,i)

k = LocateElem(B,t)

if(k >0)

{

*p++ = t

D.length++

}

}

if(D.length==0)

printf("A B的交集为空集\n")

else

{

printf("A B的交集为C = {")

for(i = 0i <D.lengthi++)

printf("%d ",*(D.elem+i))

printf("}\n")

}

}

//定义函数A B差集

void A_B(SqList &A,SqList D)

{

int i,k,e

for(i = 0i <D.lengthi++)

{

e = GetElem(D,i)

k = LocateElem(A,e)

ListDelete(A,k)

}

if(A.length == 0)

printf("A B的差集为空集\n")

else

{

printf("A B的差集为E = {")

for(i = 0i <A.lengthi++)

printf("%d ",*(A.elem+i))

printf("}\n")

}

}

void ListDelete(SqList &A,int i)

{

int *p,*q

if(i <0 || i >A.length)

{

printf("error")

exit(0)

}

p = A.elem+i-1

q = A.elem+A.length-1

for(++pp <= q++p)

*(p-1) = *p

--A.length

}

int GetElem(SqList L,int j)

{

if(j<0||j>L.length)

printf("error")

return *(L.elem+j)

}

int LocateElem(SqList L,int e)

{

int i

for(i = 0i <L.lengthi++)

{

if(e==*(L.elem+i))

return i+1

}

return 0

}

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

using namespace std

//交集

void Intersection(int a[], int b[], int m, int n)

{

cout<<"两集合交集:"

for(int i = 0i <mi++)

{

for(int j = 0j <nj++)

{

if(a[i] == b[j])

{

cout<<a[i]<<' '

break

}

}

}

cout<<endl

}

//并集

void AddSets(int a[], int b[], int m, int n)

{

int flag

cout<<"两集合并集:"

for(int i = 0i <mi++)

{

flag = true

for(int j = 0j <nj++)

{

if(a[i] == b[j])

{

flag = false

break

}

}

if(flag) cout<<a[i]<<' '

}

for(int j = 0j <塌姿 nj++)

{

cout<<b[j]<<' '

}

cout<<endl

}

//差集

void SubSets(int a[], int b[], int m, int n)

{

int flag

cout<<"两集合差集:"

for(int i = 0i <mi++)

{

flag = true

for(int j = 0j <nj++)

{

if(a[i] == b[j])

{

flag = false

break

}

}

if(flag) cout<<a[i]<<' '

}

cout<<endl

}

void main()

{

int n1

int n2

int a[100]

int b[100]

cout<<"请输入第一个数组大小:"

cin>>n1

cout<<"请输入第一个数组元素:"

for (int i = 0i <n1i++)

{

cin>>a[i]

}

cout<<"请输氏衫凳入第二个数组大小:"

cin>>n2

cout<<"请输歼旅入第二个数组元素:"

for (i = 0i <n2i++)

{

cin>>b[i]

}

Intersection(a, b, n1, n2)

AddSets(a, b, n1, n2)

SubSets(a, b, n1, n2)

getchar()

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存