C++写的集合的交叉并

#include <iostream>
#include <stdlib.h>
#include <memory.h>
using namespace std;

class Set
{
 friend void InsertSort(int *array1, int len);
 friend void MergePlus(int *array1, const int *arrA,const int *arrB,
  int lenA, int lenB, int *ilen);
 friend void MergeCut(int *array1, const int *arrA, const int *arrB,
  int lenA, int lenB, int *ilen);
 friend void MergeCross(int *array1, const int *arrA, const int *arrB,
  int lenA, int lenB, int *ilen);
 //friend Set operator+(const Set& A, const Set &B);
public:
 Set();
 Set(int s[],int n);
 Set(const Set &ohter); //拷贝构造
 int find(int x)const; //判断x是否在集合中
 Set& operator=(const Set &other);//赋值运算符重载
 Set operator+(const Set &other);//集合的并集
 Set operator-(const Set &other);//集合的差集
 Set operator*(const Set &other);//集合的交集
 void disp(); 
 ~Set();

private:
 int *elem;//存放集合元素的指针
 int count;//存放集合中的元素个数
};

void InsertSort(int *array1, int len) //直接插入排序
{
 int i, j;
 int curKey;

 for(i = 1; i < len; ++i)
 {
  curKey = array1[i];
  j = i - 1;

  while(curKey < array1[j] && j >= 0)
  {
   array1[j+1] = array1[j];
   --j;
  }
  array1[j+1] = curKey;
 }
}

void MergePlus(int *array1, const int *arrA, const int  *arrB, int lenA, int lenB, int *ilen) //归并排序
{
 static int  ia = 0, ib = 0;
 static int flag = 1;
 if(lenA <= 0 && lenB <= 0)
 {
  flag = 0;
  return;
 }
 if(lenA <= 0 && lenB>0)
 {
  array1[(*ilen)++] = arrB[ib++];
  MergePlus(array1, arrA, arrB, lenA, lenB-1, ilen);
 }
 if(lenA >0 && lenB <= 0)
 {
  array1[(*ilen)++] = arrA[ia++];
  MergePlus(array1, arrA, arrB, lenA -1, lenB, ilen);
 }

 if( flag && arrA[ia] < arrB[ib])
 {
  array1[(*ilen)++] = arrA[ia++];
  MergePlus(array1, arrA, arrB, lenA -1, lenB, ilen);
 }
 else if(flag && arrA[ia] == arrB[ib])
 {
  array1[(*ilen)++] = arrA[ia++];
  ib++;
  MergePlus(array1, arrA, arrB, lenA -1, lenB -1, ilen);
 }
 else if(flag)
 {
  array1[(*ilen)++] = arrB[ib++];
  MergePlus(array1, arrA, arrB, lenA, lenB - 1, ilen);
 }
}

void MergeCut(int *array1, const int *arrA, const int  *arrB, int lenA, int lenB, int *ilen) //归并排序
{
 static int  ia = 0, ib = 0;
 static int flag = 1;
 if(lenA <= 0 && lenB <= 0)
 {
  flag = 0;
  return;
 }
 if(lenA <= 0 && lenB>0)
 {
  array1[(*ilen)++] = arrB[ib++];
  MergeCut(array1, arrA, arrB, lenA, lenB-1, ilen);
 }
 if(lenA >0 && lenB <= 0)
 {
  array1[(*ilen)++] = arrA[ia++];
  MergeCut(array1, arrA, arrB, lenA -1, lenB, ilen);
 }

 if( flag && arrA[ia] < arrB[ib])
 {
  array1[(*ilen)++] = arrA[ia++];
  MergeCut(array1, arrA, arrB, lenA -1, lenB, ilen);
 }
 else if(flag && arrA[ia] == arrB[ib])
 {
  ia++;
  ib++;
  MergeCut(array1, arrA, arrB, lenA -1, lenB -1, ilen);
 }
 else if(flag)
 {
  array1[(*ilen)++] = arrB[ib++];
  MergeCut(array1, arrA, arrB, lenA, lenB - 1, ilen);
 }
}

