链表a,b,删去a链表中和b重复学号的信息,我其他情况下输出结果都正常,唯独a的头节点不变的情况下,剩下的信息删除不完全,例如下面图里面的情况。

img


代码部分:
#include<stdio.h>
#include<string.h>
#define N 3
struct stu
{
int num;
char name[7];
struct stu *next;
}a[N],b[N];
int main()
{
void del(struct stu **head1,struct stu **head2);
struct stu a[N]={{2,"t"},{4,"t"},{5,"t"}};
struct stu b[N]={{1,"t"},{4,"t"},{5,"t"}};
struct stu *head1,*head2,*p1;
int i;
head1=a;
head2=b;
for(p1=head1,i=1;i<=N;i++)
{
if(i<N)
p1->next=a+i;
else p1->next=NULL;
printf("%d,%s\n",p1->num,p1->name);
if(i<N)
p1=p1->next;
}
p1->next=NULL;
for(p1=head2,i=1;i<=N;i++)
{
if(i<N)
p1->next=b+i;
else p1->next=NULL;
printf("%d,%s\n",p1->num,p1->name);
if(i<N)
p1=p1->next;
}
p1->next=NULL;
del(&head1,&head2);
return 0;
}
void del(struct stu **head1,struct stu **head2)
{
struct stu *p,*i,*j;
for(i=*head1;i!=NULL;p=i,i=i->next)
for(j=*head2;j!=NULL;j=j->next)
{
if(i==*head1&&i->num==j->num)
{*head1=(*head1)->next;
break;}
if(i!=NULL&&i->num==j->num)
{p->next=i->next;
break; }

}

p=*head1;
printf("the new:\n");
while(p!=NULL)
{
   printf("%d,%s\n",p->num,p->name);
   p=p->next;
}

}