在链表类的基础上实现集合的交并运算(待优化)
程序员文章站
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();
}