void MergeCross(int *array1, const int *arrA, const int  *arrB, int lenA, int lenB, int *ilen) //归并排序
{
 static int  ia = 0, ib = 0;
 static int flag = 1;
 if(lenA <= 0 && lenB <= 0)
 {
  flag = 0;
  return;
 }

 if( flag && arrA[ia] < arrB[ib])
 {
  ia++;
  MergeCross(array1, arrA, arrB, lenA -1, lenB, ilen);
 }
 else if(flag && arrA[ia] == arrB[ib])
 {
  array1[(*ilen)++] = arrA[ia++];
  ib++;
  MergeCross(array1, arrA, arrB, lenA -1, lenB -1, ilen);
 }
 else if(flag)
 {
  ib++;
  MergeCross(array1, arrA, arrB, lenA, lenB - 1, ilen);
 }
}

Set::Set()
{
 elem = NULL;
 count = 0;
}

Set::~Set()
{
 delete[]elem;
 elem = NULL;
}

Set::Set(int s[], int n)
{
 elem = new int[n];
 if(elem == NULL)
 {
  cout << "Memory assign failure!!" << endl;
  exit(1);
 }
 for(int i = 0; i < n; ++i)
 {
  elem[i] = s[i];
 }
 count = n;
}

Set::Set(const Set &other)
{
 if(other.elem == NULL)
 {
  cout << "other object is empty!~!" <<endl;
  exit(1);
 }
 else
 {
  elem = new int[other.count];
  if(elem == NULL)
  {
   cout << "Memory assign failure!!" << endl;
   exit(1);
  }
  for(int i =0; i < other.count; ++i)
  {
   elem[i] = other.elem[i];
  }
  count = other.count;
 }
}

Set& Set::operator =(const Set &other)
{
 if(this == &other)
 {
  return *this;
 }
 delete[] elem;
 elem = new int[other.count];
 if(elem == NULL)
 {
  cout << "Memory assign failure!!" << endl;
  exit(1);
 }
 for(int j = 0; j < other.count; ++j)
 {
  elem[j] = other.elem[j];
 }
 count = other.count;
 return *this;
}

int Set::find(int x) const
{
 if(elem == NULL)
 {
  cout << "The set now is empty!!/n" << endl;
  exit(1);
 }
 else
 {
  for(int i = 0; i < count; ++i)
  {
   if(x == elem[i])
   {
    return 1;
   }
  }
  return 0;
 }
}
/*
Set operator+(const Set& A, const Set &B)
{
 if(A.elem == NULL && B.elem != NULL)
 {
  return Set(B.elem, B.count);
 }
 else if(B.elem == NULL)
 {
  return A;
 }
 else
 {
  int length = 0;
  InsertSort(A.elem, A.count);
  InsertSort(B.elem, B.count);
  int *array1 = new int[A.count + B.count];
  if(array1 == NULL)
  {
   cout << "Memory assign failure~~"<< endl;
   exit(1);
  }
  MergePlus(array1,A.elem, B.elem, A.count,
   B.count, &length);
  Set temp(array1, length);//构造临时对象
  //temp.count = length;
  //temp.elem = new int[length];
  //memcpy(temp.elem, array1, length * sizeof(*array1));
  delete[]array1;
  array1 = NULL;
  return temp;
 }
}
*/
Set Set::operator+(const Set &other)
{
 if(this == NULL && other.elem != NULL)
 {
  return Set(other.elem, other.count);
 }
 else if(other.elem == NULL)
 {
  return *this;
 }
 else if(this == &other) //判断两个集合相等
 {
  return *this;
 }
 else
 {
  int length = 0;
  InsertSort(this->elem, count);
  InsertSort(other.elem, other.count);
  int *array1 = new int[this->count + other.count];
  if(array1 == NULL)
  {
   cout << "Memory assign failure~~"<< endl;
   exit(1);
  }
  MergePlus(array1,this->elem, other.elem, this->count,
   other.count, &length);
  Set temp(array1, length);
  //temp.count = length; //构造临时对象
  //temp.elem = new int[length];
  //memcpy(temp.elem, array1, length * sizeof(*array1));
  delete[]array1;
  array1 = NULL;
  return temp;
 }
}

