c語言求集合交集
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自身的每個元素都不相同。
那麼,程序就可以簡化成,
設數組key[52],用於記錄字母出現次數。
掃描一次集合A,把出現的字母計到key的對應位置里。
同理掃描一次集合B。
查看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;
}