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;
}