6-101 LinkList11-求两个单链表的差集【有题解视频,可本地编译器调试】

这篇具有很好参考价值的文章主要介绍了6-101 LinkList11-求两个单链表的差集【有题解视频,可本地编译器调试】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

已知两个单链表A与B,设计算法AdiffB( ),构造出A与B的差集新链表C,链表C中的元素值为A链表中有而B链表中无的元素值。
要求C表的链点为新开辟的链点,不采用A、B链表中原有链点,最后要求遍历A、B、C三个链表。

数据结构定义

带头结点的单链表结点定义如下:

typedef int DataType;
typedef struct Node
{
    DataType data;      // data域用于存储数据元素
    struct Node *next;  // next域用于存放指向其后继的指针
}LNode, *PNode, *LinkList;  // LinkList为头指针

函数接口定义:

在这里描述函数接口。例如:
void AdiffB ( LinkList a, LinkList b, LinkList *c );

其中 a 、bc 都是用户传入的参数,ab分别为求差集的两个单链表的头指针,而c为求出来的差集单链表的头指针。

裁判测试程序样例:

#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node
{
    DataType data;
    struct Node* next;
}LNode, * PNode, * LinkList;
int InitLinkList(LinkList* head)
{ // 初始化单链表,开辟头结点
    *head = (LinkList)malloc(sizeof(LNode));
    if (!head)
    {
        printf("初始化链表错误!\n");
        return 0;
    }
    (*head)->next = NULL;
    return 1;
}
PNode LinkListInsert(LinkList h, int pos, DataType x)
{ // 在单链表h的第pos个位置插入x值的元素
    PNode p = h, q;
    int i = 0;
    while (p && i < pos - 1)
    {
        p = p->next;
        i++;
    }
    if (!p || i > pos - 1)
    {
        printf("插入位置不合法!\n");
        return NULL;
    }
    q = (PNode)malloc(sizeof(LNode));
    if (!q)
    {
        printf("不能生成新结点\n");
        return NULL;
    }
    q->data = x;
    q->next = p->next;
    p->next = q;
    return q;
}
void DestroyLinkList(LinkList h)
{  // 销毁单链表
    PNode p = h->next;
    while (h)
    {
        p = h;
        h = h->next;
        free(p);
    }
}
void TraverseLinkList(LinkList h)
{  // 遍历单链表
    PNode p = h->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
/* 本题要求函数 */
void AdiffB(LinkList a, LinkList b, LinkList* c);  
int main()
{
    char ch;
    LinkList aa, bb, cc;
    DataType x;
    int pos = 1;
    InitLinkList(&aa);
    InitLinkList(&bb);
    InitLinkList(&cc);
    do
    {
        scanf("%d", &x);  // 某些编译器要求此处改为scanf_s
        LinkListInsert(aa, pos++, x);
    } while ((ch = getchar()) != '\n');
    pos = 1;
    do
    {
        scanf("%d", &x);  // 某些编译器要求此处改为scanf_s
        LinkListInsert(bb, pos++, x);
    } while ((ch = getchar()) != '\n');
    AdiffB(aa, bb, &cc);
    printf("单链表A是\n");
    TraverseLinkList(aa);
    printf("单链表B是\n");
    TraverseLinkList(bb);
    if (cc->next != NULL)
    {
        printf("单链表C是\n");
        TraverseLinkList(cc);
    }
    DestroyLinkList(aa);
    DestroyLinkList(bb);
    DestroyLinkList(cc);
}
/* 你的答案写在此处 */

输入样例:

98 76 54 50 38 9
89 50 40 38 20 11 5

输出样例:

单链表A是
98 76 54 50 38 9 
单链表B是
89 50 40 38 20 11 5 
单链表C是
98 76 54 9 

 

 void AdiffB(LinkList a, LinkList b, LinkList* c)
{
    PNode pa = a->next;
    PNode pb = b->next;
    PNode pc = *c;

    while (pa)
    {
        int found = 0;
        pb = b->next;

        while (pb)
        {
            if (pa->data == pb->data)
            {
                found = 1;
                break;
            }

            pb = pb->next;
        }

        if (!found)
        {
            PNode newNode = (PNode)malloc(sizeof(LNode));
            newNode->data = pa->data;
            newNode->next = pc->next;
            pc->next = newNode;
            pc = newNode;
        }

        pa = pa->next;
    }
}文章来源地址https://www.toymoban.com/news/detail-816979.html

到了这里,关于6-101 LinkList11-求两个单链表的差集【有题解视频,可本地编译器调试】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • php 两个数组取交集、并集、差集

    php 两个数组取交集、并集、差集 交集:array_intersect() 并集:array_merge() 差集:array_diff() laravel 两个集合取交集、并集、差集 交集: 使用intersect()函数,用于获取两个集合的交集: 并集:使用union()函数,用于获取两个集合的并集: 差集:使用diff()函数,用于获取两个集合的

    2024年02月12日
    浏览(47)
  • jdk8两个List取交集、差集、并集(不去重)、并集(去重)

    jdk8两个List取交集、差集、并集(不去重)、并集(去重) demo代码: 输出结果:

    2024年02月15日
    浏览(225)
  • Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)

    首先知道几个单词的意思: 并集 = union 交集 = intersection 补集 = complement 析取 = disjunction 减去 = subtract 对于两个给定集合A、B,由两个集合所有元素构成的集合,叫做A和B的并集。 记作:AUB 读作“A并B” 例:{3,5}U{2,3,4,6}= {2,3,4,5,6} 对于两个给定集合A、B,由属于A又属于B的所有元

    2024年01月22日
    浏览(54)
  • 数据结构——单链表的查找、求单链表长度、单链表的创建

    一、单链表的查找 1.按位查找 ==GetElem(L, i): == 按位查找操作,获取表 L 中第 i 个位置的元素的值 ;   平均时间复杂度O(n) 2.按值查找 ==LocateElem(L, e)==: 按值查找操作,在表 L 中查找具有给定值的元素 ; 二、求单链表的长度 == Length(LinkList L)== :计算单链表中数据结点(

    2024年01月21日
    浏览(51)
  • 【C++】单链表——单链表的基本操作

     由于顺序表的插入删除操作需要移动大量的元素,影响了运行效率,因此引入了线性表的链式存储—— 单链表 。单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元,因此它不要求在逻辑上相邻的两个元素在物理位置上也相邻。 单

    2024年02月03日
    浏览(46)
  • java8利用Stream方法求两个List对象的交集、差集与并集(即:anyMatch和allMatch和noneMatch的区别详解)

    1、anyMatch  判断数据列表中是否存在任意一个元素符合设置的predicate条件,如果是就返回true,否则返回false。 接口定义: boolean anyMatch(Predicate? super T predicate); 方法描述: 在anyMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 PredicateT 是接收一个T类型参数,然后经过

    2024年02月06日
    浏览(58)
  • 单链表的体会

    单链表是一种十分常用的数据结构,可以用来解决很多实际问题。通过学习和实现单链表,可以加深对数据结构和算法的理解,并提高编程能力。 代码实现了单链表的初始化、节点的插入、删除和打印等基本操作。 单链表是一种常见的数据结构,由节点组成,每个节点包含

    2024年02月08日
    浏览(31)
  • 单链表的逆置

    1 问题 如何实现单链表中的数据进行逆置。 2 方法 方法一头插法:利用头插法重新建立带节点的新链表,逆置链表初始为空,表中节点从原链表中依此“删除”,在逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个节点,如此循环,

    2024年02月15日
    浏览(31)
  • 单链表的插入与删除

    链表是数据结构中的一种线性结构,表示数据运算之间的一种抽象关系。 1、单链表的结构如下:         其中包括一个数据域和一个指针域,向单链表中插入成员时只需要再次分配一个同样的变量,让上一个变量中的指针域指向下一个节点即可,比起顺序表来说,链表更加

    2024年02月15日
    浏览(40)
  • 单链表的基本操作

    目录 一.链表的基本概念和结构 二.链表的分类 三.单链表的基本操作  1.创建一个节点 2.打印 3.尾插 4.头插 5.尾删 6.头删 7.查找 8.指定位置插入 9.指定位置删除 10.销毁         概念:链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表

    2024年01月22日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包