#include <iostream>
using namespace std;
// enum bool {false,true};
struct element { //定义链表中的结点结构
int val;
element *next;
};
class list { //定义链表类
protected:element *elems;
public:
list() { elems = 0; }
~list();
virtual bool insert(int); //此虚函数在派生类中可重新定义
virtual bool deletes(int); //此虚函数在派生类中可重新定义
bool contain(int);
void print();
};
class set :public list { //将集合类 set 定义为链表类 list 的派生类
int Card;
public:
set() { Card = 0; }
bool insert(int); //重定义此函数
bool deletes(int); //重定义此函数
bool add(set*, set*);
bool and1(set*, set*);
bool minute(set*, set*);
friend set operator +(set&, set&);
friend set operator -(set&, set&);
friend set operator *(set&, set&);
};
list::~list() //list 类得析构函数定义,循环释放各元素所占的存储
{
element *tmp = elems;
for (element *elem = elems; elem != 0;)
{
tmp = elem;
elem = elem->next;
delete tmp;
}
}
bool list::insert(int val) //定义 list 类中插入元素的成员函数
{
element *elem = new element; //为新元素分配存储
if (elem != 0) {
elem->val = val; //将新元素插入到链表头
elem->next = elems;
elems = elem;
return true;
}
else return false;
}
bool list::deletes(int val) //定义 list 类中删除元素的成员函数
{
if (elems == 0) return false; //若表为空,返回 false
element *tmp = elems;
if (elems->val == val)
{ //若待删除的元素为表头元素
elems = elems->next;
delete tmp;
return true;
}
else
for (element *elem = elems; elem->next != 0; elem = elem->next)
if (elem->next->val == val)
{ //循环查找待删除元素
tmp = elem->next;
elem->next = tmp->next;
delete tmp;
return true;
}
return false;
}
bool list::contain(int val)
{ //判元素 val 在链表中是否存在,存在返回true,不存在返回false
if (elems == 0)return false;
if (elems->val == val) return true;
else
for (element *elem = elems; elem->next != 0; elem = elem->next)
if (elem->next->val == val)
return true;
return false;
}
void list::print() //输出链表中各元素
{
if (elems == 0) return;
for (element *elem = elems; elem != 0; elem = elem->next)
cout << elem->val << " ";
cout << endl;
}
bool set::insert(int val) //在 set 类中的 insert 的重定义版本
{
if (!contain(val))
{ //先判断此元素是否存在,然后再调用基类的此函数版本
++Card;
list::insert(val);
return true;
}
return false;
}
bool set::deletes(int val) //在 set 类中的 deletes 的重定义版本
{
if (list::deletes(val)) //调用基类中的此函数版本
{
return true;
}
return false;
}
bool set::add(set* s1,set* s2)
{
for (element* elem=s1->elems;elem!=NULL;elem=elem->next)
{
insert(elem->val);
}
for (element* elem = s2->elems; elem != NULL; elem = elem->next)
{
insert(elem->val);
}
return true;
}
bool set:: and1(set* s1,set* s2)
{
for (element* elem=s1->elems;elem!=NULL;elem=elem->next)
{
if (s2->contain(elem->val))
{
insert(elem->val);
}
}
return true;
}
bool set::minute(set* s1,set* s2)
{
for (element* elem = s1->elems; elem!= NULL; elem = elem->next)
{
if (!s2->contain(elem->val))
{
insert(elem->val);
}
}
return true;
}
set operator +(set& s1, set& s2)
{
set s;
for (element* elem = s1.elems; elem != NULL; elem = elem->next)
{
s.insert(elem->val);
}
for (element* elem = s2.elems; elem != NULL; elem = elem->next)
{
s.insert(elem->val);
}
return s;
}
set operator -(set& s1, set& s2)
{
set s;
set* set1 = &s1;
set* set2 = &s2;
for (element* elem = set1->elems; elem != NULL; elem = elem->next)
{
if (!set2->contain(elem->val))
{
s.insert(elem->val);
}
}
return s;
}
set operator *(set& s1, set& s2)
{
set s;
for (element* elem = s1.elems; elem != NULL; elem = elem->next)
{
if (s2.contain(elem->val))
{
s.insert(elem->val);
}
}
return s;
}
int main()
{
set *ptr, set1,set2;
ptr = &set1;
ptr->insert(15);
ptr->insert(16);
ptr->insert(17);
ptr->insert(18);
ptr->print();
ptr = &set2;
ptr->insert(20);
ptr->insert(19);
ptr->insert(17);
ptr->insert(18);
ptr->print();
set set3, set4, set5;
ptr = &set3;
set3 = (set1 + set2);
//set4 = set1 - set2;
//set5 = set1 * set2;
ptr->print();
ptr->print();
ptr->print();
return 1;
}