/*单链表的删除删除那些A中的既在B中存在又在C中存在的元素
例如A 1 2 3 4 5 6 6 7
B 2 3 5 9 12
C 2 4 5 6 12 13*/
//具体的格式可以从数据结构C语言描述p51 p53合并两个有序的单链表得到启示。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node*next;
}Node,*LinkList;
void create(LinkList*l,int n)
{
LinkList p,s;
p=*l=(LinkList)malloc(sizeof(Node));
for(;n>0;n--)
{
s=(LinkList)malloc(sizeof(Node));
scanf("%d",&s->data);
p->next=s,p=s;
}
p->next=NULL;
}
void shuchu(LinkList l)
{
LinkList p=l->next;
while (p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
LinkList shanchu( LinkList la,LinkList lb,LinkList lc)
{ Node*pa;
Node*pb;
Node*pc;
Node*pd;
pa=la->next;
pb=lb->next;
pc=lc->next;
pd=la;
while(pa&&pb&&pc)
{
while(pb&&pb->data<pa->data)
pb=pb->next;
while(pc&&pc->data<pa->data)
pc=pc->next;
if(pb&&pc)
{
if(pa->data==pb->data&&pa->data==pc->data)
{
while(pa&&pa->data==pb->data)
{
pd->next=pa->next;
free(pa);
pa=pd->next;
}
pb=pb->next;
pc=pc->next;//删去A中出现的B中和集合C中重复的元素,并使指向ABC各链表的指针向后移动一个位置
}
else if(pa->data!=pb->data&&pa->data!=pc->data)
{
pd=pa;
pa=pa->next;
}
else if(pa->data==pb->data)
{
pb=pb->next;
pd=pa;
pa=pa->next;
}
else if(pa->data==pc->data)
{
pc=pc->next;
pd=pa;
pa=pa->next;
}
}
}
return(la);//需要返回A链表
}
int main()
{
LinkList la,lb,lc;
int n,m,q;
la=(LinkList)malloc(sizeof(Node));
scanf("%d%d%d",&n,&m,&q);
create(&la,n);
create(&lb,m);
create(&lc,q);
shuchu(shanchu(la,lb,lc));
return 0;
}