欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-08 19:26:27
...

废话不多说,直接上代码 

#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();
}

 

相关标签: