线性表的合并之求解一般集合的并集问题(单链表)

目录

1问题描述:

2问题分析:

3代码如下:

4运行结果:


1问题描述:


        已知两个集合A和B,现要求一个新的集合A=AuB。例如,设

                A=(7,5,3,11),B=(1,2,3)

要求合并后为(7,5,3,11,1)(即遵循集合互异性的原则)

2问题分析:


可以利用两个线性表LA 和LB 分别表示集合A 和B(即线性表中的数据元素为集合中的成员), 这样只需扩大线性表 LA,将存在于 LB中而不存在于 LA 中的数据元素插入到 LA 中去。只要从LB中依次取得每个数据元素, 并依值在 LA中进行查访, 若不存在, 则插入之。
上述操作过程可用算法 2.15 来描述。具体实现时既可采用顺序形式, 也可采用链表形式。
算法2.15 线性表的合并
【算法步骤】
① 分别获取LA 表长m 和LB表长n)
②从LB中第1个数据元素开始, 循环n次执行以下操作:
● 从LB中查找第i(1≤i≤n)个数据元素赋给e;
● 在LA 中查找元素e, 如果不存在, 则将e插在表LA的最后。

主要思想就是从B里挨个取出元素,然后遍历A看是否有重复,若没有就插入A的最后即可

3代码如下:

#include<iostream>
using namespace std;
#include<stdlib.h>
#define ok -1
#define error -2
typedef int Status;
typedef int ElemType; 
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L,LinkList &M);
Status fuzhi(LinkList &L,int m);
void shuchu(LinkList L);
Status GetElem(LinkList L,int i,ElemType &e);
Status Length(LinkList L);
Status find1(LinkList L,ElemType e);
Status ListInsert(LinkList &L,int m,ElemType e);
int main()
{LinkList L,M;int x,m,n;ElemType y,e;x=InitList(L,M);if(x==error) cout<<"初始化失败";else         cout<<"初始化成功"<<endl;cout<<"请决定为线性表L赋几个元素:";cin>>x;fuzhi(L,x);cout<<"线性表L为:"<<endl;shuchu(L); cout<<"请决定为线性表M赋几个元素:";cin>>x;fuzhi(M,x);cout<<"线性表M为:"<<endl;shuchu(M);m=Length(L);cout<<"m长度为:"<<m<<endl;n=Length(M);cout<<"n长度为:"<<n<<endl;for(int i=1;i<=n;i++){GetElem(M,i,e);if(find1(L,e)!=error){m++;ListInsert(L,m,e);}shuchu(L);}return 0;
}
Status InitList(LinkList &L,LinkList &M)
{L=new LNode;M=new LNode;if(L==NULL||M==NULL) return error;L->next=NULL;M->next=NULL;return ok;
}
Status fuzhi(LinkList &L,int m)
{LNode *s,*r=L;ElemType n;for(int i=1;i<=m;i++){cout<<"请输入第"<<i<<"个元素";cin>>n; s=new LNode;s->data=n;r->next=s;r=s;}r->next=NULL;return ok;
}
void shuchu(LinkList L)
{LNode *p;p=L->next;cout<<"单链表内容为:";while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;
}
Status ListInsert(LinkList &L,int x,ElemType e)//插入 前者为位置后者是元素 
{LNode *p=L->next,*s;int j=0;while(p->next) {p=p->next;}s=new LNode;s->data=e;s->next=p->next;p->next=s;return ok;
}
Status Length(LinkList L)
{int i,j=0;LNode *p=L->next; while(p!=NULL){p=p->next;++j;}return j;
}
Status GetElem(LinkList L,int i,ElemType &e)
{LNode *p=L->next; int j=0;while(p!=NULL){j++;if(j==i) {e=p->data;return ok;}p=p->next;}
}
Status find1(LinkList L,ElemType e)
{LNode *p=L->next; while(p!=NULL){if(p->data==e) return error;else p=p->next;}return ok;
}

