void Delete_num(STU** p_head, long long num) { STU* pb, * pf;//pb:指定删除的节点,pf:中间节点 pb = pf = *p_head; if (*p_head == NULL)//链表为空,不用删 { printf("链表为空,没有您要删的节点"); return; } while (pb->num != num && pb->next != NULL)//循环找要删除的节点 { pf = pb; pb = pb->next; } if (pb->num == num)//找到了一个节点的num和num相同 { if (pb == *p_head)//要删除的节点是头节点 { //让保存头结点的指针保存后一个结点的地址 *p_head = pb->next; } else { //前一个结点的指针域保存要删除的后一个结点的地址 pf->next = pb->next; } //释放空间 free(pb); pb = NULL; } else//没有找到 { printf("没有您要删除的节点\n"); } }
时间: 2024-04-11 21:30:02 浏览: 12
这段代码是用于删除指定学号的节点的函数Delete_num的定义。
函数的参数包括一个指向指针的指针p_head,表示链表的首地址;num表示要删除的学号。
函数首先定义了两个指针pb和pf,它们分别指向链表的首节点,并且初始化为*p_head。
接着进行判断,如果链表为空(即*p_head为NULL),则输出"链表为空,没有您要删的节点"的提示信息,并返回。
进入循环,当pb结点的学号不等于要删除的学号,并且pb的下一个结点不为空时,继续循环。在循环中,pf保存pb的值,然后将pb指向下一个结点。
循环结束后,判断pb结点的学号是否等于要删除的学号。如果相等,则表示找到了要删除的节点。
接下来进行判断,如果pb是头节点(即pb等于*p_head),则将*p_head指向pb的下一个节点,即让保存头结点的指针保存后一个结点的地址。
否则,将前一个结点pf的next指针指向pb的下一个节点,即前一个结点的指针域保存要删除的后一个结点的地址。
最后,释放pb所指向的节点的空间,将pb置为NULL。
如果循环结束时pb结点的学号不等于要删除的学号,则表示没有找到要删除的节点,输出"没有您要删除的节点"的提示信息。
需要注意的是,函数中使用了free函数释放节点的空间,以及对链表头节点的操作。这些操作需要根据实际情况进行补充。
相关问题
STU **p_head,STU *p_new
根据提供的引用内容,可以看出STU是一个结构体类型,p_head和p_new都是该结构体类型的指针变量。其中p_head指向链表的头节点,p_new则是新创建的节点。在链表中,我们可以通过p_head指针找到整个链表的头部,然后通过遍历链表来访问每个节点。p_new则是在链表中新创建的节点,可以通过指针操作将其插入到链表中。具体的操作可以参考提供的引用内容中的实例代码。
STU **p_head
STU **p_head是一个指向指针的指针,通常用于链表操作中。在引用中,p_head指向链表头指针的地址,通过*p_head可以访问链表头指针,而通过**p_head可以访问链表头指针所指向的节点。在链表操作中,使用STU **p_head可以方便地对链表进行插入、删除等操作。
举个例子,如果要在链表头插入一个新节点,可以使用如下代码:
```c
void insert_node(STU **p_head, STU *new_node) {
new_node->next = *p_head;
*p_head = new_node;
}
```
其中,p_head指向链表头指针的地址,new_node是要插入的新节点。通过new_node->next = *p_head可以将新节点的next指针指向原来的链表头节点,然后通过*p_head = new_node将链表头指针指向新节点,完成插入操作。