7-3 集合的运算-并、交、对称差

news2024/11/23 2:52:08

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e1985d34e5ea45a5ae6c0bfd3c85c227.png

顺序表:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int *p=new int[n];
    for(int i=0;i<n;i++)
        cin>>p[i];
    int m;
    cin>>m;
    int *q=new int [m];
    for(int j=0;j<m;j++)
        cin>>q[j];
    int *bing=new int[n+m];
    int *jiao = new int [n+m];
    int *cha = new int [n+m];
    for(int i=0;i<n;i++)
    {
        bing[i]=p[i];
    }
    int cnt_bing=n,cnt_jiao=0,cnt_cha=0;  //记录并集,交集,差集的个数
    for(int j=0;j<m;j++)
    {
        bool b_bing=1;			//判断是否要往并集添加元素
        for(int i=0;i<n;i++)
        {
            if(p[i]==q[j])
            {
                b_bing=0;
                jiao[cnt_jiao++]=p[i];
                break;
            }
        }
        if(b_bing)
        {
            bing[cnt_bing++]=q[j];
        }
    }
    for(int ii=0;ii<n;ii++)			//从集合1中删去交集
    {
        bool b_cha=1;
        for(int jj=0;jj<cnt_jiao;jj++)
        {
            if(p[ii]==jiao[jj])
            {
                b_cha=0;
                break;
            }
        }
        if(b_cha)
        {
            cha[cnt_cha++]=p[ii];
        }
    }
    for(int ii=0;ii<m;ii++)		//从集合2中删去交集
    {
        bool b_cha=1;
        for(int jj=0;jj<cnt_jiao;jj++)
        {
            if(q[ii]==jiao[jj])
            {
                b_cha=0;
                break;
            }
        }
        if(b_cha)
        {
            cha[cnt_cha++]=q[ii];
        }
    }
    for(int i=0;i<cnt_bing;i++)
    {
        cout<<bing[i]<<" ";
    }
    if(cnt_bing==0)cout<<"NULL";
    cout<<"\n";
    for(int i=0;i<cnt_jiao;i++)
    {
        cout<<jiao[i]<<" ";
    }
    if(cnt_jiao==0)cout<<"NULL";
    cout<<"\n";
    for(int i=0;i<cnt_cha;i++)
    {
        cout<<cha[i]<<" ";
    }
    if(cnt_cha==0)cout<<"NULL";



    return 0;
}

队列

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n;
    int *p=new int [n];
    for(int i=0;i<n;i++)
    {
        cin>>p[i];
    }
    cin>>m;
    int *q=new int [m];
    for(int i=0;i<m;i++)
    {
        cin>>q[i];
    }
    int *bing=new int[n+m];
    int *jiao = new int [n+m];
    int *cha = new int [n+m];
    int h_bing=0,t_bing=-1,h_jiao=0,t_jiao=-1,h_cha=0,t_cha=-1;	//并集,交集,差集的头指针与尾指针
    for(int i=0;i<n;i++)
    {
        t_bing++;
        bing[t_bing]=p[i];
    }
    for(int j=0;j<m;j++)
    {
        bool b_bing=1;
        for(int i=0;i<n;i++)
        {
            if(p[i]==q[j])
            {
                b_bing=0;
                t_jiao++;
                jiao[t_jiao]=p[i];
                break;
            }
        }
        if(b_bing)
        {
            t_bing++;
            bing[t_bing]=q[j];
        }
    }
    for(int i=0;i<n;i++)
    {
        bool b_cha=1;
        h_jiao=0;
        while (h_jiao<=t_jiao)
        {
            if(p[i]==jiao[h_jiao])
            {
                b_cha=0;
                break;
            }
            h_jiao++;		//弹出交集的头元素
        }
        if(b_cha)
        {
            t_cha++;
            cha[t_cha]=p[i];
        }
    }
    for(int i=0;i<m;i++)
    {
        bool b_cha=1;
        h_jiao=0;
        while (h_jiao<=t_jiao)
        {
            if(q[i]==jiao[h_jiao])
            {
                b_cha=0;
                break;
            }
            h_jiao++;		//弹出交集的头元素
        }
        if(b_cha)
        {
            t_cha++;
            cha[t_cha]=q[i];
        }
    }
    h_jiao=0;  //让交集的头指针重新回到0
    while (h_bing<=t_bing)
    {
        cout<<bing[h_bing]<<" ";
        h_bing++;
    }
    if(t_bing==-1)cout<<"NULL";
    cout<<"\n";
    while (h_jiao<=t_jiao)
    {
        cout<<jiao[h_jiao]<<" ";
        h_jiao++;
    }
    if(t_jiao==-1)cout<<"NULL";
    cout<<"\n";
    while (h_cha<=t_cha)
    {
        cout<<cha[h_cha]<<" ";
        h_cha++;
    }
    if(t_cha==-1)cout<<"NULL";
    return 0;
}

