当前位置:首页 » 编程语言 » c语言求集合交集

c语言求集合交集

发布时间: 2022-06-21 17:21:43

A. 如何写一个c语言程序求两个集合的交集

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

B. 用c语言编写一段程序,求两个集合的交

/*链表实现集合运算*/
#include<iostream.h>

typedef int ElemType;
struct SNode {
ElemType data;
SNode* next;
};

void InitSet(SNode*& HT)
{
HT=NULL;
}

void ClearSet(SNode*& HT)
{
SNode *p=HT, *q;
while(p!=NULL)
{
q=p->next;
delete p;
p=q;
}
HT=NULL;
}

int LenthSet(SNode* HT)
{
int n=0;
while(HT!=NULL)
{
n++;
HT=HT->next;
}
return n;
}

bool EmptySet(SNode* HT)
{
return HT==NULL;
}

bool Inset(SNode* HT, ElemType item)
{
while(HT!=NULL)
{
if(HT->data==item) return true;
else HT=HT->next;
}
return false;
}

void OutputSet(SNode* HT)
{
while(HT!=NULL)
{
cout<<HT->data<<' ';
HT=HT->next;
}
cout<<endl;
}

bool FindSet(SNode* HT, ElemType& item)
{
while(HT!=NULL)
{
if(HT->data==item) break;
else HT=HT->next;
}
if(HT!=NULL)
{
item=HT->data;
return true;
}
else return false;
}

bool ModifySet(SNode* HT, ElemType item, ElemType temp)
{
while(HT!=NULL)
{
if(HT->data==item) break;
else HT=HT->next;
}
if(HT!=NULL)
{
HT->data=temp;
return true;
}
else return false;
}

bool InsertSet(SNode*& HT, ElemType item)
{
//建立值为item的新结点
SNode* newptr= new SNode;
newptr->data=item;
//从单链表中顺序查找是否存在值为item的结点
SNode* p=HT;
while(p!=NULL)
{
if(p->data==item) break;
else p=p->next;
}
// 若不存在则把新结点插入到表头并返回真,否则不返回假
if(p==NULL)
{
newptr->next=HT;
HT=newptr;
return true;
}
else return false;
}

bool DeleteSet(SNode*& HT, ElemType& item)
{
//从单链表中顺序查找是否存在值为item的结点
SNode *cp=HT, *ap=NULL;
while(cp!=NULL)
{
if(cp->data==item) break;
else
{
ap=cp;
cp=cp->next;
}
}
//若不存在则不返回假,表明删除失败
if(cp==NULL)
return false;
//由item带回待删除结点cp的完整值,若不需要带回可设置item为值参
item=cp->data;
if(ap==NULL) HT=cp->next;
//从单链表中删除已经找到的cp结点并对ap是否为表头做不同处理
else ap->next = cp->next;
//删除cp结点后返回真
delete cp;
return true;
}

//求两集合的并集
void UnionSet(SNode* HT1, SNode* HT2, SNode*& HT)
{
HT=NULL;
//把HT1集合单链表元素复制到HT集合单链表中
SNode* p=HT1;
while(p!=NULL)
{
//建立新结点并赋值为p->data
SNode* newptr=new SNode;
newptr->data=p->data;
//把新结点插入到HT集合单链表的表头并让P指向下一个结点
newptr->next=HT;
HT=newptr;
p=p->next;
}
//把HT1集合单链表的每个元素插入到HT集合单链表中
p=HT2;
while(p!=NULL)
{
InsertSet(HT, p->data);
p=p->next;
}
}

//求集合的交集
void InterseSet(SNode* HT1, SNode* HT2, SNode*& HT)
{
HT=NULL;
ElemType x;
SNode* p=HT2;
while(p!=NULL)
{
x=p->data;
bool b=FindSet(HT1,x); //用x查找HT1集合
if(b) InsertSet(HT,x); //若查找成功则把x插入到HT集合中
p=p->next;
}
if(HT==NULL)
cout<<"空集"<<endl;
}

//求集合的差集
void DifferenceSet(SNode* HT1, SNode* HT2, SNode*& HT)
{
HT=NULL;
ElemType x;
SNode* p=HT1;
while(p!=NULL)
{
x=p->data;
bool b=FindSet(HT2,x); //用x查找HT2集合
if(b) InsertSet(HT,x); //若查找失败则把x插入到HT集合中
p=p->next;
}
if(HT==NULL)
cout<<"空集"<<endl;
}

int main()
{
SNode *a,*b,*c,*d;
InitSet(a);
InitSet(b);
InitSet(c);
InitSet(d);
ElemType r[8] = {12,32,13,1,2,4,7,8};
ElemType r1[8] = {25,98,26,15,46,38,5,1};
ElemType r2[8] = {5,98,25,8,34,1,15,46};
int i;
for(i=0;i<8;i++)
InsertSet(a,r[i]);
for(i=0;i<8;i++)
InsertSet(b,r1[i]);
for(i=0;i<8;i++)
InsertSet(c,r2[i]);
ElemType x=1,y=25;
DeleteSet(a,x);
DeleteSet(a,y);
cout<<"输出a集合的元素:"<<endl;
OutputSet(a);
cout<<"---------------------------------------------------------"<<endl;
if(ModifySet(a,13,30))
cout<<"把 a 集合的 13 更新为 30 更新成功 !"<<endl;
else
cout<<"集合 a 更新不成功 !"<<endl;
if(EmptySet(a))
cout<<"集合 a 为空 !"<<endl;
else
cout<<"集合 a 不为空 !"<<endl;
cout<<"集合a的长度:"<<LenthSet(a)<<endl;
cout<<"---------------------------------------------------------"<<endl;

cout<<"输出b集合的元素:"<<endl;
OutputSet(b);
cout<<endl;

cout<<"输出c集合的元素:"<<endl;
OutputSet(c);
cout<<endl;

cout<<"b、c两个集合的并集是:"<<endl;
UnionSet(b,c,d);
OutputSet(d);
cout<<endl;

cout<<"b、c两个集合的交集是:"<<endl;
InterseSet(b,c,d);
OutputSet(d);
cout<<endl;

cout<<"b、c两个集合的差集(c-b)是:"<<endl;
DifferenceSet(b,c,d);
OutputSet(d);

ClearSet(a);
ClearSet(b);
ClearSet(c);
ClearSet(d);

return 0;
}

