数据结构-单链表

// 【数据结构-单链表】用单链表实现集合的并运算和交运算.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦极必反

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值