T、DZ 2023-03-12 16:32 采纳率: 83.3%
浏览 164
已结题

求集合(用单链表表示)的并、交和差运算

编写程序,采用单链表表示集合(假设同一个结合中不存在重复的元素),将其按递增方式排序,构成有序单链表,并求这样的两个集合的并、交和差。
单链表结点类型定义:

typedef int ElemType;    //元素的数据类型

typedef struct LNode {
    ElemType data;        //结点的数据域
    struct LNode *next;    //指向后继结点
} LinkNode;             //单链表结点类型

函数接口定义:

//尾插法建立单链表,细节不表
void CreateListR(LinkNode *&L, ElemType a[], int n);

//输出线性表,细节不表
void DispList(LinkNode *L);

//求两个有序集合的并
void Union(LinkNode *A, LinkNode *B, LinkNode *&C);

//求两个有序集合的交
void InterSect(LinkNode *A, LinkNode *B, LinkNode *&C);

//求两个有序集合的差
void Subs(LinkNode *A, LinkNode *B, LinkNode *&C);

其中 L 和 A 、B、C都是带附加头结点的有序单链表的头指针。 数组a[] 存放创建有序单链表的元素,n为数组长度,其值不超过3000。
裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;    //元素的数据类型

typedef struct LNode {
    ElemType data;        //结点的数据域
    struct LNode *next;    //指向后继结点
} LinkNode;                 //单链表结点类型

//尾插法建立单链表,细节不表
void CreateListR(LinkNode *&L, ElemType a[], int n);

//输出线性表,细节不表
void DispList(LinkNode *L);

//求两个有序集合的并
void Union(LinkNode *A, LinkNode *B, LinkNode *&C);

//求两个有序集合的交
void InterSect(LinkNode *A, LinkNode *B, LinkNode *&C);

//求两个有序集合的差
void Subs(LinkNode *A, LinkNode *B, LinkNode *&C);

int main() 
{
    LinkNode *A, *B, *C;
    int n, m;

    scanf("%d", &n);
    ElemType a[n];
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    scanf("%d", &m);
    ElemType b[m];
    for (int i = 0; i < m; i++)
        scanf("%d", &b[i]);

    CreateListR(A, a, n);
    CreateListR(B, b, m);

    Union(A, B, C);
    printf("集合A与B的并: ");
    DispList(C);

    InterSect(A, B, C);
    printf("集合A与B的交: ");
    DispList(C);

    Subs(A, B, C);
    printf("集合A与B的差: ");
    DispList(C);

    return 1;
}

/* 请在下面填写答案 */

输入样例:
输入有4行。
第1行为单链表A的元素个数,接下来的一行为单链表A的元素,以空格分隔。
第3行为单链表B的元素个数,接下来的一行为单链表B的元素,以空格分隔。

5
1 2 3 4 5
3
2 4 6
输出样例:
输出有3行。
第1行为集合A与B的并;第2行为集合A与B的交;第3行为集合A与B的差。
元素之间以一个空格分隔,行尾无多余的空格。

集合A与B的并: 1 2 3 4 5 6
集合A与B的交: 2 4
集合A与B的差: 1 3 5
为什么我的代码老是显示段错误?求解答
a.cpp: In function ‘int main()’:
a.cpp:31:7: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);

//求两个有序集合的并
void Union(LinkNode *A, LinkNode *B, LinkNode *&C)
{
    C=(LinkNode*)malloc(sizeof(LinkNode));
    LinkNode *p1,*p2,*p3,*p;
    p1=A->next;
    p2=B->next;
    p3=C;
    while(p1&&p2)
    {
        if(p1->data<=p2->data)
        {
            p=(LinkNode*)malloc(sizeof(LinkNode));
            p->data=p1->data;
            p3->next=p;
            p3=p;
            p1=p1->next;
            if(p1->data==p2->data)
                p2=p2->next;
        }
        else
        {
            p=(LinkNode*)malloc(sizeof(LinkNode));
            p->data=p2->data;
            p3->next=p;
            p3=p;
            p2=p2->next;
        }
    }
    p3->next=p1?p1:p2;
}

//求两个有序集合的交
void InterSect(LinkNode *A, LinkNode *B, LinkNode *&C)
{
    C=(LinkNode*)malloc(sizeof(LinkNode));
    LinkNode *p1,*p2,*p3,*p;
    p1=A->next;
    p2=B->next;
    p3=C;
    while(p1&&p2)
    {
            if(p1->data>p2->data)
                p2=p2->next;
        else if(p1->data<p2->data)
            p1=p1->next;
        else
            {
                p=(LinkNode*)malloc(sizeof(LinkNode));
                p->data=p1->data;
                p3->next=p;
                p3=p;
                p1=p1->next;
                p2=p2->next;
            }
    }
    p3->next=NULL;
}
//求两个有序集合的差
void Subs(LinkNode *A, LinkNode *B, LinkNode *&C)
{
    C=(LinkNode*)malloc(sizeof(LinkNode));
    LinkNode *p1,*p2,*p3,*p;
    p1=A->next;
    p2=B->next;
    p3=C;
    if(p1->data<p2->data)
    {
            p=(LinkNode*)malloc(sizeof(LinkNode));
            p->data=p1->data;
            p3->next=p;
            p3=p;
            p1=p1->next;
    }
    else if(p1->data>p2->data)
        p2=p2->next;
    else {
        p1=p1->next;
        p2=p2->next;
    }
    if(p1)
        p3->next=p1;
    else p3->next=NULL;
}
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-12 18:17
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月12日
  • 已采纳回答 6月4日
  • 创建了问题 3月12日

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!