【数据结构】第2章 线性表 实验4:求两个集合LA和LB(用单链表表示)的并和交集

2023-11-20 16:10

本文主要是介绍【数据结构】第2章 线性表 实验4:求两个集合LA和LB(用单链表表示)的并和交集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【单链表的初始化、表长、取值、查找、遍历、后插法(尾插法)创建、合并(并集、交集)】实验报告+完整代码


题目: 求两个集合LA和LB(用单链表表示)的并和交集

一、实验目的和要求

(1)熟悉C++的上机环境,进一步掌握C++的结构特点;
(2)掌握求两个集合LA和LB(用单链表表示)的并和交集的方法。

二、实验环境

Windows10, CodeBlocks.

三、实验内容及实施

【实验内容】
在实验2的基础上,使用单链表表示集合。编写两个算法(求交算法和求并算法),并输出最终的结果。
测试用例:集合A为{3,4,1,6},集合A为{2,3,6,7},交集为{3,6},并集为{1,2,3,4,6,7}
【程序流程】

【源程序】

#include<bits/stdc++.h>
using namespace std;
typedef int Status;
typedef int ElemType;
#define OVERFLOW -1
#define ERROR 0
#define OK 1//-----单链表的储存结构-----
typedef struct LNode
{ElemType data;              //结点的数据域struct LNode *next;         //结点的指针域
}LNode, *LinkList;              //LinkList为指向结构体LNode的指针类型LinkList LA, LB, LC;//1、单链表初始化 O(1)
Status InitList(LinkList &L)
{//构造一个带头结点的空单链表LL = new LNode;              //生成新的结点作为头结点,用头指针L指向头结点L->next = NULL;             //头结点的指针域置空return OK;
}//5、单链表表长 O(n)
Status ListLength(LinkList L)
{//返回带头结点的单链表的长度LNode *p = L;                   //p指向头结点int j = 0;                      //计数器j初值赋为0while(p->next)                  //直到p的后继为空时停止{p = p->next;                //p指向下一个结点j++;                        //计数器j相应加1}return j;
}//6、单链表取值 O(n)
Status GetElem(LinkList L, int i, ElemType &e)
{//在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个元素的值LNode *p = L->next;             //p指向首元结点int j = 1;                      //计数器j初值赋为1while(p && j < i)               //直到p为空或p指向第i个元素时停止{p = p->next;                //p指向下一个结点               j++;                        //计数器j相应加1                       }if(!p || j > i)                 //i值不合法,即i > n或i < 1return ERROR;e = p->data;                    //取第i个结点的数据域return OK;
}//7、单链表查找 O(n)
LNode *LocateElem(LinkList L, ElemType e)
{//在带头结点的单链表中查找值为e的元素,返回e的地址(所以LNode *LocateElem)LNode *p = L->next;             //p指向首元结点while(p && p->data != e)        //直到p为空或p所指结点的数据域等于e时停止p = p->next;                //p指向下一个结点return p;                       //查找成功返回值为e的结点地址p,查找失败p为NULL
}//10、单链表插入 O(n)
Status ListInsert(LinkList &L, int i, ElemType e)
{//在带头结点的单链表L中第i个位置插入值为e的新结点LNode *p = L;                   //p指向头结点int j = 0;                      //计数器j初值赋为0while(p && j < i - 1)           //直到p为空或p指向第i-1个结点时停止{p = p->next;                //p指向下一个结点j++;                        //计数器j相应加1}                               if(!p || j > i - 1)             //i值不合法,即i > n + 1或i < 1return ERROR;LNode *s = new LNode;           //生成新结点*ss->data = e;                    //将结点*s的数据域置为es->next = p->next;              //先接后链p->next = s;                    //再接前链return OK; 
}//12、单链表遍历 O(n)
Status TraverseList(LinkList L)
{LNode *p = L->next;             while(p->next){cout<<p->data<<' ';p = p->next;}cout<<p->data<<'\n';return OK;
}//14、后插法创建单链表 O(n)
void CreateList_R(LinkList &L, int n)
{//正位序输入n个元素的值,建立带头结点的单链表LL = new LNode;                  //先初始化一个带头结点的空链表L->next = NULL;                 LNode *r = L;                   //尾指针r先指向头结点for(int i = 0; i < n; i++){LNode *p = new LNode;       //生成新结点*pcin>>p->data;               //输入元素值赋给新结点*p的数据域p->next = NULL;             //后置空后链             r->next = p;                //再接前链r = p;                      //r指向新的尾结点*p}
}//16、单链表合并_求并集 O(m * n)
void MergeList(LinkList &LA, LinkList LB)
{//将所有在线性表LB中但不在LA中的数据元素插入到LA中int m = ListLength(LA), n = ListLength(LB);     //求线性表长度for(int i = 1; i <= n; i++) {ElemType e;GetElem(LB, i, e);                          //取LB中的第i个元素赋给eif(!LocateElem(LA, e))                      //LA中不存在与e相同的数据元素ListInsert(LA, ++m, e);                 //将e插在LA的最后,先++,再传值}
}//16、单链表合并_求交集 O(m * n)
void MixList(LinkList LA, LinkList LB, LinkList &LC)
{//将线性表LB中和LA中共有的数据元素插入到LC中int m = ListLength(LA), n = ListLength(LB);     //求线性表长度int k = 0;for(int i = 1; i <= n; i++) {ElemType e;GetElem(LB, i, e);                          //取LB中的第i个元素赋给eif(LocateElem(LA, e))                       //LA中存在与e相同的数据元素ListInsert(LC, ++k, e);                 //将e插在LC的最后,先++,再传值}
}//实验4:求两个集合LA和LB(用单链表表示)的并和交集
int main()
{int n;cout<<"请输入集合A的元素个数:";cin>>n;cout<<"请按顺序输入这"<<n<<"个元素:";CreateList_R(LA, n);cout<<"请输入集合B的元素个数:";cin>>n;cout<<"请按顺序输入这"<<n<<"个元素:";CreateList_R(LB, n);cout<<'\n';cout<<"集合A为:";TraverseList(LA);cout<<"集合B为:";TraverseList(LB);InitList(LC);MixList(LA, LB, LC);cout<<"A与B的交集为:";TraverseList(LC);MergeList(LA, LB);cout<<"A与B的并集为:";TraverseList(LA);return 0;
}

四、实验结果

在这里插入图片描述

五、实验讨论

(1)熟悉了C++的上机环境,进一步掌握C++的结构特点;
(2)掌握了求两个集合LA和LB(用单链表表示)的并和交集的方法。

这篇关于【数据结构】第2章 线性表 实验4:求两个集合LA和LB(用单链表表示)的并和交集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395839

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.