链表:

#include <bits/stdc++.h>
using namespace std;
struct node{
    int num;
    node *next;
};
int main()
{
    int n,m;
    cin>>n;
    node*head_1=new node,*head_2=new node,*temp,*tail;
    head_1->next= nullptr;  //置零
    head_2->next= nullptr;	//置零
    tail=head_1;			//让tail指向第一个集合的头
    for(int i=0;i<n;i++)
    {
        temp=new node;			//开辟新结点
        int num;
        cin>>num;
        temp->num=num;
        temp->next= nullptr;
        tail->next=temp;

        tail=tail->next;
    }
    cin>>m;
    tail=head_2;		//让tail指向第2个集合的头
    for(int i=0;i<m;i++)
    {
        temp=new node;		//开辟新结点
        int num;
        cin>>num;
        temp->num=num;
        temp->next= nullptr;
        tail->next=temp;
        tail=tail->next;
    }
    node*head_b=new node,*head_j=new node,*head_c=new node;
    head_b->next= nullptr;head_j->next= nullptr;head_c->next= nullptr;		//置零
    tail=head_b;			//现在让tail指向并集的头,要往并集添加元素
    temp=head_1;			//temp没有用了,所以让temp指向第一个集合的头
    for(int i=0;i<n;i++)
    {
        temp=temp->next;
        node *p=new node;
        p->num=temp->num;
        p->next= nullptr;
        tail->next=p;
        tail=tail->next;

    }
    //现在tail指针是并集的尾指针
    temp=head_2;  //temp指向第二个集合的头指针
    node*tail_j=head_j;     //创建新指针指向交集的头。
    for(int j=0;j<m;j++)
    {
        bool b_bing=1;
        node *p=head_1; //创建新指针指向第一个集合的头
        temp=temp->next;
        for(int i=0;i<n;i++)
        {
            p=p->next;
            if(temp->num==p->num)
            {
                b_bing=0;
                node *p_new=new node;   //开辟新结点
                p_new->num=temp->num;
                p_new->next= nullptr;
                tail_j->next=p_new;    //连接到交集
                tail_j=tail_j->next;
                break;
            }
        }
        if(b_bing)
        {
            node *p_new=new node;  //开辟新结点
            p_new->num=temp->num;
            p_new->next=nullptr;
            tail->next=p_new;           //让并集连接上新的数
            tail=tail->next;
        }
    }
    node *tail_c=head_c;    //创建新指针指向差集的头。
    temp=head_1;        //让temp现在指向第一个集合的头。
    for(int i=0;i<n;i++)
    {
        bool b_cha=1;
        temp=temp->next;
        node *temp_j=head_j->next; //创建新指针指向交集的第一个数据。
        while (temp_j!= nullptr)
        {
            if(temp->num==temp_j->num)
            {
                b_cha=0;
                break;
            }
            temp_j=temp_j->next;
        }
        if(b_cha)
        {
            node *p_new=new node;
            p_new->num=temp->num;
            p_new->next= nullptr;
            tail_c->next=p_new;
            tail_c=tail_c->next;
        }
    }
    temp=head_2;        //让temp现在指向第2个集合的头。
    for(int i=0;i<m;i++)
    {
        bool b_cha=1;
        temp=temp->next;
        node *temp_j=head_j->next; //创建新指针指向交集的第一个数据。
        while (temp_j!= nullptr)
        {
            if(temp->num==temp_j->num)
            {
                b_cha=0;
                break;
            }
            temp_j=temp_j->next;
        }
        if(b_cha)
        {
            node *p_new=new node;
            p_new->num=temp->num;
            p_new->next= nullptr;
            tail_c->next=p_new;
            tail_c=tail_c->next;
        }
    }

    temp=head_b->next;  //现在让temp指向并集的第一个数据集
    while (temp!= nullptr)
    {
        cout<<temp->num<<" ";
        temp=temp->next;
    }
    if(head_b->next== nullptr)cout<<"NULL"; //如果并集为空
    cout<<"\n";

    temp=head_j->next;  //现在让temp指向交集的第一个数据集
    while (temp!= nullptr)
    {
        cout<<temp->num<<" ";
        temp=temp->next;
    }
    if(head_j->next== nullptr)cout<<"NULL"; //如果交集为空
    cout<<"\n";

    temp=head_c->next;  //现在让temp指向差集的第一个数据集
    while (temp!= nullptr)
    {
        cout<<temp->num<<" ";
        temp=temp->next;
    }
    if(head_c->next== nullptr)cout<<"NULL"; //如果交集为空
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2185499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

Elasticsearch基础_5.ES聚合功能

文章目录 一、数据聚合1.1、桶聚合1.1.1、单维度桶聚合1.1.2、聚合结果排序1.1.3、限定聚合范围 本文只记录ES聚合基本用法&#xff0c;后续有更复杂的需求可以查看相关书籍&#xff0c;如《Elasticsearch搜索引擎构建入门与实战》 一、数据聚合 聚合可以让我们极其方便的实现…

进程和线程之间的通用方式

进程之间的通信方式有哪些 进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指不同进程之间传递信息和数据的机制。由于进程之间的内存空间是相互独立的&#xff0c;因此必须使用特定的通信方式来实现数据共享。 以下是常见的进程间通信方式&#xff1…

【前端开发入门】css快速入门

目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…

【韩顺平Java笔记】第6章:数组、排序和查找

文章目录 153. 回顾上节课内容154. 听懂和会做155. 数组的必要性156. 数组快速入门157. 数组使用1158. 数组使用2160. 数组使用3161. 数组注意事项161. 数组练习1162. 数组练习2163. 数组赋值机制1164. 数组赋值机制2165. 数组拷贝166. 数组翻转1168. 169. 数组扩容1,2170. 数组…

解决银河麒麟服务器操作系统中`/etc/bashrc`环境变量不生效的问题

解决银河麒麟服务器操作系统中/etc/bashrc环境变量不生效的问题 1、问题描述2、问题原因3、解决方法 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在银河麒麟服务器操作系统中&#xff0c;有时你可能会遇到在/etc/bashrc文件中配置的环境…

VMware 设置静态IP

环境 os: centos 7vmware: 16.2.0 build-18760230 设置静态IP 不知道桥接模式和nat模式抽什么疯&#xff0c;忽然用不了了&#xff0c;虚拟机开机之后&#xff0c;本地ssh连接不上&#xff0c;ping 了一下&#xff0c;本机ping不通虚拟机。干脆参考网上的方法&#xff0c;直…

【网络安全 | Java代码审计】某Blog系统

未经许可,不得转载。 文章目录 公告处XSS评论处XSS添加友链处XSS文件上传处XSS公告处XSS 编辑公告处后端代码: 跟进updateNotice()方法: 继续跟进: 公告内容直接插入数据库,看看前端从数据库获取数据时有没有对数据做处理: noticeService 是一个服务层组件,负责业务逻辑…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL74

异步复位同步释放 描述 题目描述&#xff1a; 请使用异步复位同步释放来将输入数据a存储到寄存器中&#xff0c;并画图说明异步复位同步释放的机制原理 信号示意图&#xff1a; clk为时钟 rst_n为低电平复位 d信号输入 dout信号输出 波形示意图&#xff1a; 输入描…

在线翻译界的4大宝藏,一站式解决语言难题!

现在全球化越来越厉害&#xff0c;语言根本就不是啥沟通的阻碍了。不管是搞学术研究、商务交流&#xff0c;还是平常学习&#xff0c;翻译工具都成了咱少不了的帮手。今天呢&#xff0c;我给大家推荐四款在 2024 年特别受推崇的邮件翻译神器&#xff0c;像百度在线翻译啥的。这…

Suricata:开源网络分析和威胁检测

Suricata 是一款高性能、开源网络分析和威胁检测软件&#xff0c;被大多数私人和公共组织使用&#xff0c;并被主要供应商嵌入以保护他们的资产。 Suricata 功能 Suricata 提供全面的网络安全监控 (NSM) 功能&#xff0c;包括记录 HTTP 请求、捕获和存储 TLS 证书以及从网络流…

带你深入浅出设计模式:一、单例模式,正确理解懒汉式和饿汉式

此为设计模式第一谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;对于单例模式&#xff0c;在开发中通常用于设计配置信息类、数据库…

A/D转换器的基本概念(分辨率+转换时间+采样定律+量化误差)+A/D转换方法(Flash(同步)型A/D转换器+计数型转换器)

2024-10-02&#xff0c;星期三&#xff0c;21:41&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。Hello&#xff0c;大家好啊&#xff0c;真的是好久没见了&#xff0c;上次更新还是在九月份&#xff0c;九月的最后一周出了一周的差&#xff0c;然后继续上了两…

代码随想录训练营Day19 | 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点

Leetcode 235. 二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且…

【Nacos入门到实战三】安装Nacos Server:从零开始搭建配置中心

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

vue3项目如何添加属于自己的 live2d 看板娘 (支持换模型)

一、效果如下&#xff0c;想要更加效果前往我的博客 snows_ls BLOGhttp://124.223.41.220/ 资源我放这个仓库咯&#xff0c; 直接拉取即可 snows_l/live2d-sourcehttps://gitee.com/snows_l/live2d-source 二、引入&#xff08;看板娘出来了&#xff09; 直接在vue项目html中…

查找与排序-快速排序

排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排序算法有&#xff1a;插入排序、希尔排序、选择排序…

高效论文写作指南:那些你必须知道的工具与平台

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在完成论文写作过程中&#xff0c;有许多实用的工具和平台可以帮助提高效率、确保质量&#xff0c;并保持学术规范。以下是一些常用的论文写作工具和平台&#xff1a; 1. 文献管理工具…

数据网格:数据去中心化的特征

在现代的数据管理架构理念中&#xff0c;常常会谈及数据网格&#xff0c;将它用来解决大规模、复杂数据环境下的数据管理和利用问题。本文将探讨数据网格的概念以及数据去中心化和数据网格的紧密联系。 一数据网格 数据网格定义&#xff1a;数据网格将数据视为一种产品&#x…

中原台球展,2025郑州台球展会,中国台球产业链发展大会

阳春三月&#xff0c;万物复苏&#xff0c;商机无限&#xff1b;品牌宣传正当季&#xff0c;产品招商正当时&#xff0c;新品发布好时期。抓住台球发展的这波财富机遇&#xff0c;借助壹肆柒郑州台球展这个超级平台&#xff0c;将品牌和产品快速打造成为覆盖全国市场的顶流。20…