数据结构-用单链表实现集合的并运算和交运算

2023-11-13

【问题描述】

有A,B两个集合,分别用两个单链表存放,假设集合中无重复的元素,要求编写两个独立的函数分别实现集合的并运算和交运算,运算结果存放在第3个链表中(运算不能改变原来的A, B链表),假设单链表中的元素值均为正整数,建立链表时,输入-1时停止创建新结点,可以采用前插或后插的形式建立链表。注意,输出函数和main函数在HINT中给出,并运算和交运算的函数原型如下:

void Union(List<T> LA, List<T>LB, List<T>&LC)       //集合并运算

void Intersection(List<T> LA, List<T>LB, List<T>&LC)   //集合交运算

【输入形式】第一行输入集合A的元素,即若干个正整数(无重复数据),各个整数之间用空格分开,最后输入-1;第二行输入集合B的元素。

【输出形式】第一行输出两个集合并运算的结果,第二行输出两个集合交运算的结果。

【样例输入】

1 3 5 7-1

2 3 4 6 -1

【样例输出】

{ 1 3 5 7 2 4 6 }

{ 3 }

//Drink
#include<iostream>
using namespace std;
template<class T>
struct LinkNode
{
	T data;				//数据域 
	LinkNode<T> *link;	//指针域 
	LinkNode(LinkNode<T> *ptr=NULL)
	{
		link = ptr;		//仅初始化指针成员的构造函数	
	}
	LinkNode(const T &item,LinkNode<T> *ptr=NULL)
	{
		link = ptr;		//初始化指针成员和数据的构造函数 
		data = item;
	}
}; 
template<class T>
class List
{
	protected: LinkNode<T> *first;			
	
	public: 
		List(){first = new LinkNode<T>;};	//构造函数创建空的单链表,并创建first 
		void inputRear(T endTag);			//endTag为结束标志 
		void output();                      //输出链表
		bool findX(T x);                    //在链表中找到x
		void insert(T &x);                  //在链表尾部插入数值为x的结点
		LinkNode<T>* getfirst()             //从类外获取头指针,(返回值需要加*)
		{	
			return first;
		};
};
template<class T>
void List<T>::inputRear(T endTag)//输入链表中的值
{	
	
	LinkNode<T> *newNode;
	LinkNode<T> *last;
	T val;
	cin>>val;
	last = first;	
	while(val != endTag)
	{
	
		newNode = new LinkNode<T>(val); 
		
	
		last->link = newNode;	//将新结点连接到表尾 

		last = newNode;			//新链表表尾变为地址变为newNode
		cin>>val;				//输入下一个结点得值 
	
	}
	last->link=NULL; 
}
template<class T>
bool List<T>::findX(T x)        //在链表中找到x
{
	LinkNode<T>* current=first->link;
	while(current!=NULL)
	{
		if(current->data==x)
		return 1;	
		current=current->link;
	}	
	return 0;
} 

template<class T>
void List<T>::insert(T &x)      //在链表最后插入一个结点 
{
	LinkNode<T> *newNode,*last;
	newNode = new LinkNode<T> (x);
	last = first;
	
	while(last->link!=NULL)     //通过循环将last指针指到表尾
	last=last->link;
	
	last->link=newNode;
	last=newNode;
}
//----------------------------------------------------------
template<class T>
void Union(List<T> LA, List<T> LB, List<T> &LC)//求并集
{
	LinkNode<T> *a,*b;
	a=LA.getfirst();
	b=LB.getfirst();
	a=a->link;
	b=b->link;
	while(a!=NULL)
	{
		LC.insert(a->data);			//先将链表acopy到c中 
		a=a->link;
	}
	while(b!=NULL)					
	{			
		if(!LC.findX(b->data))		//再在链表c中找b的值如果找不到则将该值插入c中 
		{
			LC.insert(b->data);
		}
		b=b->link;
	}
}
//---------------------------------------------------------------
template<class T> 
void Intersection(List<T> LA, List<T>LB, List<T>&LC)//求交集
{
	LinkNode<T> *a = LA.getfirst();
	a=a->link;
	while(a!=NULL)
	{
	
		if(LB.findX(a->data))//在b中找链表a的值若找到了则放入c中c最后为ab的交集 
		{
	 		LC.insert(a->data); 
		}	
		a=a->link;	
	}	
}
template <class T>  
void List<T>::output()       // 以集合形式输出数据
{
       LinkNode<T> *p=first->link;
        cout<<"{ ";
        while(p!=NULL)
        {     cout<<p->data<<" ";

               p=p->link;   

         }
       cout<<"}"<<endl;
}

