当前位置:首页 » 编程语言 » 集合的交并差c语言心得
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

集合的交并差c语言心得

发布时间: 2022-05-28 09:36:52

㈠ 请问如何用c语言代码实现两个集合的交,并,相对补,对称差的运算并判断两个集合是否相等

先取到两个集合的数组或是指针,循环遍历各个元素,至于二者的交、并、补可以用与、或、非来实现,实现方式大概就是这样。

㈡ 数据结构 用c语言写的 集合的并、交和差运算的程序

可以用二个一维数组,
再用两个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...!

㈢ 单链表表示的集合交,并,差运算,设计采用定义集合,用集合运算表达式求值的方式进行。C语言实现。

#include<stdio.h>
#include<stdlib.h>
typedef
struct
LNode//
定义结构体类型指针
{
char
data;
struct
LNode*next;
}*pointer;
void
readdata(pointer
head)//
定义输入集合函数
{
pointer
p;
char
tmp;
scanf("%c",&tmp);
while(tmp!='\n')
{
p=(pointer)malloc(sizeof(struct
LNode));
p->data=tmp;
p->next=head->next;
head->next=p;
scanf("%c",&tmp);
}
}
void
pop(pointer head)//定义输出集合函数
{
pointer
p;
p=head->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
void
or(pointer head1,pointer head2,pointer head3)//定义集合的交集函数
{
pointer
p1,p2,p3;
p1=head1->next;
while(p1!=NULL)
{
p2=head2->next;
while((p2!=NULL)&&(p2->data!=p1->data))
p2=p2->next;
if((p2!=NULL)&&(p2->data==p1->data))
{
p3=(pointer)malloc(sizeof(structLNode));
p3->data=p1->data;
p3->next=head3->next;
head3->next=p3;
}
p1=p1->next;
}
}
void main()//主函数
{
int x;
printf("(输入数据,按回车键结束\n");
pointerhead1,head2,head3;
head1=(pointer)malloc(sizeof(structLNode));
head1->next=NULL;
head2=(pointer)malloc(sizeof(structLNode));
head2->next=NULL;
head3=(pointer)malloc(sizeof(structLNode));
head3->next=NULL;printf("请输入集合A:\n");
readdata(head1);//调用输入集合函数
printf("请输入集合B:\n");
readdata(head2);//调用输入集合函数A:
printf("1.交集2.结束\n");
do
{
printf("请选择序号\n");
scanf("%d",&x);
switch(x)
{
case1:
or(head1,head2,head3);//调用交集函数
printf("集合A为:");
pop(head1);
printf("集合B为:");
pop(head2);
printf("两集合的交集C=A∩B:");
pop(head3);
head3->next=NULL;
break;
case2:
break;
default:
gotoA;
}
}while(x!=2);
}

㈣ 实验、集合的交、并差 用c语言

#include"stdio.h"

intinput(intd[],intn)
{
inti;
//n=0;
do
{
scanf("%d",d+n);
n+=1;
}while(d[n-1]>=0);
d[n-1]='';
returnn-1;
}
voidsort(intd[],int*n)
{
inti,j,t,k;
for(i=0;i<*n-1;i++)
{
for(j=*n-1;j>i;j--)
{ if(d[j]==d[j-1])
{
*n-=1;
for(k=j;k<*n;k++)
d[k]=d[k+1];
}
if(d[j]<d[j-1])
{
t=d[j];d[j]=d[j-1];d[j-1]=t;
}

}
}
}
intfn(intd1[],intnum1,intd2[],intnum2)
{
inti,j,m;

for(i=0;i<num1;i++)
{
m=0;
for(j=0;j<num2;j++)
{
if(d1[i]==d2[j])
{
m=1;
break;
}
}
if(m==0)
printf("%d,",d1[i]);
}
}
intmain()
{
intA[100],B[100],C[200];
intnuma,numb,n;
inti,j;
//输入
printf("inputsortA:");
numa=input(A,0);
sort(A,&numa);
printf("inputsortB:");
numb=input(B,0);
sort(B,&numb);
//交集
printf("集合交集A∩B={");
for(i=0;i<numa;i++)
{
for(j=0;j<numb;j++)
{
if(A[i]==B[j])
{
printf("%d,",A[i]);
}

}
}
printf("} ");
//并集
n=numa+numb;
printf("集合并集A∪B={");
for(i=0;i<numa;i++)
{
C[i]=A[i];
}
for(i=numa;i<n;i++)
{
C[i]=B[i-numa];
}
sort(C,&n);
for(i=0;i<n;i++)
printf("%d,",C[i]);
printf("} ");
//集合差
printf("A-B={");
fn(A,numa,B,numb);
printf("} ");
}

㈤ 求任意两个正数集合的并、交和差集。用C语言做。

数字有什么特征:
1. 都是正整数么?
2. 数字的范围是多少?
3. 每个结合内部有没有重复的数字?

如果都是正整数,并且每个集合都没有重复数字,那问题就相当好办了,用直接存储的数据结构即可。

“交:从一个集合中取出一个元素,在另一个集合中查找,如果有它就是交中的并:并也类似,关键就是判断这个元素是否都在这两个集合中出现。差:差更 ”

这种方式效率太低,当结合非常大的时候,时间复杂度回事O(N^2),用直接存储可以保证时间复杂度为O(N)。

㈥ 集合的并,交,差以及它们的混合运算的算法(c语言)

/*diff.c:差运算*/
#include<stdio.h>
#include<stdlib.h>
intset_a[5]={1,3,5,9,7};//非0元素构成的集合
intset_b[5]={1,5,2,8,4};
intset_c[10]={0};
intisin(inta_or_b,intelem)
{
int*set_tmp;
intcnt;
switch(a_or_b)
{
case1:
set_tmp=set_b;
break;
case2:
set_tmp=set_a;
break;
default:
printf("parametererror! ");
}
for(cnt=0;cnt<5;cnt++)
{
if(set_tmp[cnt]==elem)
{
return1;
}
}
return0;
}
intmain(intargc,char*argv[])
{
intcnt,cnt2=0;
for(cnt=0;cnt<5;cnt++)
{
if(isin(1,set_a[cnt])==1)//如果集合a中的元素在集合b中
{
set_c[cnt2++]=set_a[cnt];
}
}
printf("Theresultofdiff: ");
for(cnt=0;set_c[cnt]!=0;cnt++)//输出非0元素
{
printf("%d ",set_c[cnt]);
}
putchar(' ');
return0;
}

亲是要这样做差运算吗?

㈦ 怎样用语言c语言实现集合的合并,交集

通过你描述的问题,正确的交集代码如下:
void
bing(char
a[],char
b[],int
m,int
n)
{
char
d[400];
int
i=0,j=0,s=m;
for(i=0;i<m;i++)
d[i]=a[i];
for(i=0;i<n;i++){
for(j=0;j<m;j++)
{
if(b[i]==a[j])
break;
}
if(j==m)
d[s++]=b[i];
}
cout<<"集合并集是:";
for(i=0;i<s;i++)
cout<<d[i]<<"
";
}

㈧ C语言编写集合的并交差

int a1[5]={1, 2, 4, 7, 8};
int a2[6]={3, 2, 5, 8, 9, 0};
int a3[11];
//并 a3[11] = [1, 2, 3, 4, 5, 7, 8, 9, 0] ,返回值为长度:9
int Bing(int *p1, int nlen1, int *p2,int nlen2, int *pdest)
{
int nPos;
bool bFind;

if((!p1) || (!p2) || (!pdest))
return 0;
for(nPos=0; nPos<nlen1; nPos++)
{
pdest[nPos] = p1[nPos];
}

for(int i=0; i<nlen2; i++)
{
bFind = false;
for(int j=0; j<nPos; j++)
{
if(pdest[j] == p2[i])
{
bFind = true;
break;
}
}
if(!bFind)
pdest[nPos++] = p2[i];
}
return nPos;
}

//交 a3[11] = [2, 8]
int Jiao(int *p1, int nlen1, int *p2, int nlen2, int *pdest)
{
int nPos;
bool bFind;

if((!p1) || (!p2) || (!pdest))
return 0;
nPos = 0;
for(int i=0; i<nlen1; i++)
{
for(int j=0; j<nlen2; j++)
{
if(p1[i] == p2[j])
pdest[nPos++] = p1[i];
}
}
return nPos;
}

//int a1[5]={1, 2, 4, 7, 8};
//int a2[6]={3, 2, 5, 8, 9, 0};
//差. a3[11] = [1, 4, 7]
int Cha(int *p1, int nlen1, int *p2, int nlen2, int *pdest)
{
int nPos;
bool bFind;

if((!p1) || (!p2) || (!pdest))
return 0;
nPos = 0;
bFind = false;
for(int i=0; i<nlen1; i++)
{
bFind = false;
for(int j=0; j<nlen2; j++)
{
if(p1[i] == p2[j])
bFind = true;
}
if(!bFind)
pdest[nPos++] = p1[i];
}
return nPos;
}

void PrintArray(int *p, int nlen)
{
if(!p)
return;
for(int i=0; i<nlen; i++)
printf("%d ", p[i]);
printf("\n");
}
void main()
{
int nlen;

nlen = Bing(a1, 5, a2, 6, a3);
PrintArray(a3, nlen);

nlen = Jiao(a1, 5, a2, 6, a3);
PrintArray(a3, nlen);

nlen = Cha(a1, 5, a2, 6, a3);
PrintArray(a3, nlen);
}

㈨ C++在类中实现集合的交,并,差运算,怎么做呀

1,是否属于集合,就拿这个元素和集合里面的比较啊,如果想等就存在。
2,实现并,就是拿一个集合A里面的一个元素,和另外一个集合B的元素比较,如果想等就不要这个A中元素。不想等就把A中这个元素加入到B中,前提是B数组足够大。也可以再建立个C集合。
3,实现交 ,就是把集合A中元素和集合B中元素想等的取出来,放到C中。
上面主要是利用for 循环进行。