链表元素的比较和删除

已知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 
#include 
#include 

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

你可能感兴趣的:(链表元素的比较和删除)