【数据结构】第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

相关文章

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.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <