定义一个集合类Set(一组无重复无序数据的集合),包含元素的输入、输出、插入、删除、查找等方法。
#include <iostream>
using namespace std;
const int MAX=1024;
class Set {
int size,i; //集合元素个数
int a[MAX]; //保存集合元素的数组
public:
void init(); //初始化集合
int find(int x); //搜索集合中是否存在元素x
void insert(int x); //往集合中插入元素x
void del(int x); //删除元素x
void display(); //显示集合所有元素
};
void Set::init()
{
cin>>size;//输入个数
for(i=0;i<size;i++)
cin>>a[i];
}
int Set::find(int x)
{
for(i=0;i<size;i++)
if(a[i]==x)
return i;
return -1;//不可加else,因为return -1应在循环结束后判断失败
}
void Set::insert(int x)
{
if(find(x)!=-1)//在原数组中找到该数
cout<<x<<"已插入"<<endl;
else if(size<MAX)
a[size++]=x;//个数增加
}
void Set::del(int x)
{
if(find(x)==-1)//在原数组中未找到该数
cout<<x<<"未插入"<<endl;
else
for(int i=find(x);i<size-1;i++)
a[i]=a[i+1];//数组前移
a[size-1]=0;//末尾补0,可去掉
size--;//个数减少
}
void Set::display()
{
cout<<"set={";
for(int i=0;i<size-1;i++)
cout<<a[i]<<",";
cout<<a[size-1]<<"}"<<endl;
}
int main()
{
Set myset;
cout<<"1111111111111111111111111111"<<endl;
myset.init();
myset.insert(6);myset.insert(2);myset.insert(3);myset.insert(9);myset.insert(4);
myset.display();
cout<<"2222222222222222222222222222"<<endl;
myset.del(3);
myset.display();
myset.del(6);
myset.display();
return 0;
}
在此基础上,请扩展相关功能:(1)通过构造函数实现对集合对象的初始化(2)增加集合的交、并、差等功能实现。集合是通常数学意义下的集合,即元素无序且无重复。
#include <iostream>
using namespace std;
const int MAX=1024;
class Set {
int size,i; //集合元素个数
int m[MAX]; //保存集合元素的数组
public:
Set(int a); //初始化集合
int find(int x); //搜索集合中是否存在元素x
void insert(int x); //往集合中插入元素x
void del(int x); //删除元素x
void display(); //显示集合所有元素
Set inter(Set & x);
Set uni(Set & x);
Set diff(Set & x);
};
Set::Set(int a=0)//带默认值的构造函数
{
size=a;
for(i=0;i<size;i++)
m[i]=i;
}
int Set::find(int x)
{
for(i=0;i<size;i++)
if(m[i]==x)
return i;
return -1;//不可加else,因为return -1应在循环结束后判断失败
}
void Set::insert(int x)
{
if(find(x)!=-1)//在原数组中找到该数
cout<<x<<"已插入"<<endl;
else if(size<MAX)
m[size++]=x;//个数增加
}
void Set::del(int x)
{
if(find(x)==-1)//在原数组中未找到该数
cout<<x<<"未插入"<<endl;
else
for(int i=find(x);i<size-1;i++)
m[i]=m[i+1];//数组前移
m[size-1]=0;//末尾补0,可去掉
size--;//个数减少
}
Set Set::inter(Set & x)//x是myset2的引用 ,相当于(Set *this,Set &x)
{
Set t;
for(int i=0;i<size;i++)//相当于i<this->size
if(x.find(m[i])!=-1)//在myset1和myset2中都存在 ,相当于x.find(this->m[i])
t.insert(m[i]);
return t;
}
Set Set::uni(Set & x)
{
Set t=x;//加入myset2中的数组
for(int i=0;i<size;i++)
if(t.find(m[i])==-1)//myset1中独有的数
t.insert(m[i]);
return t;
}
Set Set::diff(Set & x)
{
Set t;
for(int i=0;i<size;i++)
if(x.find(m[i])==-1)//myset1中独有而myset2中没有
t.insert(m[i]);
return t;
}
void Set::display()
{
cout<<"set={";
for(int i=0;i<size-1;i++)
cout<<m[i]<<",";
cout<<m[size-1]<<"}"<<endl;
}
int main()
{
Set myset(4),myset2(4),myset3;//myset3用默认值0
cout<<"插入:"<<endl;
myset.insert(12);myset.insert(5);myset.insert(9);
myset.insert(7);myset.insert(14);
myset2.insert(6);myset2.insert(7);myset2.insert(23);
myset2.insert(11);myset2.insert(8);
myset.display();
myset2.display();
cout<<"交集:"<<endl;
myset3=myset.inter(myset2);
myset3.display();
cout<<"并集"<<endl;
myset3=myset.uni(myset2);
myset3.display();
cout<<"差集"<<endl;
myset3=myset.diff(myset2);
myset3.display();
return 0;
}
集合类的实现,要求保存集合元素的数据成员不采用数组类型而是指针类型,包含元素的输入、输出、插入、删除、查找等方法
#include <iostream>
#include <string>
using namespace std;
class Set {
int size;
int * m;
int find(int x);
public:
Set();
Set(int n);
Set(const Set & x);//拷贝构造函数
~Set(); //析构函数
void insert(int x);
void del(int x);
void display();
};
Set::Set()//无参构造函数
{
size=0;
m=0;
}
Set::Set(int n)
{
size=n;
m=new int[size];//为m数组分配空间
for(int i=0;i<size;i++)
m[i]=100+i;
}
Set::Set(const Set & x)//深拷贝
{
size=x.size;
//或者可加上m=x.m;
m=new int[size];
for(int i=0;i<size;i++)
m[i]=x.m[i];
}
Set::~Set()
{
cout<<this->size<<"构造函数"<<endl;
if(m!=0)
delete[] m;
m=0;
}
int Set::find(int x)
{
for(int i=0;i<size;i++)
if(m[i]==x)
return i;
return -1;
}
void Set::insert(int x)
{
if(find(x)!=-1)
{
cout<<x<<"已插入"<<endl;
return;
}
else
{
int * t=new int[size+1];
memcpy(t,m,(size)*sizeof(int));
t[size++]=x;
delete [] m;
m=new int[size];
memcpy(m,t,(size)*sizeof(int));
delete [] t;
//或者直接写m=t;
}
}
void Set::del(int x)
{
int y=find(x);
if(y==-1)
{
cout<<x<<"未插入"<<endl;
return;
}
else
{
int * t=new int[size-1];
memcpy(t,m,y*sizeof(int));
for(int i=y;i<size-1;i++)
t[i]=m[i+1];
size--;
delete [] m;
m=new int[size];
memcpy(m,t,(size)*sizeof(int));
delete [] t;
或者直接写m=t;
}
}
void Set::display()
{
cout<<"set={";
for(int i=0;i<size-1;i++)cout<<m[i]<<",";
cout<<m[size-1]<<"}"<<endl;
}
int main()
{
Set myset,myset2(2);
cout<<"插入:"<<endl;
myset.insert(2);myset.insert(5);myset.insert(3);myset.insert(1);myset.insert(4);
myset.display();
cout<<"删除:"<<endl;
myset.del(3);
myset.display();
myset.del(6);
cout<<"显示myset2:"<<endl;
myset2.display();
cout<<"显示myset3:"<<endl;
Set myset3=myset;//复制
//myset3=myset;//赋值
myset3.display();
return 0;
}
赋值时可以删掉析构函数和复制构造函数,但复制时必须加上,为深拷贝。
添加交、并、差集:
#include <iostream>
#include <string>
using namespace std;
class Set {
int size;
int * m;
int find(int x);
public:
Set();
Set(int n);
Set(const Set & x);//拷贝构造函数
~Set(); //析构函数
Set operator=(const Set & x);//赋值运算符重载函数
void insert(int x);
void del(int x);
void display();
Set inter(Set & x);
Set uni(Set & x);
Set diff(Set & x);
};
Set::Set()//无参构造函数
{
size=0;
m=0;
}
Set::Set(int n)
{
size=n;
m=new int[size];//为m数组分配空间
for(int i=0;i<size;i++)
m[i]=100+i;
}
Set::Set(const Set & x)//深拷贝
{
size=x.size;
//或者可加上m=x.m;
m=new int[size];
for(int i=0;i<size;i++)
m[i]=x.m[i];
}
Set::~Set()
{
cout<<this->size<<"构造函数"<<endl;
if(m!=0)
delete[] m;
m=0;
}
Set Set::operator=(const Set & x)
{
size=x.size;
m=new int[size];
for(int i=0;i<size;i++)
m[i]=x.m[i];
return *this;
}
int Set::find(int x)
{
for(int i=0;i<size;i++)
if(m[i]==x)
return i;
return -1;
}
void Set::insert(int x)
{
if(find(x)!=-1)
{
cout<<x<<"已插入"<<endl;
return;
}
else
{
int * t=new int[size+1];
memcpy(t,m,(size)*sizeof(int));
t[size++]=x;
delete [] m;
m=new int[size];
memcpy(m,t,(size)*sizeof(int));
delete [] t;
//或者直接写m=t;
}
}
void Set::del(int x)
{
int y=find(x);
if(y==-1)
{
cout<<x<<"未插入"<<endl;
return;
}
else
{
int * t=new int[size-1];
memcpy(t,m,y*sizeof(int));
for(int i=y;i<size-1;i++)
t[i]=m[i+1];
size--;
delete [] m;
m=new int[size];
memcpy(m,t,(size)*sizeof(int));
delete [] t;
//或者直接写m=t;
}
}
Set Set::inter(Set & x)//x是myset2的引用 ,相当于(Set *this,Set &x)
{
Set t;
for(int i=0;i<size;i++)//相当于i<this->size
if(x.find(m[i])!=-1)//在myset1和myset2中都存在 ,相当于x.find(this->m[i])
t.insert(m[i]);
return t;
}
Set Set::uni(Set & x)
{
Set t=x;//加入myset2中的数组
for(int i=0;i<size;i++)
if(t.find(m[i])==-1)//myset1中独有的数
t.insert(m[i]);
return t;
}
Set Set::diff(Set & x)
{
Set t;
for(int i=0;i<size;i++)
if(x.find(m[i])==-1)//myset1中独有而myset2中没有
t.insert(m[i]);
return t;
}
void Set::display()
{
cout<<"set={";
for(int i=0;i<size-1;i++)cout<<m[i]<<",";
cout<<m[size-1]<<"}"<<endl;
}
int main()
{
Set myset,myset2(2),myset3;
cout<<"插入:"<<endl;
myset.insert(2);myset.insert(5);myset.insert(3);myset.insert(1);
myset2.insert(3);
myset.display();
myset2.display();
cout<<"交集:"<<endl;
myset3=myset.inter(myset2); //赋值给myset3,需要深拷贝,=运算符需要创造
myset3.display();
cout<<"并集"<<endl;
myset3=myset.uni(myset2);
myset3.display();
cout<<"差集"<<endl;
myset3=myset.diff(myset2);
myset3.display();
return 0;
}