交并集问题

 

Description

已知A,B,C为三个元素值递增有序的线性表,要求对表A如下运算:删去那些既在表B中出现又在表C中出现的元素。线性表以顺序结构,编写实现上述运算和算法。

Input

第一行输入三个正整数m,n,用空格隔开,分别表示三个线性表的元素个数,其后三行依次输入ABC表中的元素。

Output

输出实现上述操作后的A表。

Sample Input

 

 

 

 

8 5 6

1 2 3 4 5 6 6 7

2 3 5 9 12                      

2 4 5 6 12 13

 

 

 

Sample Output

1 3 4 6 6 7  

 

 
 
#include<stdio.h>
#include<malloc.h>

typedef int ElemType;
typedef int status;
# define LIST_INIT_SIZE 100
# define OK 1
# define OVERFLOW -1


typedef struct{
    ElemType *elem;
    int length;
    int listsize;
} SqList;

//初始化线性表
status InitList_Sq(SqList *l){
    l-> elem  = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    if(!l->elem) exit(OVERFLOW);
    l->length = 0;
    l->listsize = LIST_INIT_SIZE;

    return OK;
}


void Create_sq(SqList *l,int n)
{
    int i;
    l->length=n;
    for(i=0;i<n;i++)
        scanf("%d",&(l->elem[i]));

}


void Disp_sq(SqList l)
{
    int i=0,n;
    n=l.length;
    for(i=0;i<n;i++)
        printf("%d ",l.elem[i]);

}


void Combine_sq(SqList * la,SqList lb,SqList lc)
{
   int i=0,j=0,k=0,m=0;
   int same;
   while(i<la->length&&j<lb.length&&k<lc.length)
    {
        if(lb.elem[j]<lc.elem[k])j++;
        else if(lb.elem[j]>lc.elem[k])k++;
        else
        {
            same=lb.elem[j];//找到了相同的元素SAME
            while(lb.elem[j]==same)j++;
            while(lc.elem[k]==same)k++;//J,K后移到新的元素
            while(i<la->length&&la->elem[i]<same)
              {la->elem[m++]=la->elem[i++];
              }//须保留的元素移动到新的位置
            while(i<la->length&&la->elem[i]==same)i++;//跳过相同的元素
        }
    }
   while(i<la->length)
   {
       la->elem[m++]=la->elem[i++];//A的剩余元素重新存储

   }
   la->length=m;/*先从B和C中找出共有元素,记为SAME,再在A中从当前位置开始,凡小于SAME的元素均保留(存到新的位置),
   等于SAME的就跳过,到大于SAME时就再找下一个SAME*/

}

int main()
{
    int s,t,u;
    SqList la;SqList lb;SqList lc;
    InitList_Sq(&la);
    InitList_Sq(&lb);
    InitList_Sq(&lc);
    scanf("%d%d%d",&s,&t,&u);
    Create_sq(&la,s);
    Create_sq(&lb,t);
    Create_sq(&lc,u);
    Combine_sq(&la,lb,lc);
    Disp_sq(la);
    printf("\n");
    return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值