求两个单链表的差集和并集

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

题目:-
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
这里写图片描述
思路:指针的指针pa遍历链表A,指针pb遍历链表B,当节点的值相等,删除,提前将删除位置的下一个节点保存,然后
继续遍历这两个链表直到全部遍历完后,剩下的节点连接起来就是这两个链表的差集
验证:

#include<iostream>
#include<assert.h>
using namespace std;
struct Node
{
    int _data;
    Node*next;

    Node(int data)
        :_data(data)
        , next(NULL)
    {}
};
void Different(Node**A, Node*B)
{
    Node*pa = *A;//用来遍历A链表
    //Node*pb = B;//用来遍历B链表
    Node *prev = NULL;//用来保存删除后节点能连接起来
    Node*del;//待删除的节点
    while (pa)
    {
        Node*pb = B;
        while (pb&&pa->_data != pb->_data)
            pb = pb->next;//
        if (pb)//两个节点的值相等
        {
            if (!prev)
            {
                *A = pa->next;//指向下一个节点
            }
            else//第一个节点相等
            {
                prev->next = pa->next;//指向相等节点的后一个
            }
            del = pa;//删除的节点
            pa = pa->next;
            delete del;
        }
        //此时链表B已经遍历完了
        else
        {
            //更新节点的位置
            prev = pa;
            pa = pa->next;
        }
    }
}
void Printf(Node*root)
{
    Node*cur = root;
    while(cur)
    {
        cout << cur->_data << " ";
        cur = cur->next;
    }
    cout << endl;
}
void Test()
{
    Node*n1 = new Node(5);
    Node*n2 = new Node(10);
    Node*n3 = new Node(20);
    Node*n4 = new Node(15);
    Node*n5 = new Node(25);
    Node*n6 = new Node(30);

    n1->next = n2;
    n2->next = n3;
    n3->next = n4;
    n4->next = n5;
    n5->next = n6;
    cout << "链表A" << endl;
    Printf(n1);

    Node*n11 = new Node(5);
    Node*n22 = new Node(15);
    Node*n33 = new Node(35);
    Node*n44 = new Node(25);

    n11->next = n22;
    n22->next = n33;
    n22->next = n33;
    n33->next = n44;
    cout << "链表B" << endl;

    Printf(n11);
    cout << "链表的差集" << endl;

    Different(&n1, n11);
    Printf(n1);
}

int main()
{
    Test();
    system("pause");
    return 0;
}

这里写图片描述
求交集
同样的方法,我们可以求两个单链表的交集
思路:当链表A的值小于链表B的值,链表A相后移,如果链表A的值大于链表B的值,链表B的值向后移,否则同时移,当遍历完这个链表,交集就出来了.
验证

void UnionSet(Node*L1, Node*L2)
{
    while(L1&&L2)
    {
        if (L1->_data < L2->_data)
        {
            L1 = L1->next;
        }
        else if (L1->_data>L2->_data)
        {
            L2 = L2->next;
        }
        else
        {
            L1 = L1->next;
            L2 = L2->next;
        }
    }
}
void Printf(Node*root)
{
    Node*cur = root;
    while(cur)
    {
        cout << cur->_data << " ";
        cur = cur->next;
    }
    cout << endl;
}
void Test()
{
    Node*n1 = new Node(5);
    Node*n2 = new Node(10);
    Node*n3 = new Node(20);
    Node*n4 = new Node(15);
    Node*n5 = new Node(25);
    Node*n6 = new Node(30);

    n1->next = n2;
    n2->next = n3;
    n3->next = n4;
    n4->next = n5;
    n5->next = n6;
    cout << "链表A" << endl;
    Printf(n1);

    Node*n11 = new Node(5);
    Node*n22 = new Node(15);
    Node*n33 = new Node(35);
    Node*n44 = new Node(25);

    n11->next = n22;
    n22->next = n33;
    n22->next = n33;
    n33->next = n44;
    cout << "链表B" << endl;

    Printf(n11);


    cout << "链表的交集" << endl;
    UnionSet(n1, n11);
    Printf(n1);


}

