去链表交集

#include <stdio.h>
#include <stdlib.h>
#define la 4
#define lb 5
/* 去交集*/


struct student{
int num;
char name[8];
struct student *next;
}a[la],b[lb];


int main(int argc, char *argv[]) {
//进行赋值的过程 
struct student a[la]={{101,"wang"},{102,"li"},{103,"zhang"},{106,"wei"}};
struct student b[lb]={{103,"zhang"},{104,"Ma"},{105,"chen"},{107,"guo"},{108,"lui"}};
struct student *head1,*head2,*p1,*p2,*p;
head1=a;
head2=b;
int i;
//p2=head2->next;
printf("list A:\n");
for(p1=head1,i=1;i<la;i++)
{
p1->next=a+i; //进行一个个结点的赋值 
printf("%d,%s\n",p1->num,p1->name);
p1=p1->next; // 指向下一个,一个接着一个 
}
printf("%d,%s\n\n",p1->num,p1->name);
p1->next=NULL;
head1->next=p1; //head1的下一个进行赋值成为p1,即是连接成了一整个链表 
printf("list B:\n"); //list b input 
for(p2=head2,i=1;i<lb;i++)
{
p2->next=b+i;
printf("%d,%s\n",p2->num,p2->name); 
p2=p2->next;

printf("%d,%s\n",p2->num,p2->name);
p2->next=NULL;
head2->next=p2; //建立链表进行连接 
p1=head1; //将p1指向head1 
p2=head2; //将p2指向head2 
while(p1) //当p1不为空时 
{
p2=head2;  //每一次有p1和p2链表的数有等于的时候,或者p2的下一个结点为空,意思是p2到了最后一个结点。故p2再次指向head2 
while((p1->num!=p2->num)&&(p2->next)) //当没有找到p1和p2里面相等的数的时候,并且p2链表还没有遍历完的时候 
{
p2=p2->next; //p2=p2->next p2等于p2的下一个 
}
if(p1->num==p2->num) //当p1等于p2的数的时候,即满足第一个条件 
{
if(p1==head1)   // 如果p1为头结点和p2的数字相等的话 
{
head1=p1->next;//则头节点指向p1->next  
p1=head1; //p1指向头结点 
}
else
{
p->next=p->next->next; //跳过数字相等的这个 
p1=p1->next;//p1指向下一个 
}

}
    else//p2遍历完毕 
{
p=p1;// p指向p1 而p1指向p1的下一个 。再进行新的循环 
p1=p1->next;
}


    }
    printf("\nresult:\n");
    p1=head1;
    while(p1)
    {
    printf("%d,%s\n",p1->num,p1->name);
    p1=p1->next;
    } 
return 0;

}

去链表交集