#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
Node() : data(0), next(NULL) {}
Node(int x) : data(x), next(NULL) {}
};
class LinkList_set
{
private:
Node* first;
int len;
public:
LinkList_set(){first=NULL;len=0;}
void create_set();
bool contains(int x);
bool pankong();
LinkList_set union_set(LinkList_set &L1,LinkList_set &L2);//并集
LinkList_set intersection_set(LinkList_set &L1,LinkList_set &L2);// 交集
LinkList_set difference_set(LinkList_set &L1,LinkList_set &L2);// 差集
void isSubset_set(LinkList_set &L1,LinkList_set &L2);// 判断是否是子集
void display();
void sort_set();
void insert_set(int a);
};
//查重操作:
bool LinkList_set::contains(int x)
{
Node* pre=first->next;
while(pre!=NULL)
{
if(pre->data==x)
{
return true;
}
pre=pre->next;
}
return false;
}
//判空
bool LinkList_set::pankong()
{
if (len == 0) return true;
return false;
}
void LinkList_set::create_set()
{
first=new Node();
first->next=NULL;
int ans;
Node*cur=first;
cin>>ans;
while(ans!=0)
{
if(contains(ans))
{
cin>>ans;
continue;
}
Node* pi=new Node(ans);
pi->next=NULL;
cur->next=pi;
cur=pi;
len++;
cin>>ans;
}
}
void LinkList_set::display()
{
if (pankong()){cout<<"空"<<endl; return;}
sort_set();
Node* temp=first->next;
while(temp!=NULL)
{
cout<<temp->data<<" ";
temp=temp->next;
}
cout<<endl;
}
//排序
void LinkList_set::sort_set()
{
Node* dummy = new Node;
Node* head=first;
while (head != NULL) {
Node*node = dummy;
while (node->next != NULL && node->next->data < head->data) {
node = node->next;
}
Node* temp2 = head->next;
head->next = node->next;
node->next = head;
head = temp2;
}
}
//插入
void LinkList_set::insert_set(int a)
{
if (pankong()) {
first = new Node();
first->next = NULL;
Node* p = new Node();
p->data = a;
p->next = NULL;
first->next = p;
len++;
}
else {
if (contains(a)==false)
{
Node* p = new Node();
p->data = a;
p->next = NULL;
p->next = first->next;
first->next = p;
len++;
}
}
}
//并集
LinkList_set LinkList_set::union_set(LinkList_set &L1,LinkList_set &L2)
{
LinkList_set result;
Node*n=L2.first->next;
while(n!=NULL)
{
result.insert_set(n->data);
n=n->next;
}
Node*pre2=L1.first->next;
while(pre2!=NULL)
{
result.insert_set(pre2->data);
pre2=pre2->next;
result.len++;
}
return result;
}
// 交集
LinkList_set LinkList_set::intersection_set(LinkList_set &L1,LinkList_set &L2)
{
LinkList_set result;
Node *cur2 = L1.first->next;
while (cur2!= NULL)
{
if (L2.contains(cur2->data))
{
result.insert_set(cur2->data);
result.len++;
}
cur2 = cur2->next;
}
return result;
}
// 差集
LinkList_set LinkList_set::difference_set(LinkList_set &L1,LinkList_set &L2)
{
LinkList_set result;
Node *cur3 = L1.first->next;
while (cur3!= NULL)
{
if (!L2.contains(cur3->data))
{
result.insert_set(cur3->data);
result.len++;
}
cur3 = cur3->next;
}
return result;
}
// 判断是否是子集
void LinkList_set::isSubset_set(LinkList_set &L1,LinkList_set &L2)
{
Node *a = L1.first->next;
Node *b = L2.first->next;
int flag=0;
if(L1.len>=L2.len)
{
while (b!= NULL)
{
if (!L1.contains(b->data))
{
cout<<"不是子集"<<endl;
flag=1;
break;
}
b=b->next;
}
if(flag==0){
cout<<"L2是L1的子集"<<endl;
}
}
else
{
while (a!= NULL)
{
if (!L2.contains(a->data))
{
cout<<"不是子集"<<endl;
flag=1;
break;
}
a=a->next;
}
if(flag==0){
cout<<"L1是L2的子集"<<endl;
}
}
}
int main()
{
LinkList_set a,b,c,d;
cout << "请输入集合L1元素:" << endl;
a.create_set();
cout << "请输入集合L2元素:" << endl;
b.create_set();
cout << "L1集合元素为:";
a.display();
cout << "L2集合元素为:";
b.display();
c = c.union_set(a,b);
cout << "并集为:";
c.display();
d= d.intersection_set(a,b);
cout << "交集为:";
d.display();
cout << "(L1-L2)差集为:";
d= d.difference_set(a,b);
d.display();
cout << "(L2-L1)差集为:";
d= d.difference_set(b,a);
d.display();
cout << "判断子集:";
c.isSubset_set(a,b);
}
请注意!输入为0并回车视为结束输入!!!