int main()
{
    Test();
    system("pause");
    return 0;
}
C语言利用链表实现两个合的差集 Description 线性表AB分别表示两个合AB(同合中的元素值各不相同、无序),用带头结点的单链表存储。 另辟空间构成一个线性表C,编写算法C=AB的差集。  结点结构: typedef struct Node {    int data;    struct Node *next; }LNode,*LinkList; 要: (1)编写函数,实现输入数据建立合单链... 阅读详情

相关推荐

两个递增单链表差集单链表

两个递增单链表差集 给定两个递增有序的单链表LALB,目标是找到它们的差集,即存在于LA中但不存在于LB中的元素。最终,LA将被修改为只包含这些差集元素。

m0_49844997的博客 466

数据结构-两个链表交集差集

【题目来自灰灰考研】 (2018南开大学初试)两个有序的无头结点的链表La,Lb。编写函数:如何以最优的方式找出二者的交集且把结果存在一个新链表中返回。 单链表的类型定义如下:  Typeddf struct LNode{  Element Type data;   Struct LNode *next;   }LNode, *ListNode;    #include&lt...

LiuKe369的博客 1万+

单链表交集(C语言)

实现单链表交集的程序,程序首先由用户指定输入两个任意长短的单链表,然后程序将这两个单链表交集出来显示。程序里面包含了单链表的头插法尾插法两种操作。

链表交集合并、排序

第四周 要: 1、将两个有序的递增链表合并为一个递增的有序链表。要结果链表仍使用原来两个链表的储存空间,不另外占用其他的储存空间。表中不允许有重复数据。 2、已知两个链表AB分别表示两个合,其元素递增排列。设计一个算法用于出A与B的交集存放在A链表中。 思路:首先就是创建链表。一般有前插法后插法;二 要递增的话可以用一个排序算法(简单看了一下冒泡排序)。三 链表...

aobengshen0220的博客 578

两个链表交集差集

两个链表交集差集其实都是创建一个新链表然后遍历插入的题型,所以下边就举一个例子。两个链表交集差集

2401_82641862的博客 918

单链表交集

单链表交集

weixin_54667422的博客 6215

两个单链表

