#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*Linklist;
void initial(Linklist L)
{
    Linklist p;
    p=(Linklist)malloc(sizeof(LNode));
    if(!p) exit(0);
    L=p;
    L->next=NULL;
}
void creatlist(Linklist L)
{
    Linklist p,q;
    int m;
    q=L;
    printf("请输入若干个正整数,输入非正整数时结束:\n");
    while(1)
    {
        scanf("%d",&m);
        if(m>0)
        {
            p=(Linklist)malloc(sizeof(LNode));
            p->data=m;
            q->next=p;
            q=p;
        }
        else break;
    }
    p->next=NULL;
}
void displaylist(Linklist L)
{
    Linklist p=L;
    for(p=L->next;p!=NULL;p=p->next)
        printf("%d  ",p->data);
    printf("\n");
}
void function5(LNode d,LNode e,Linklist f)//求链表D与E的交集
{
    Linklist pd=&d,pe=&e,p,q;
    q=f;
    pd=pd->next;
    for(;pd!=NULL;pd=pd->next)
    {
        pe=&e;
        pe=pe->next;//pro:每次进入内循环pe的指针需要指到链表第一个结点 常见错误:在外循环外面就pe=pe->next,而在内循环中省了初始值for(;pe!=NULL;pe=pe->next)
        for(;pe!=NULL;pe=pe->next)
            if(pd->data==pe->data)
            {
                p=(Linklist)malloc(sizeof(LNode));
                p->data=pd->data;
                q->next=p;            
                q=p;        
            }
    }
            p->next=NULL;
            printf("输出链表D与E的交集的元素:\n");
            displaylist(f);    
            
}
void function7(LNode d,LNode e,Linklist f)//求链表D与E的并集******************************
{
    Linklist pd,pe,pf,pd_last;
    int flag;
    pf=f;
    pf->next=d.next;
    while(pf->next!=NULL)//pf指到链表D的末尾
        pf=pf->next;
    pd_last=pf;
    for(pe=e.next;pe!=NULL;pe=pe->next)
    {
        flag=0;
        pd=&d;
        do
        {
            pd=pd->next;
            if(pd->data==pe->data)//将指定的E链表中的值与D链表中的每个值比
            { 
                flag=1;
                break;
            }
        }while(pd!=pd_last);
        if(flag==0)
        { 
            pf->next=pe;
            pf=pe;
        }
    }
    pf->next=NULL;
    printf("输出链表D与E的并集的元素:\n");
    displaylist(f);
}
void function8(Linklist d,LNode e)//
{
    Linklist pd,pg,p,q;
    LNode g;
    int flag,i,k;
    function5(*d,e,&g);
    for(pg=g.next;pg!=NULL;pg=pg->next)
    {
        flag=1;
        k=0;//******************************
        for(pd=d->next;pd!=NULL;pd=pd->next)
        {    
            if(pg->data==pd->data)
            {
                flag=0;
                break;
            }
                k++;//*******放在if语句后
        }
            if(!flag)//删除操作
            {
                for(p=d,i=0;i<k;i++)//
                    p=p->next;
                pd=p;//pro:记录下前驱指针
                q=pd->next;
                pd->next=q->next;
            }
    }
    printf("输出链表D与E的补集的元素:\n");
    displaylist(d);
}
void main()
{ 
    LNode D,E,F;
    initial(&D);
    creatlist(&D);
    printf("输出链表D中的元素:\n");
    displaylist(&D);
    initial(&E);
    creatlist(&E);
    printf("输出链表E中的元素:\n");
    displaylist(&E);
    initial(&F);
    function5(D,E,&F);    
    initial(&D);
    creatlist(&D);
    printf("输出链表D中的元素:\n");
    displaylist(&D);
    initial(&E);
    creatlist(&E);
    printf("输出链表E中的元素:\n");
    displaylist(&D);
    initial(&F);
    function7(D,E,&F);
    initial(&D);
    creatlist(&D);
    printf("输出链表D中的元素:\n");
    displaylist(&D);
    initial(&E);
    creatlist(&E);
    printf("输出链表E中的元素:\n");
    displaylist(&D);
    function8(&D,E);
}