#include<iostream>
using namespace std;
#include<stdlib.h>
#define ok -1
#define error -2
typedef int Status;
typedef int ElemType; 
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L,LinkList &M);
Status fuzhi(LinkList &L,int m);
void shuchu(LinkList L);
Status GetElem(LinkList L,int i,ElemType &e);
Status Length(LinkList L);
Status find1(LinkList L,ElemType e);
Status ListInsert(LinkList &L,int m,ElemType e);
int main()
{
    LinkList L,M;
    int x,m,n;
    ElemType y,e;
    x=InitList(L,M);
    if(x==error) cout<<"初始化失败";
    else         cout<<"初始化成功"<<endl;
    cout<<"请决定为线性表L赋几个元素:";
    cin>>x;
    fuzhi(L,x);
    cout<<"线性表L为:"<<endl;
    shuchu(L); 
    cout<<"请决定为线性表M赋几个元素:";
    cin>>x;
    fuzhi(M,x);
    cout<<"线性表M为:"<<endl;
    shuchu(M);
    m=Length(L);
    cout<<"m长度为:"<<m<<endl;
    n=Length(M);
    cout<<"n长度为:"<<n<<endl;
    for(int i=1;i<=n;i++)
    {
        GetElem(M,i,e);
        if(find1(L,e)!=error)
        {
            m++;
            ListInsert(L,m,e);
        }
            
        shuchu(L);
    }
    return 0;
}
Status InitList(LinkList &L,LinkList &M)
{
    L=new LNode;
    M=new LNode;
    if(L==NULL||M==NULL) return error;
    L->next=NULL;
    M->next=NULL;
    return ok;
}
Status fuzhi(LinkList &L,int m)
{
    LNode *s,*r=L;
    ElemType n;
    for(int i=1;i<=m;i++)
    {
        cout<<"请输入第"<<i<<"个元素";
        cin>>n; 
        s=new LNode;
        s->data=n;
        r->next=s;
        r=s;
    }
    r->next=NULL;
    return ok;
}
void shuchu(LinkList L)
{
    LNode *p;
    p=L->next;
    cout<<"单链表内容为:";
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
Status ListInsert(LinkList &L,int x,ElemType e)//插入 前者为位置后者是元素 
{
    LNode *p=L->next,*s;
    int j=0;
    while(p->next) 
    {
        p=p->next;
    }
    s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return ok;
}
Status Length(LinkList L)
{
    int i,j=0;
    LNode *p=L->next; 
    while(p!=NULL)
    {
        p=p->next;
        ++j;
    }
    return j;
}
Status GetElem(LinkList L,int i,ElemType &e)
{
    LNode *p=L->next; 
    int j=0;
    while(p!=NULL)
    {
        j++;
        if(j==i) 
        {
            e=p->data;
            return ok;
        }
        p=p->next;
    }
}
Status find1(LinkList L,ElemType e)
{
    LNode *p=L->next; 
    while(p!=NULL)
    {
        if(p->data==e) return error;
        else p=p->next;
    }
    return ok;
}

4运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哲学♂家带你用动态内存函数实现二维数组

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、思路分析 二、实现 总结 前言 最近在做题的时候发现一个比较考验技术的问题&#xff0c;用内存函数模拟实现二维数组&#xff0c;接下来给大家演示一下我的做…

Java进阶—GC回收(垃圾回收)

1. 什么是垃圾回收 垃圾回收(Garbage Collection&#xff0c;GC)是Java虚拟机(JVM)的一项重要功能&#xff0c;用于自动管理程序中不再使用的内存。在Java中&#xff0c;程序员不需要手动释放内存&#xff0c;因为GC会自动检测并回收不再使用的对象&#xff0c;从而减少内存泄…

arm作业3

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI-…

图解Kafka架构学习笔记(三)

准备Kafka环境 这里推荐使用Docker Compose快速搭建一套本地开发环境。 以下docker-compose.yml文件用来搭建一套单节点zookeeper和单节点kafka环境&#xff0c;并且在8080端口提供kafka-ui管理界面。 version: 2.1services:zoo1:image: confluentinc/cp-zookeeper:7.3.2hos…

详解:JS异步解决方案之回调函数,及其弊端

「异步编程」是前端工程师日常开发中经常会用到的技术&#xff0c;异步的实现有好几种方式&#xff0c;各有利弊&#xff0c;本篇先讲通过回调来实现来异步 。 一、同步和异步 同步编程和异步编程是两种不同的编程方式。 同步编程是指按照代码的顺序执行&#xff0c;每一行代…

[服务器] 安装Nacos2.2.0-Windows

文章目录 Nacos安装官网下载地址官方个人百度云 单机启动修改端口 登录后台与修改配置浏览器打开管理界面修改默认密码创建配置 Nacos 安装 官网 https://nacos.io/ 下载地址 官方 https://github.com/alibaba/nacos/releases 个人百度云 链接&#xff1a;https://pan.…

javaSSM游泳馆日常管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM游泳馆日常管理系统是一套完善的完整企业内部系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;MAVEN方式加载&#xff0c;系统具有完整的源代码和…

virtualbox导入vdi

新建虚拟机 点击新建 输入新建属性 配置cpu和内存 虚拟硬盘 这里选择已有的vdi文件 摘要 这里点击完成 虚拟机添加成功 点击启动,启动虚拟机 注意 这个时候的ip,还是以前镜像的ip,如果两个镜像一起启动

手把手教你使用Python向 xls 和 xlsx 格式文件写入内容

1.向 xls 格式文件写入内容 # 导入 xlwt 模块 import xlwt# 导入 random 模块 import random# 创建工作簿对象 wb xlwt.Workbook()# 创建工作表对象 sheet wb.add_sheet("三年级一班") # 工作表名称# 定义学生姓名 students ["江海", "尧正&quo…

【题目】【网络系统管理】2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建

2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A&#xff1a;网络构建 目录 考试说明 … 3 任务描述 … 3 任务清单 … 3 &#xff08;一&#xff09;基础配置 … 3 &#xff08;二&#xff09;有线网络配置 … 4 &#xff08;三&#xff09;无线网络配置 … 5 &…

Redis 6和7:探索新版本中的新特性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! Redis&#xff0c;作为开源的内存数据结构存储系统&#xff0c;以其高性能、丰富的数据结构和广泛的应用场景而深受开发者喜爱。随…

中国气象局发布大地磁暴预警:空间站轨道或受影响

什么是地磁暴&#xff1f; 地磁暴作为最典型的太阳爆发活动&#xff0c;一次地磁暴是一次日冕物质抛射过程&#xff0c;能将数以亿吨计的太阳物质以数百千米每秒的高速抛离太阳表面。 不光是巨大质量与速度汇聚成的动能&#xff0c;它们还携带着太阳强大的磁场能&#xff0c;一…