集合的順序儲存及操作實現

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.