c语言程序设计动态链表删节点问题

这段代码想用来删除链表中的节点,但是不能删除第一个节点的数据,其他的可以删除,希望帮忙改一下。
代码如下
img

struct Student *p1=head,*p2=NULL;

head头节点别使用即可,就是head->next才是第一个节点
bool delete(struct Student *head)
{
struct Student *p1=head, p2;
while(p1->next&&p1->next->num!=b) p1=p1->next;
if(!p1->next) return false;//没有找到该学号
p2=p1->next;
p1->next=p2->next;
free(p2);
return true;
}

需要创建一个虚拟节点,虚拟节点next指向第一个节点(头节点),如果需要删除头节点则虚拟节点->next=虚拟节点>next->next,返回虚拟节点->next即可