集合的交(线性表的应用)

输入包含两行。
第一行表示集合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;
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值