void Union(LinkNode *L1,LinkNode *L2,LinkNode *&L3){ LinkNode *p1=L1->next,*s=p1->next,*p2; //p1,p2遍历L1,L2链表 s指向p1下一个结点 while(p1 != NULL ){ //将L1插入L2中,有重复元素不插入 p2 = L2->next; //p2指向L2第一个数据结点 whil...

yyy_zxc的博客 1916

实验三

实验三:两个合(用单链表表示)的、交差运算 实验要:在实验二的基础上,使用单链表表示合,编写三个算法(交算法、算法、差),输出最终的结果。 例如:合A为(3、4、1、6),合B为(2、3、6、7) 交集为:(3、6) 为:(1、2、3、4、6、7) 差集为:(1、4)(注意:差集C=A-B,即属于A但不属于B的元素的合) #include<iostream> #include<cstdio> using namespace std; typede

sunhongxuan666的博客 220

AB 单链表表示 合,交集 差集

AB 单链表表示 合的 交集 差集 /* AB 单链表表示 合的 交集 差集 */ //#include <iostream> //using namespace std; #include <stdio.h> #include <stdlib.h>//包含 随机 函数 rand() #include <time.h> //含tiem()函数 获取 当前 时间 #include <malloc.h> //含ma.

qq_47991812的博客 3699

c语言单链表--实现合的所有操作(交集,,差集)

c语言单链表–实现合的所有操作(交集,,差集) 单链表我之前怎么想都想不通,后来编程,写着写着感觉恍然大悟,特别简单,以下是代码区:不会的小伙伴加油! #include<stdio.h> #include<stdlib.h> /* 插入一个数到合指定位置 按值删除合中的元素 按值在合中进行查找 清空两个合的交集 两个合的 两个合的差集 ...

123 1万+

基于单链表实现合的交集差集的运算

解题思路(单链表交集差集的思想顺序表交集差集的思想基本相同) 1.先通过CreateListR 函数将合 a b 中的元素添加到顺序表 ha hb 中 ,添加过程使用的是顺序表原有的Initlist 函数(初始化表) ListInsert 函数 (向表中插入元素) 。 2.因为原合是无序的, 所以我通过 sort 函数 (选择排序),使得合变得有序。 ...

weixin_30740295的博客 4093

使用单链表实现合操作:交集差集

在计算机科学的领域中,数据结构是构建高效算法的基石。合作为一种基本的数据结构,广泛应用于各种场景,如数据库查询、图形处理数据分析等。合的操作,如交集差集,不仅是理论上的重要概念,也是实际编程中常见的需。   在众多数据结构中,单链表因其动态内存分配灵活的插入与删除操作而备受青睐。通过单链表实现合操作,可以有效地管理元素,确保合的唯一性有序性。   本文将深入探讨如何使用单链表来表示合,实现其基本操作。我们将通过 Python 代码示例,逐步展示如何构建一个功能齐全的合类,

不迁怒,不贰过。小知识,大智慧。 1381

两个合用单链表存储,分别合的差集单链表差集

一、交集题目:已知合AB的元素分别用不含头结点的单链表存储,函数difference()用于合A与B的差集将结果保存在合A的单链表中。 例如,若合A = { 5,10,20,15,25,30 },合B = { 5,15,35,25 },完成计算后A = { 10,20,30 }。 链表结点的结构类型定义如下: struct node { int elem;

ArchyLi 7615

交集 差集 单链表实现

 HTML Tags and JavaScript tutorialvar encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S);

698

线性表练习之Example009-两个有序递增链表差集

已知递增有序的单链表A、B(A、B中元素个数分别为m、n,且A、B都带有头结点)分别存储了一个合,请设计算法,以两个合AB的差集`A-B`(仅由在A中出现而不在B中出现的元素所构成的合)。将差集保存在单链表A中,保持元素的递增有序性。

二木成林 2433

单链表实现对合的交,,差的操作

#include&amp;amp;lt;stdio.h&amp;amp;gt; #include&amp;amp;lt;stdlib.h&amp;amp;gt; #define SET struct set struct set { int number; SET *next; }; SET *Creat_SetList(char *name);//创建合的链表 void Print_SetList(SET *head); //输出链表 void Sor...

weixin_44046769的博客 6213

c语言两个链表,数据结构-两个链表交集差集

【题目来自灰灰考研】(2018南开大学初试)两个有序的无头结点的链表La,Lb。编写函数:如何以最优的方式找出二者的交集且把结果存在一个新链表中返回。单链表的类型定义如下:Typeddf struct LNode{Element Type data;Struct LNode *next;}LNode, *ListNode;#include#include#include#define MIN ...

weixin_39981624的博客 1478

数据结构中用顺序表来实现两个合的交集差集

void except(List L1,List L2,List &L3){ /*两个表的差集 由所有属于A且不属于B的元素组成的 */void Intersection(List l1,List l2,List &l3) { //两个交集的实现。void inputlist(List &L,int n){ //构建链表的输出。void bingji(List L1,List L2,List &L3){ //两个表的。printf("两个表的交集:");

weixin_63346670的博客 3130

单链表实现合的交差Java_基于单链表实现合的交集差集的运算...

#include #include#includeusing namespacestd;/*定义单链表数据*/typedefcharElemType;typedefstructLNode{ElemType data;struct LNode *next;}LinkList;/*单链表的初始化*/void InitList(LinkList *&L){L= (LinkList *)mallo...

weixin_29053067的博客 1082
上一篇: 判断一个栈的弹出序列是否为合法序列
下一篇: C语言如何模拟C++实现继承和多态
f2016913
博客等级 码龄10年 79粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值