集合的顺序存储结构和操作实现:
struct Set{
ElemType *set;
int len;
int MaxSize;
};
顺序存储就是定义一个数组类型的对象来存储集合元素,同时要定义一个整数变量来存储当前集合长度和定义一个整型常量或变量来存储数组类型的长度。
const int MaxSize=20;
ElemType set[MaxSize];
int len;
初始化集合并置为空
清除集合中的所有元素
求出集合的长度,及所含元素的个数
判断集合是否为空
判断一个元素是否属于集合
输出集合中的所有元素
从集合中查找一个元素:
bool Find(Set& S,ElemType& item){
for(int i=0;i<s.len;i++)
if(S.set[i]==item)break;
if(i<S.len){
item=S.set[i];
return true;
}else return false;
}
修改集合中的一个指定元素
向集合插入一个元素
/*
(1)顺序查找集合中是否存在值为待插入值item的元素,如存在则不能插入,返回假;
因为集合中允许存在重复的元素;
(2)检查集合空间是否用完,若是则动态重分配,增加存储空间。
(3)把item值插入到表尾
(4)集合长度+1
(5) 返回真表示插入成功
*/
bool InsertSet(Set &S,ElemType item){
int i;
for(i=0;i<S.len;i++)
if(S.set[i]==item)return false;
if(S.len==S.MaxSize){
int k=sizeof(ElemType);
S.set=(ElemType*)realloc(S.set,2*S.MaxSize*k);
if(S.set==NULL){
cout<<"动态可分配的存储空间用完,退出运行"<<endl;
exit(1);
}
S.MaxSize=2*S.MaxSize;
}
S.set[S.len]=item;
S.len++;
return true;
}
从集合中删除一个元素:
bool DeleteSet(Set& S, ElemType& item){
int i;
for(i=0;i<S.len;i++)
if(S.set[i]==item)break;
if(i<S.len){
item=S.set[i];
S.set[i]=S.set[S.len-1];
S.len--;
if(float(S.len)/S.MaxSize<0.4&&S.MaxSize>10){
int k=sizeof(ElemType);
S.set=(ElemType*)realloc(S.set.S.MaxSize*k/2);
S.MaxSize=S.MaxSize/2;
}
return true;
}else return false;
}
求两个集合的并集
void UnionSet(Set& S1,Set& s2,Set& s){
int i;
if(S.MaxSize<S1.MaxSize){
delete[]S.set;
S.set[i]=new ElemType[S1.MaxSize];
S.MaxSize=S1.MaxSize;
}
for(i=0;i<S1.len;i++){
S.set[i]=S1.set[i];
}
S.len=S1.len;
for(i=0;i<S2.len;i++){
InsertSet(S,S2.set[i]);
}
}
求两个集合的交集
void InterseSet(Set& S1,Set& S2,Set& S){
int i;
ElemType x;
S.len=0;
for(i=0;i<S2.len;i++){
x=S2.set[i];
if(FindSet(S1,x)){
S.set[S.len]=x;
S.len++;
if(S.len==S.MaxSize){
int k=sizeof(S.MaxSize);
S.set=(ElemType*)realloc(S.set,2*S.MaxSize*k);
S.MaxSize=S.MaxSize*2;
}
}
}
}
求两个集合的差集;就是找两个集合中独一无二的元素
void DifferenceSet(Set& S1,Set& S2,Set& S){
int i;
ElemType x;
S.len=0;
for(i=0;i<S2.len;i++){
int x=S2.set[i];
if(!FindSet(S1,x)){
S.set[len]=x;
S.len++;
if(S.len==S.MaxSize){
int k=sizeof(Elemtype);
S.set=(ElemType*)realloc(S.set,2*S.MaxSize*k);
S.MaxSize=S.MaxSize*2;
}
}
}
}
这就是集合的一些基本操作,可以了解一下;太简单的操作就没写。集合是一个很实用的数据结构。在算法体重经常使用,不过一般不用自己手写,有STL很强大的工具。