链表实现集合操作【C++完整代码】

#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并回车视为结束输入!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值