Set Set::operator-(const Set &other)
{
 if(this == NULL && other.elem != NULL)
 {
  return Set(other.elem, other.count);
 }
 else if(other.elem == NULL)
 {
  return *this;
 }
 else if(this == &other) //判断两个集合相等
 {
  return *this;
 }
 else
 {
  int length = 0;
  InsertSort(this->elem, count);
  InsertSort(other.elem, other.count);
  int *array1 = new int[this->count + other.count];
  if(array1 == NULL)
  {
   cout << "Memory assign failure~~"<< endl;
   exit(1);
  }
  MergeCut(array1,this->elem, other.elem, this->count,
   other.count, &length);
  Set temp(array1, length);
  delete[]array1;
  array1 = NULL;
  return temp;
 }
}

Set Set::operator*(const Set &other)
{
 if(this == NULL && other.elem != NULL)
 {
  return Set(other.elem, other.count);
 }
 else if(other.elem == NULL)
 {
  return *this;
 }
 else if(this == &other) //判断两个集合相等
 {
  return *this;
 }
 else
 {
  int length = 0;
  InsertSort(this->elem, count);
  InsertSort(other.elem, other.count);
  int *array1 = new int[this->count + other.count];
  if(array1 == NULL)
  {
   cout << "Memory assign failure~~"<< endl;
   exit(1);
  }
  MergeCross(array1,this->elem, other.elem, this->count,
   other.count, &length);
  Set temp(array1, length);
  delete[]array1;
  array1 = NULL;
  return temp;
 }
}
void Set::disp()
{
 for(int i = 0; i < count; ++i)
 {
  cout << elem[i]<< ",  ";
  if((i+1) % 11 == 0)
  {
   cout << endl;
  }
 }
 cout << endl;
}
int main()
{
 int Setobj1[] = {1,3,4,5,6,7};
 int Setobj2[] = {2,4,5,8,9,0};

 int len1 = sizeof(Setobj1)/ sizeof(int);
 int len2 = sizeof(Setobj2)/ sizeof(int);

 Set SetA(Setobj1, len1);
 Set SetB(Setobj2, len2);
 cout << "The Set A is :" << endl;
 SetA.disp();
 cout << "The Set B is :" << endl;
 SetB.disp();
 cout<< endl;
 Set SetAplusB;
 SetAplusB = (SetA + SetB);
 cout << "The Set A plus Set B is : " << endl;
 SetAplusB.disp();
 cout <<endl;
 Set SetCut;
 SetCut = (SetA - SetB);
 cout << "The Set A Cut Set B is : " << endl;
 SetCut.disp();
 cout << endl;
 Set SetCross;
 SetCross = (SetA * SetB);
 cout << "The Set A Cross Set B is : " << endl;
 SetCross.disp();
 cout << endl;

 int key;
 cout << "Input the key to serch " << endl;
 cin>>key;
 if(SetAplusB.find(key))
 {
  cout << "Success !!" << endl;
 }
 else
 {
  cout << "No found!!" << endl;
 }
 
 return 0;
}
/*
The Set A is :
1,  3,  4,  5,  6,  7,
The Set B is :
2,  4,  5,  8,  9,  0,

The Set A plus Set B is :
0,  1,  2,  3,  4,  5,  6,  7,  8,  9,

The Set A Cut Set B is :
0,  1,  2,  3,  6,  7,  8,  9,

The Set A Cross Set B is :
4,  5,

Input the key to serch
4
Success !!
请按任意键继续. . .
*/

你可能感兴趣的:(C++写的集合的交叉并)