大佬们为什么我的链表只能删除开头,删除不了中间?

从a链表中删除与b链表中有相同学号的节点

struct student *delete(struct student *p1,struct student *p2)
{
    struct student *head1,*head2,*p3,*temp;
    for(head1=p3=p1;p1!=NULL;p1=p1->NEXT){
        for(head2=p2;p2!=NULL;p2=p2->NEXT){
            if(p1->num==p2->num){
                if(p1==head1){
                    head1=head1->NEXT;
                }else{
                    temp=p1;
                    p3->NEXT=p1->NEXT;
                    free(temp);
                    p1=p3;
                    printf("here\n");
                }
            }
        }
        p3=p1;
    }
    return head1;
}

这一段有问题