【计导作业】链表——差集与交集

题目

问题描述:已知有两个递增的正整数序列A和B,序列中元素个数未知,同一序列中不会有重复元素出现,有可能某个序列为空。你的任务是求这两个序列的差集A-B与交集A+B。A-B就是仅由在A中出现而不在B中出现的元素所构成的集合,设为C1;A+B就是既在A中出现也在B中出现的元素所构成的集合,设为C2。

要求:

建立四个单链表,分别为A、B、C1、C2,并使用A、B这两个链表存储两个正整数序列,然后将集合A-B中的元素存储在链表C1中,将集合A+B中的元素存储在链表C2中。正整数序列的输入是按照递增顺序输入的,用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。在程序结束前要释放链表A、B、C1、C2中的所有节点。

输入与输出要求:依次输入两个递增的正整数序列A和B,序列元素的个数未知,但以输入“-1”结束,每个正整数序列占一行。输出链表C1中的元素,占一行;然后是链表C2中的元素,占一行。每行的每个元素后有一个空格,注意最后一个元素后只有换行符,如果某个链表为空则,则输出“There is no item in XX list.”。

程序运行效果:

Sample 1:

Please input the elements of list A:1 2 3 4 5 6 7 -1

Please input the elements of list B:2 3 6 -1

输出

The list C1:1 4 5 7

The list C2:2 3 6

Sample 2:

Please input the elements of list A:-1

Please input the elements of list B:-1

输出

There is no item in C1 list.

There is no item in C2 list.

分析

又是单链表,把一个节点插入到另一个链表里都要重新申请过空间。因为作业要求注释,所以我写注释写得好~详细啊。

/*
    天啦噜,今天去欢乐谷玩得好嗨啊,虽然当了好久的大功率电灯泡,不过后来玩得好棒~
    晚上回来做上机题时,总觉得自己在过山车上失重着,这感觉好持久啊 →_→
*/
#include<stdio.h>
typedef struct List
{
    int v;
    struct List *next;
} list;

list *A,*B,*C1,*C2,*p,*HeadA,*HeadB,*HeadC1,*HeadC2,*p1,*p2,*tmp,*tp,*mp;

int main()
{
    int a;

    //读list A
    printf("Please input the element of list A:");
    while(~scanf("%d",&a)&&a!=-1)
    {
        //先申请空间
        p=malloc(sizeof(list));
        if(p!=NULL)
        {
            //申请成功则把节点p插入到A
            p->v=a;
            if(A!=NULL)
                A->next=p;
            else
                HeadA=p;
            A=p;
        }
    }
    if(A!=NULL)//A可能为空
        A->next=NULL;

    //读list B
    printf("Please input the element of list B:");
    while(~scanf("%d",&a)&&a!=-1)
    {
        p=malloc(sizeof(list));
        if(p!=NULL)
        {
            p->v=a;
            if(B!=NULL)
                B->next=p;
            else
                HeadB=p;
            B=p;
        }
    }
    if(B!=NULL)B->next=NULL;

    //开始构建C1
    p1=HeadA;
    p2=HeadB;
    while(p1!=NULL&&p2!=NULL)
    {
        //listA的当前元素比listB的小
        if(p1->v<p2->v)
        {
            //新建节点tp,tp->v为p1的v
            tp=malloc(sizeof(list));
            tp->v=p1->v;

            //tp插入到C1中
            if(C1!=NULL)
                C1->next=tp;
            else
                HeadC1=tp;
            C1=tp;

            //list A考虑下一个元素
            p1=p1->next;
        }
        else if(p1->v==p2->v)
        {
            //两个list都考虑下一个元素
            p1=p1->next;
            p2=p2->next;
        }
        else if(p1->v>p2->v)
            //listB考虑下一个元素
            p2=p2->next;
    }

    //把list A剩余的元素(不可能与list B冲突了)都插入C1
    while(p1!=NULL)
    {
        tp=malloc(sizeof(list));
        tp->v=p1->v;
        if(C1!=NULL)
            C1->next=tp;
        else
            HeadC1=tp;
        C1=tp;
        p1=p1->next;
    }
    if(C1!=NULL)C1->next=NULL;

    //开始构建C2
    p1=HeadA;
    p2=HeadB;
    while(p1!=NULL&&p2!=NULL)
    {
        if(p1->v<p2->v)
            p1=p1->next;
        else if(p1->v==p2->v)
        {
            tp=malloc(sizeof(list));
            tp->v=p1->v;

            if(C2!=NULL)
                C2->next=tp;
            else
                HeadC2=tp;
            C2=tp;

            p1=p1->next;
            p2=p2->next;
        }
        else if(p1->v>p2->v)
            p2=p2->next;
    }
    if(C2!=NULL)C2->next=NULL;

    //开始输出,一边释放C1、C2的内存
    if(HeadC1==NULL)printf("There is no item in C1 list.");
    else
    {
        printf("The list C1:");
        while(HeadC1!=NULL)
        {
            tmp=HeadC1;
            printf("%d ",tmp->v);
            HeadC1=HeadC1->next;
            free(tmp);
        }
    }

    if(HeadC2==NULL)printf("\nThere is no item in C2 list.");
    else
    {
        printf("\nThe list C2:");
        while(HeadC2!=NULL)
        {
            tmp=HeadC2;
            printf("%d ",tmp->v);
            HeadC2=HeadC2->next;
            free(tmp);
        }
    }

    //释放listA和listB的内存
    while(HeadA!=NULL)
    {
        tmp=HeadA;
        HeadA=HeadA->next;
        free(tmp);
    }
    while(HeadB!=NULL)
    {
        tmp=HeadB;
        HeadB=HeadB->next;
        free(tmp);
    }
    return 0;
}

  

