已知a、b和c三个递增有序的链表,现在要求对a做如下操作:删除其中既即在b中出现又在c中出现的元素(注意同一表中的元素有可能重复)。
输入:
先在第一行输入3个小于100的正整数m,n,l分别表示链表a,b,c的长度,然后在第二行输入m个递增的正整数,第三行输入n个递增的正整数,第四行输入l个递增的正整数,分别为这三个链表的元素,
输出:
按顺序输出删除元素后的链表a的值,每个元素占一行。
输入样例:
3 8 5
23 47 88
2 5 7 9 47 47 88 99
10 20 30 40 47
输出样例:
23
88
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}LNode;
LNode *Creat_LinkList(int n)
{
LNode *p,*q,*head;
int x;
head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
p=head;
q = p;
while(n--)
{
scanf("%d",&x);
p = (LNode*)malloc(sizeof(LNode));
p ->data = x;
p ->next = NULL;
q ->next = p;
q = p;
}
return head;
}
void print(LNode *h)
{
LNode *p;
p = h->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p= p->next;
}
}
void Differ_LinkList(LNode *head)
{
LNode *p;
p=head;
while(p->next!=NULL)
{
if(p->data == (p->next)->data)
{
p->next = (p->next)->next;
}
else p=p->next;
}
}
void Del_LinkList(LNode *head,int x)
{
LNode *p;
p = head;
while(p->next!=NULL)
{
if((p->next)->data == x)
{
p->next = (p->next)->next;
}
p=p->next;
}
}
void Deal_LinkList(LNode *a,LNode *b,LNode *c)
{
LNode *p;
while(b->next!=NULL)
{
p = c;
while(p->next!=NULL)
{
if((b->next)->data == (p->next)->data)
{
Del_LinkList(a,(b->next)->data);
}
p = p->next;
}
b=b->next;
}
}
int main()
{
LNode *a,*b,*c;
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a = Creat_LinkList(x);
b = Creat_LinkList(y);
c = Creat_LinkList(z);
Differ_LinkList(b);
Differ_LinkList(c);
Deal_LinkList(a,b,c);
print(a);
return 0;
}