输入包含两行。
第一行表示集合A,该行的第一个数n是集合A的大小,随后有n个空格分开的整数,均为集合A的元素。
第二行表示集合B,该行的第一个数m是集合B的大小,随后有m个空格分开的整数,均为集合B的元素。
保证各个集合中不会有重复的元素。
输出集合A和集合B的交集中的所有元素,用空格分开,元素输出的次序按在集合A中出现的次序。
如果交集为空,输出一空行。
输入:
3 100 200 300 4 400 300 210 100
输出:
100 300
#include <iostream>
#include <iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; // Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; // ElemType 为可定义的数据类型,此设为int类型
typedef struct LNode
{
ElemType data; // 结点的数据域
struct LNode *next; // 结点的指针域
} LNode, *LinkList; // LinkList为指向结构体LNode的指针类型
void CreateList_R(LinkList &L, int n) // 后插法创建单链表
{
LNode *tail = NULL, *p;
L = new LNode;
L->next = NULL;
tail = L; // 尾指针指向头结点
for (int i = 0; i < n; ++i)
{
p = new LNode; // 形成新结点
cin >> p->data;
p->next = NULL;
tail->next = p; // 新结点插入尾结点后
tail = p; // tail指向新的尾结点p
}
}
int ListLength(LinkList L)
{
int count = 0;
LNode *p;
p = L->next;
while (p)
{
count++;
p = p->next;
}
return count;
}
Status ListDelete(LinkList &L, int i) // 算法2.10 单链表的删除
{
LNode *p, *q;
int j = 0;
p = L;
while (p->next && j < i - 1)
{
p = p->next;
++j;
} // 让p指向Ai-1位置
if (!(p->next) || j > i - 1)
return ERROR; // 非法
q = p->next;
p->next = q->next;
delete q;
return OK;
} // ListDelete
Status GetElem(LinkList L, int i, ElemType &e)
{
LNode *p;
p = L->next;
int count = 1;
while (count < i && p)
{
p = p->next;
++count; // 遍历至p为空或p指向第i个元素
}
if (!p || count > i)
return ERROR; // 第i个元素不存在
e = p->data;
return OK;
} // GetElem
int LocateElem(LinkList L, int e) // 略有改动 算法2.8 按值查找
{
LNode *p;
int count = 1;
p = L->next;
while (p && p->data != e)
{
count++;
p = p->next;
}
if (p)
return count;
else
return 0;
} // LocateElem
void MergeList(LinkList &LA, LinkList LB)
{ // 将所有在线性表LA中但不在LB中的数据元素删除
int m,n,e;
m = ListLength(LA);
n = ListLength(LB);
int i = 1;
while (m--)
{
GetElem(LA, i, e); // 取LA中第i个数据元素赋给e
if (!LocateElem(LB, e)) // LB中不存在和e相同的数据元素
ListDelete(LA, i); // 删除该元素
else i++;
}
}
void ListPrint(LinkList L)
{
LNode *p;
for (p = L->next; p; p = p->next)
cout << p->data << (p->next ? ' ' : '\n');
}
int main()
{
int m, n;
cin >> m;
LinkList LA, LB;
CreateList_R(LA, m);
cin >> n;
CreateList_R(LB, n);
MergeList(LA,LB);
ListPrint(LA);
return 0;
}