// 【数据结构-单链表】用单链表实现集合的并运算和交运算.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <bits/stdc++.>
using namespace std;
struct LinkNode { //链表结点类的定义
int data; //数据域
LinkNode *link; //链指针域
LinkNode()
{//默认构造函数
link = NULL;
data = 0;
}
LinkNode(int& item, LinkNode* ptr = NULL)
{//初始化数据与指针成员的含参构造函数
data = item;
link = ptr;
}
};
class List :public LinkNode{ //单链表类定义,不用继承也可以实现
public:
List() { first = new LinkNode; } //构造函数
void inputRear(int x);
void makeEmpty();
void output();
LinkNode *first;
};
void List::inputRear(int endTag) //后插法建立单链表
{//endTag时约定的输入序列结束的标志
LinkNode* newNode, * last;
int val;
makeEmpty();
cin >> val;
last = first;
while (val != endTag) { //last指向表尾
newNode = new LinkNode (val);
if (newNode == NULL) {
cerr << "存储分配错误!" << endl;
exit(1);
}
last->link = newNode;
last = newNode;
cin >> val; //插入到表末端
}
last->link = NULL; //表收尾,这句话实际可省略
}
void List::makeEmpty()
{//将链表置为空表
LinkNode* del;
while (first->link != NULL) {
del = first->link;
first->link = del->link;
delete del;
}
}
void Union(List LA, List LB, List& LC)
{//两个链表取并集的函数
int t = 0;
LinkNode* pa = LA.first->link;
LinkNode* pb = LB.first->link;
LinkNode* last;
LinkNode* pc=LC.first->link;
last = LC.first;
while (pa) { //先将LA链表中的数据赋值给LC
pc = new LinkNode(pa->data);
last->link = pc;
last = pc;
pa = pa->link;
}
while (pb) { //再遍历LB,若将不相等的数据插入到LC中
t = 0;
pc = LC.first->link;
while (pc) {
if (pb->data == pc->data) {
t = 1;
}
pc = pc->link;
}
if (t == 0) {
pc = new LinkNode(pb->data);
last->link = pc;
last = pc;
}
pb = pb->link;
}
}
void Intersection(List LA, List LB, List& LD)
{//两个链表取交集的函数
LinkNode* pa = LA.first->link;
LinkNode* pb = LB.first->link;
LinkNode* last;
LinkNode* pd = LD.first->link;
last = LD.first;
while (pa) {
pb = LB.first->link;
while (pb) {
if (pa->data == pb->data) { //遍历两个链表,将相等的数据插入到LD中
pd = new LinkNode(pa->data);
last->link = pd;
last = pd;
}
pb = pb->link;
}
pa = pa->link;
}
}
void List::output() // 以集合形式输出数据
{
LinkNode *p = first->link;
cout << "{ ";
while (p != NULL)
{
cout << p->data << " ";
p = p->link;
}
cout << "}" << endl;
}
int main()
{
List A, B, C, D;
A.inputRear(-1);
B.inputRear(-1);
Union(A, B, C); //集合并运算
C.output();
Intersection(A, B, D); //集合交运算
D.output();
return 0;
}