去链表交集
#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;
#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;
}