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