C. 求教如何用C语言求两个字母集合的交集

首先,如果是数学上的集合概念,那就说明,集合A自身的每个元素都不相同。

那么,程序就可以简化成,

  1. 设数组key[52],用于记录字母出现次数。

  2. 扫描一次集合A,把出现的字母计到key的对应位置里。

  3. 同理扫描一次集合B。

  4. 查看key数组,>=2的对应字母输出到集合C,C就是所求交集。

D. c语言算法求两个集合交集代码解释,最后两句t->next=hc; hc=t;各是什么意思

在你给出的代码中,找不到hc的定义,也就是说代码不全。
所以不进行全局代码解释
从题目中得到的信息是,找两个集合的交集,用C语言的描述就是找数据的相同点的位置。具体你看着办 嘿嘿^_^

E. 如何用C语言编写求交集和并集的程序

char c[20];//存储交集的字符int count=0;//统计交集个数for (n=1;n<j;n++)
for (m=1;m<=k;m++)
{
if(a[n]==b[m]) { c[count]=a[n]; count++; }
}
} c[count]='\0';printf("交集为%s",c);

F. 怎样用语言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]<<"
";
}

G. 本人碰见一道C语言难题,寻大神帮助,利用C语言实现:求任意两个集合的交集、并集、差集,兄弟感激不尽

可以利用数组存放2个集合比如数组A,和数组B,交集就是遍历寻找两个相同的数字(两次循环),保存到另一个数组中就可以了,
并集就是从A数组中取出每个元素去数组B比较,如果A中没有则添加进去
同理你根据差集的定义就可以解决

H. C语言怎么用函数求集合的交集

首先,如果是数学上的集合概念,那就说明,集合A自身的每个元素都不相同。
那么,程序就可以简化成,
设数组key[52],用于记录字母出现次数。
扫描一次集合A,把出现的字母计到key的对应位置里。
同理扫描一次集合B。
查看key数组,>=2的对应字母输出到集合C,C就是所求交集。

I. c语言中求三个集合的交集的程序

#include<bits/stdc++.h>
#defineLLlonglong
usingnamespacestd;

bitset<10001>a,b,c,d;

intmain(){
d=a&b&c;
}

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

#include<stdio.h>
#include<string.h>
#include<conio.h>

#defineARR_LEN255 /*数组长度上限*/
#defineelemTypechar /*集合元素数据类型*/

/*集合数据结构*/
typedefstructset{
elemTypedata[ARR_LEN];
intlength;
}set;

/*初始化集合*/
voidinitSet(set*S){
S->length=0;
}

/*交集*/
/*A与B的交集(A∩B):既属于A又属于B的元素构成的集合*/
intsetIntersection(setA,setB,set*dest){
inti=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)
return1;
else
return0;
}

/*并集*/
/*A与B的并集(A∪B):A与B所有元素构成的集合*/
intsetUnion(setA,setB,set*dest){
inti=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)
return1;
else
return0;
}

/*补集*/
/*B在A中的相对补集(A\B):属于A但不属于B的元素构成的集合*/
intsetComplement(setA,setB,set*dest){
inti=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)
return1;
else
return0;
}

/*打印集合内容*/
intprintSet(setS){
inti;
if(S.length==0){
puts("Thesetisempty!");
return0;
}
for(i=0;i<S.length;i++)
printf("%c",S.data[i]);
putchar(' ');
return1;
}

intmain(void){
setA,B;
setAIB,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: ");
printSet(A);
printf("B: ");
printSet(B);
putchar(' ');

printf("A∩B: ");
setIntersection(A,B,&AIB);
printSet(AIB);

printf("A∪B: ");
setUnion(A,B,&AUB);
printSet(AUB);

printf("A\B: ");
setComplement(A,B,&ACB);
printSet(ACB);

getch();/*屏幕暂留*/
return0;
}

热点内容
如何配置2柠檬酸 发布:2025-02-06 00:57:26 浏览:434
积木源码 发布:2025-02-06 00:55:26 浏览:545
变分的运算法则 发布:2025-02-06 00:55:21 浏览:775
x2哪个配置性价比高 发布:2025-02-06 00:40:12 浏览:109
猪哥亮访问张菲 发布:2025-02-06 00:37:52 浏览:570
期货账户怎么改密码 发布:2025-02-06 00:32:35 浏览:279
qq自动上传群文件 发布:2025-02-06 00:26:25 浏览:111
安卓照片放在什么地方 发布:2025-02-06 00:26:24 浏览:988
linux系统镜像iso 发布:2025-02-06 00:15:39 浏览:188
存储上料模块的意义 发布:2025-02-06 00:14:14 浏览:125