c需要链表删除程序怎么理解

能帮我看一下下面的删除操作怎么理解吗
void Delete(pnode pHead)
{
pnode p = pHead;
int i = 0;
int loc;
printf("请输入你需要删除的学生的编号:");
scanf("%d",&loc);
while(NULL!=p->pnext&&i<loc-1)
{
p=p->pnext;
i++;
}
if(NULL==p->pnext||i>loc-1)
{
printf("没找到需要删除的学生的编号!\n");
return;
}
pnode q=p->pnext;
p->pnext=q->pnext;
free(q);
q==NULL;
printf("你已经成功删除了第%d个学生的信息!\n",loc);
}

1、通过循环while(NULL!=p&&i<loc-1)查找插入的位置对应的前节点p
2、如果找到p进行删除操作
pnode q=p->pnext; // 先将p的子节点pnext(待删除节点)赋值给q
p->pnext=q->pnext; // 将q(待删除节点)的子节点pnext赋值给p的子节点pnext 完成删除
free(q); // 释放已删除节点q
q==NULL; // 将已删除节点置为空

一句话,找到待删结点的前置结点p,让q = p->next ; 即 q 指向的就是待删结点,再行删除之事。