C语言任意输入两个集合A,B,计算A并B,A交B,A减B,A对称差B

邮箱 596241679@qq.com 谢谢了!!
2025-04-14 14:10:03
推荐回答(3个)
回答1:

j

回答2:

你这个是数集还是字符集,还是都有呢?

回答3:

集合是一种比较重要的数据结构,比较正规的是先定义这个数据结构:
#ifndef SET_H_
#define SET_H_

typedef struct Set {
char elements[128];
} Set;

// 初始为空
void MakeEmpty(Set *set);
// 计算元素数目
int GetSize(Set *set);
// 是否包含某元素
int Contain(Set *set,char element);
// 添加元素
void AddElement(Set *set,char element);
// 删减元素
void DeleteElement(Set *set,char element);
// 并运算
Set Join(Set *A,Set *B);
// 交运算
Set Meet(Set *A,Set *B);
// 减法运算
Set Sub(Set *A,Set *B);
// 对称差运算
Set SymmetricalSub(Set *A,Set *B);

#endif
保存这个文件为Set.h
然后再在一个C文件中对其中的函数给以实现

// file : Set.c

#include "Set.h"
#include

// 初始化为空 => Done
void MakeEmpty(Set *set){
int i;
for(i=0;i<128;i++){
(*set).elements[i]=0;
}
}

// 获得大小 => Done
int GetSize(Set *set){
int Size=0;
int i;
for(i=0;i<128;i++){
if((*set).elements[i]==0)
break;
else {
Size++;
}
}
return Size;
}

// 是否包含指定元素 => Done
int Contain(Set *set,char element){
int Contain=0;
int i;
int Size=GetSize(set);
for(i=0;i if((*set).elements[i]==element){
Contain=1;
break;
}
}
return Contain;
}

// 新加一个元素 => Done
void AddElement(Set *set,char element){
int Size=GetSize(set);
int exist=0;
int count;
for(count=0;count if((*set).elements[count]==element){
exist=1;
break;
}
}
if(!exist){
(*set).elements[Size]=element;
}
}

// 删除一个元素 =>Done
void DeleteElement(Set *set,char element){
int Size=GetSize(set);
int MarkPosition=-1;
int i;
for(i=0;i if((*set).elements[i]==element){
MarkPosition=i;
break;
}
}
if(MarkPosition>=0){
for(i=MarkPosition;i (*set).elements[i]=(*set).elements[i+1];
}
(*set).elements[Size-1]=0;
}
}

// 并运算 => Done
// 不得不承认,该算法是最差的算法
Set Join(Set *A,Set *B){
// 以A集合为基准集合,如果A中不含有B中某元素,就把B集合中的元素加入到A
Set set=*A;
int Size=GetSize(B);
int i;
for(i=0;i if(!Contain(A,(*B).elements[i])){
AddElement(&set,(*B).elements[i]);
}
}
// 在return的时候,set这段内存就已经被释放了
return set;
}

// 交运算 => Done
Set Meet(Set *A,Set *B){
Set set;
int SizeOfA=GetSize(A);
int i;
MakeEmpty(&set);
for(i=0;i if(Contain(B,(*A).elements[i])){
AddElement(&set,(*A).elements[i]);
}
}
return set;
}

// 差运算 A-B => Done
Set Sub(Set *A,Set *B){
Set set=*A;
int Size=GetSize(B);
int i;
for(i=0;i if(Contain(A,(*B).elements[i])){
DeleteElement(&set,(*B).elements[i]);
}
}
return set;
}

// 对称差运算 => Done
Set SymmetricalSub(Set *A,Set *B){
Set set1=Join(A,B);
Set set2=Meet(A,B);
Set set=Sub(&set1,&set2);
return set;
}
这个保存为Set.c
之后就可以编写你自己的程序了,我简单的写了一个:
#include
#include "Set.h"

int main(){
Set A;
Set B;
Set C;
MakeEmpty(&A);
MakeEmpty(&B);
AddElement(&A,'A');
AddElement(&A,'C');
AddElement(&A,'D');
AddElement(&B,'B');
AddElement(&B,'C');
C=SymmetricalSub(&A,&B);

printf("Now , the size of C : %d \n", GetSize(&C));
}
希望能帮到您。