int main()
{
       List<int> A,B,C,D;
       A.inputRear(-1);
	   B.inputRear(-1);
       Union(A,B,C);         //集合并运算
       C.output();
       Intersection(A,B,D);  //集合交运算
       D.output();
	
return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-用单链表实现集合的并运算和交运算 的相关文章

  • Vue 生命周期和数据共享

    Vue 生命周期和数据共享 1 组件的生命周期 1 1 生命周期与生命周期函数 1 2 组件生命周期函数的分类 1 3 生命周期图示以及详解 2 组件之间的数据共享 2 1 组件之间的关系 2 2 父向子传值 2 3 子向父传值 2 4 兄
  • 降低指定进程的CPU占用率(适合游戏多开)

    应用场景举例 推荐BES软件 应用场景举例 游戏多开 比如 天书世界 网页游戏 单开占用CPU30 左右 最小化能够降低到10 以下 如果多开 那么CPU就是叠加累计 非常占用CPU资源 而且挂机严重影响CPU温度 1 采用最小化窗口的方式
  • CV综述目标检测整理---目录

    CV综述目标检测整理 目录 Object detection yolo系列 yolov3 从yolo入门目标检测 链接 YOLOV3论文解读与应用 https blog csdn net weixin 42466194 article de
  • codeforces 733D--Kostya the Sculptor

    Description Kostya is a genial sculptor he has an idea to carve a marble sculpture in the shape of a sphere Kostya has a
  • 威胁情报

    2020 05 01 引言 之前总是看到各种威胁情报 各种乱七八糟的定义 各种什么高级的词汇 什么上下文 什么攻击 统统看不懂 但是你去搜索威胁情报 国内几家比较知名的 或者说国外的 发现他们的网站提供的服务 就是IP 域名 文件检测这些内
  • MyEclipse报错:Multiple markers at this line

    Multiple markers at this line The type java io ObjectInputStream cannot be resolved It is indire 出错原因 jdk版本太高 不兼容而引起的问题
  • 大数据好不好学,有这几大步骤你就懂了

    很多初学者在萌生向大数据方向发展的想法之后 不免产生一些疑问 应该怎样入门 应该学习哪些技术 学习路线又是什么 所有萌生入行的想法与想要学习Java的同学的初衷是一样的 岗位非常火 就业薪资比较高 前景非常可观 基本都是这个原因而向往大数据
  • 安卓逆向入门指南:修改与重打包应用

    安卓逆向入门指南 修改与重打包应用 概述 介绍修改与重打包应用的目的和应用场景 强调合法性和道德准则 在逆向工程过程中需要遵守相关法律法规 理解应用结构与资源 APK文件结构 解释APK文件的基本结构 包括AndroidManifest x
  • Spring Boot2.x 整合lettuce redis 和 redisson

    前言 springboot2之前redis的连接池为jedis 2 0以后redis的连接池改为了lettuce lettuce能够支持redis4 需要java8及以上 lettuce是基于netty实现的与redis进行同步和异步的通信
  • 基于RFID技术的预制件管理系统的开发

    1 简介 随着计算机 通讯技术和消费电子产品 正如人们通常所知的3C数码产品 的到来 已经在人们生活的各个领域带来了改变 通过这些3C技术 在将来 信息的传播和获取将变得更加便利 电子化管理技术正在向移动管理概念转变 射频识别系统 RFID
  • 微信支付官方SDK PHP版本接入记录

    1 下载证书 下载商家支付证书 这里忽略步骤 下载的证书我们放在E wwwroot certs wx 目录下 一共有4个文件 apiclient cert p12 apiclient cert pem apiclient key pem 证
  • [linux-022]ubuntu20.04用virtualbox安装64位win10彻底解决“directory ezboot not found”问题

    1 这问题是由于win10的iso文件超过4g导致的 2 解决关键 需要一个小尺寸的能用winpe启动的iso镜像 这个镜像有磁盘分区工具和ghost 3 在virtualbox创建win10 64虚拟机 硬盘50g 4 给这个虚拟机挂上两
  • PHP 之session cookie

    cookie和session有什么用 常见的用法 比如在有些网站下载东西需要会员先登陆 http协议本身是无状态的 无法得知顾客是否已经登陆 怎么办呢 cookie和session就可以知道 再比如网上购物 用户身份认证 程序状态记录 购物
  • shell经典面试题根据文件创建用户名及密码(亲测)

    转载来源 shell经典面试题根据文件创建用户名及密码 https www jianshu com p eeb455eef7ca 01 前言 shell脚本已经学习了很长一段时间了 现在时不时来看一些经典的面试题 复习一些常用知识点 温故知
  • IDEA必备的10款插件

    目录 1 Vuesion Theme 2 lombok 3 File Expander 4 GitToolBox 5 Maven Helper 6 Translation 7 arthas idea 8 Free Mybatis plugi
  • 递归问题------汉诺塔

    递归问题实际上是入栈出栈的一个过程 但有时候也会比较难理解 虽然用起来是比较方便的 1 include
  • windows文件传到linux导致文件类型错误处理

    问题 hadoop hadoop001 hadoop 2 6 0 cdh5 7 0 sbin start dfs sh 18 11 27 16 24 25 WARN util NativeCodeLoader Unable to load
  • VC++----using namespace std问题

    写一个简单的代码 cpp view plain copy print
  • 大数据组件-Flume集群环境的启动与验证

    大数据学习记录篇 持续更新中 个人主页 beixi 本文章收录于专栏 点击传送 大数据学习 持续更新中 感谢各位前辈朋友们支持学习 上一篇文章写到了Flume集群环境的安装 这篇文章接着上篇文章延伸Flume集群环境的启动与验证 如果Flu
  • JS:三种常用的函数定义方式

    js中函数也是一个对象 我们可以通过调用构造函数即new Function 的方式来定义 但是在 JavaScript 中 很多时候要尽量避免使用 new 关键字 因此这种方式并不推荐 了解即可 通常使用以下三种定义方式 命名函数 即最基本

随机推荐