时间: 2024-08-12 10:53:28

【计导作业】链表——差集与交集的相关文章

【计导作业】——商品记录

题目 问题描述:有一家商店,为了查看店里有些什么商品.数量有多少以及每件商品的价格如何,需要编制一份商品目录.每种商品都包括4种属性:商品ID.商品名.数量与价格.商品ID为0—99之间的整数,每种商品的ID号互不相同,所以这里默认只有100种商品:商品名只包含大小写字母与空格,长度不超过35个字符:商品数量的范围是0—99999:商品的价格为一个非负的浮点数. 你要帮助商店设计一个二进制文件,存储该商店的所有商品情况.下表为该商店商品清单的样例. 记录号(商品ID) 商品名 数量 价格 5 L

Sql Server中集合的操作(并集、差集、交集)学习

首先我们做一下测试数据 1.创建测试数据 --创建人员表1-- create table Person1 ( Uid int identity(1,1) primary key, Name varchar(20) not null ) --创建人员表2-- create table Person2 ( Uid int identity(1,1) primary key, Name varchar(20) not null ) --插入数据-- insert into Person1 values

Silverlight项目笔记6:Linq求差集、交集&amp;检查网络连接状态&amp;重载构造函数复用窗口

一.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所以需要通过对数据中心以及系统现有用户信息进行比较,分为三部分: (1) Linq取差集,找出需要删除的用户数据,进行删除(USERNAME为唯一值字段). 使用的是Except这个方法. (2)使用Linq提供的Intersect方法,取得两个用户集合的交集,遍历检查进行更新. (3)同样再次取差集

Programming Ability Test学习 2-12. 两个有序链表序列的交集(20)

2-12. 两个有序链表序列的交集(20) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 8000 B 判题程序 Standard 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3. 输入格式说明: 输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列).数字用空格间隔. 输出格式说明: 在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格:若新链表为空,输出“NULL”. 样例输入与

2-12. 两个有序链表序列的交集(20) (ZJUPAT 用vector实现)

题目链接:http://pat.zju.edu.cn/contests/ds/2-12 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3. 输入格式说明: 输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列).数字用空格间隔. 输出格式说明: 在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格:若新链表为空,输出"NULL". 样例输入与输出: 序号 输入 输出 1 1 2 5 -1 2 4

SQL 操作结果集 -并集、差集、交集、结果集排序

操作结果集 为了配合测试,特地建了两个表,并且添加了一些测试数据,其中重复记录为东吴的人物. 表:Person_1魏国人物 表:Person_2蜀国人物 A.Union形成并集 Union可以对两个或多个结果集进行连接,形成“并集”.子结果集所有的记录组合在一起形成新的结果集.  1.限定条件 要是用Union来连接结果集,有4个限定条件. (1).子结果集要具有相同的结构. (2).字结果集的列数必须相同. (3).子结果集对应的数据类型必须可以兼容. (4).每个子结果集不能包含order

两个DataTable之间的差集、交集、并集集合(Except、Intersect、Union)

//获取第一个数据源DataTable DataTable dt1 = DBHelper.GetDataTable("select top 10  ksdid,user_id,user_pwd from ksd_user_info"); IEnumerable<DataRow> query1 = dt1.AsEnumerable().Where(t => t.Field<string>("user_id").StartsWith(&qu

PHP 数组函数 数组中的差集和交集

array_diff( $arr , $arr2[--] )  返回一个数组,该数组包括了所有在$arr1 但是不在任何其他参数数组中的值,键名不变 array_diff_uassoc( $arr ,$arr2 ,[--] , 'cmp_function') 用回调函数做索引比较数组中的差集 array_diff_assoc( $arr , $arr2[--] ) 返回一个数组,$arr 与其他数组的差集 同时比较键名  索引不变 array_udiff( $arr , $arr2 [--] ,

python比较两个list之间的差异、相同(差集、交集、并集)

初始化数据 listA = ['zhangsan', 'lisi', 'wangwu'] listB = ['zhangsan', 'lisi', 'zhaoliu'] 1.取差集1.1.listA对应listB的差集 set(listA).difference(set(listB)) ----- set(['wangwu']) 1.2.listB对应listB的差集 set(listB).difference(set(listA)) ----- set(['zhaoliu']) 2.取交集 s