【问题描述】已知A,B和C为三个非递减有序的线性表,现要求对A表做如下操作:删去那些既在B表中出现又在C表中

出现的元素.试对顺序表编写实现上述操作的算法(注意题中并没有特别指明同一表中的元素值各不相同).  注意此

题用顺序表编写程序.

【输入形式】第一行为A表,第二行为B表,第三行为C表,分别以-1结束

【输出形式】删除后的A表

【样例输入】1 3 5 5 7 -1

                      2 4 5 6 8 -1

                      5 6 7 9 -1
【样例输出】1 3 7



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

#define listsize 100

typedef int elemtype;
typedef struct
{
elemtype *elem;
int length;
int size;
}sqlist;
void Initlist(sqlist &l)
{
l.elem=(elemtype *)malloc(listsize*sizeof(elemtype));
if(!l.elem)
exit(-1);

l.length=0;
l.size=listsize;
}

void creatlist(sqlist &l)
{
int i=0,m;
while(1)
{
scanf("%d",&m);
if(m<0)
break;
l.elem[i]=m;
i++;
}
l.length=i;
}


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


void deletelist(sqlist &l,elemtype e)
{
int i;
elemtype *p,*q;
for(i=0;i<l.length;i++)
{
//查找
if(l.elem[i]==e)
{
p=&(l.elem[i]);
//找到节点的位置 q
q=l.elem+l.length-1;
//移动->线性表的删除
for(++p;p<=q;p++)
*(p-1)=*p;
//长度减一
l.length--;
i--;
}
}

}


void searchlist(sqlist &la,sqlist lb,sqlist lc)
{
int i,j;

for(i=0;i<lb.length;i++)
{
for(j=0;j<lc.length;j++)
{
//查找
if(lb.elem[i]==lc.elem[j])
//在la中删除la、lb中公有的值
deletelist(la,lb.elem[i]);
}
}
}

int main()
{
sqlist A,B,C;

Initlist(A);
Initlist(B);
Initlist(C);

creatlist(A);
creatlist(B);
creatlist(C);

searchlist(A,B,C);
show(A);

return 0;
}