當前位置:首頁 » 編程語言 » 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;
}

熱點內容
python3graphics 發布:2025-02-05 21:36:57 瀏覽:511
為什麼英雄聯盟一個伺服器進不去 發布:2025-02-05 21:36:12 瀏覽:182
伺服器搭建網站開發教材 發布:2025-02-05 21:31:57 瀏覽:567
pythonrose 發布:2025-02-05 21:31:46 瀏覽:923
php數組從小到大排序 發布:2025-02-05 21:26:01 瀏覽:324
單片機存儲器擴展 發布:2025-02-05 21:17:35 瀏覽:966
sqler圖 發布:2025-02-05 21:10:58 瀏覽:630
網路編程android 發布:2025-02-05 21:05:49 瀏覽:346
python時間毫秒數 發布:2025-02-05 20:51:32 瀏覽:331
clash安卓如何切換節點 發布:2025-02-05 20:48:20 瀏覽:890