集合

集合的顺序存储结构和操作实现:

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很强大的工具。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值