在链表类的基础上实现集合的交并运算(待优化)

废话不多说,直接上代码 

#include<iostream>
using namespace std;
//创建节点类
class Node
{
	int data;
	Node* next;
	//结点初始化
	Node(int num = 0)
	{
		next = NULL;
		data = num;
	}
	//将LinkList声明为Node的友元类
	friend class LinkList;
};
//链表类
class LinkList
{
	Node *head;
	int size;
public:
	LinkList();
	LinkList(const LinkList&);
	~LinkList();
	void insert(int);
	void show();
	LinkList getIntersection(const LinkList);
	LinkList getUnion(const LinkList);
};
//初始化链表
LinkList::LinkList()
{
	//初始化头结点
	head = new Node();
	//初始化链表大小
	size = 0;
}

LinkList::LinkList(const LinkList& link)
{
	this->head = new Node();
	Node *p = link.head->next;
	while (p)
	{
		this->insert(p->data);
		p = p->next;
	}
}
//销毁链表
LinkList::~LinkList()
{
	//释放头结点
	delete head;
	head = NULL;
	size = 0;
}
//插入头结点
void LinkList::insert(int number)
{
	Node *q, *p, *s;
	s = new Node(number);
	q = head, p = head->next;
	//查找要插入的位置
	for (; p; q = p, p = p->next)
	{
		//如果相同的就不用插入了
		if (p->data == number) break;
		//如果有比要插入数据大的,就插入
		if (p->data > number)
		{
			s->next = p;
			q->next = s;
			break;
		}
	}
	//当数据最大或者链表里没数据时,接在最后
	if (p == NULL)
	{
		q->next = s;
	}
	size++;
}
//链表的遍历
void LinkList::show()
{
	Node *p = head->next;
	while (p)
	{
		cout << p->data << ' ';
		p = p->next;
	}
	cout << endl;
}

LinkList LinkList::getIntersection(const LinkList List)
{
	LinkList tempList;
	Node *p = this->head->next, *q = List.head->next;
	while (p&&q)
	{
		if (p->data > q->data) q = q->next;
		else if (p->data < q->data) p = p->next;
		else
		{
			tempList.insert(p->data);
			p = p->next;
			q = q->next;
		}
	}
	return tempList;
}

LinkList LinkList::getUnion(const LinkList List)
{
	LinkList tempList;
	Node *p = this->head->next;
	while (p)
	{
		tempList.insert(p->data);
		p = p->next;
	}
	p = List.head->next;
	while (p)
	{
		tempList.insert(p->data);
		p = p->next;
	}
	return tempList;
}

int main()
{
	int number;
	//创建链表
	LinkList link1, link2;
	//循环输入数据
	cout << "输入集合一:" << endl;
	while (cin >> number)
	{
		//当为-1时停止
		if (number == -1) break;
		//不然就插入数据
		else link1.insert(number);
	}
	cout << "输入集合二:" << endl;
	while (cin >> number)
	{
		//当为-1时停止
		if (number == -1) break;
		//不然就插入数据
		else link2.insert(number);
	}
	LinkList UnionList = link1.getUnion(link2);
	LinkList InIntersectionList = link1.getIntersection(link2);
	cout << "并集:" << endl;
	UnionList.show();
	cout << "交集:" << endl;
	InIntersectionList.show();
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值