还是对头节点只赋值0,并未删除
时间: 2024-03-13 20:44:58 浏览: 14
非常抱歉,我的回答又有误。在这段代码中,删除头节点的实现方式是将头节点的数据清零,并将头节点的指针指向下一个节点,而不是将头节点的指针赋值为 NULL。
具体实现是将头节点的下一个节点作为新的头节点,然后将原头节点的数据清零。这样就相当于删除了原头节点,同时也保证了链表的连续性和完整性。
以下是更正后的代码:
```
struct Student* del(struct Student* head, int k) {
struct Student* p = head;
struct Student* q = NULL;
// 找到要删除的节点
while (p != NULL && p->num != k) {
q = p;
p = p->next;
}
if (p == NULL) {
// 要删除的节点不存在,直接返回原头节点
return head;
} else if (p == head) {
// 要删除的节点是头节点
head = head->next;
memset(p, 0, sizeof(struct Student));
return head;
} else {
// 要删除的节点不是头节点
q->next = p->next;
memset(p, 0, sizeof(struct Student));
return head;
}
}
```
这段代码的作用是删除链表中学号为 k 的节点,输入参数为链表头指针 head 和要删除的节点的学号 k,返回值为删除节点后的新链表头指针。
首先定义了两个指针 p 和 q,将 p 指向链表头节点。然后通过 while 循环来查找要删除的节点,如果找到了则执行删除操作,否则直接返回原头节点。
如果要删除的节点是头节点,将头指针指向下一个节点,将原头节点的数据清零,然后返回新的头指针。如果要删除的节点不是头节点,则修改前一个节点的 next 指针指向要删除节点的下一个节点,将被删除节点的数据清零,然后返回原头指针。
在删除节点时,使用了 memset() 函数将被删除节点的数据清零,以避免内存泄漏。