我是C的新手,我正在尝试学习链表,有人能给我解释一下下面的代码吗。我理解其中的一部分,但不是全部。
void deletefrombeginning( node **head, node **tail)
{
node *temp;
if(*head==NULL)
return;
temp=*head;
if(*head==*tail)
*head=*tail=NULL;
else
{
(temp->next)->prev=NULL; <-- there is where i get lost.
*head=temp->next;
}
free(temp);
}
(temp->next)->prev=NULL;
这一行使新头的prev指针为NULL。这样,当你链接列表中的第二个项目成为新的标题时:
*head = temp->next;
它没有prev指针,因此是新的头。
------ ------
| | <--prev--- | |
NULL <----- | temp | | node | -----> ...
| | ---next--> | |
------ ------
简短回答:
(temp->next)->prev=NULL;
确保node->prev
不会访问无效内存- CCD_ 3使CCD_
长答案:
- 您目前在
temp
- 不能先删除
temp
,因为这样会断开链接(node->prev
指向什么?) - 这意味着您必须首先删除与
temp
相关的链接 - 由于
temp
是第一个节点,所以temp->prev
应该指向NULL
- 因此
(temp->next)->prev=NULL;
与node->prev = NULL;
是等价的 - 我们不能直接做
node->prev = NULL;
,因为我们不知道node
在这一点上存在 *head=temp->next
确保新的列表头是node
(在我上面的ascii演示中)- 接下来的步骤释放
temp
使用的内存
提示:如果你像我一样挑剔,你可能想在释放temp
后立即将其分配给NULL
。这可以确保你在代码的其余部分永远不会错误地访问temp
。即使在释放内存后,仍然可以错误地访问内存。