集合的顺序存储及操作实现

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;
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值