typedef int ElemType;
typedef struct
{
ElemType *set;
int len;
int MaxSize;
}SetSq;
/* 1.集合初始化*/
void InitSet(SetSq& S)
{
S.set=NULL;
S.len=S.MaxSize=0;
}
void InitSet(SetSq& S,int ms)/* 重载初始化函数*/
{
if (ms<=0)
{
cout<<"ms值非法"<<endl;exit(1);
}
S.MaxSize=ms;
S.set=new ElemType[ms];
if (S.set==NULL)
{
cout<<"内存分配失败"<<endl; exit(1);
}
S.len=0;
}
/* 2.向集合中插入元素 */
bool InsertSet(SetSq& S,ElemType item)
{
int i;
for (i=0;i<S.len;i++)
{
if (S.set[i]==item)
{
return false;
}
}
/* 如果集合满了,则该重新分配空间,把原来集合中的数据拷贝到新的数组中去,再把指向集合首地址的指针指向新的数组 */
if (S.len==S.MaxSize)
{
ElemType *p=new ElemType[2*S.MaxSize+1];
if (p==NULL)
{
cout<<"内存分配失败"<<endl;exit(1);
}
for (i=0;i<S.len;i++)
{
p[i]=S.set[i];
}
delete []S.set;
S.set=p;
S.MaxSize=2*S.MaxSize+1;
}
S.set[i+1]=item;
S.len++;
return true;
}
/* 3.从集合中删除一个元素 */
bool DeleteSet(SetSq& S,ElemType item)
{
int i;
for (i=0;i<S.len;i++)
{
if (S.set[i]==item)
{
break;
}
}
if(i!=S.len)
{
S.set[i]=S.set[S.len-1];/*如果被删的元素是集合中最后一个,就是把集合最后一个赋值还是给最后一个,然后舍弃,如果删除的是其他位置的,就是把最后一个赋值到被删除的位置,然后删除最后一个,原理一样*/
S.len--;
return true;
}
else return false;
}
/* 4.从集合中查找一个元素*/
bool FindSet(SetSq& S,ElemType& item)
{
int i;
for(i=0;i<S.len;i++)
{
if (item==S.set[i])
{
break;
}
}
if (i<S.len)
{
item=S.set[i];
return true;
}
else return false;
}
/* 5.修改集合中的一个元素值*/
bool ModifySet(SetSq& S,const ElemType& item)/*使用const表明item是不能改变的*/
{
int i;
for (i=0;i<S.len;i++)
{
if (S.set[i]==item)
{
break;
}
}
if (i<S.len)
{
S.set[i]=item;
return true;
}
else return false;
}
/* 6.判断一个元素是否属于集合*/
bool InSet(SetSq& S,ElemType item)
{
int i;
for (i=0;i<S.len;i++)
{
if (item==S.set[i]) return true;
}
return false;
}
/* 7.判断集合是否为空*/
bool EmptySet(SetSq& S)
{
return S.len==0;
}
/* 8.求出集合中元素的个数*/
int LenthSet(SetSq& S)
{
return S.len;
}
/* 9.输出集合中的所有元素*/
void OutputSet(SetSq& S)
{
int i;
for (i=0;i<S.len;i++)
{
cout<<S.set[i]<<' ';
}
cout<<endl;
}
/* 10.求两个集合的并集*/
/*先开辟一个新的集合空间,然后用第一个集合去初始化 并借助之前写的集合初始化函数和插入函数*/
SetSq UnionSet(SetSq& S1,SetSq& S2)/*由于返回还是一个集合,所以函数返回值为集合类型*/
{
SetSq S;
int i;
InitSet(S,S1.len);
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]);
}
return S;
}
/* 11.求两个集合的交集*/
SetSq InterseSet(SetSq& S1,SetSq& S2)
{
SetSq S;
int len;
if(S1.len<S2.len)len=S1.len;
else len=S2.len;
InitSet(S,len);
for (int i=0;i<S2.len;i++)
{
bool b=FindSet(S1,S2.set[i]);
if (b)
{
S.set[i]=S2.set[i];
len++;/*之前初始化集合S时,len的值会重新被置为0*/
}
}
return S;
}
/* 12.按元素的值或关键字对集合排序 这里使用简单插入排序方法*/
void SortSet(SetSq& S)
{
int i;
for (i=0;i<S.len;i++)
{
int temp=S.set[i];
int j;
for (j=i-1;j>=0;j--)
{
if (temp<S.set[j])
{
S.set[j+1]=S.set[j];
}
else break;
}
S.set[j+1]=temp;
}
}
/* 13. 清除集合中的所有元素*/
void ClearSet(SetSq& S)
{
if (S.set!=NULL)
{
delete []S.set;//释放内存空间
S.set=NULL;//收回指针,避免野指针出现
S.len=S.MaxSize=0;
}
}