您的位置:首页 > 其它

链表元素的比较和删除

2016-03-16 00:09 344 查看
已知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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: