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