我是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);
}
答案 0 :(得分:1)
(temp->next)->prev=NULL;
这一行正在使你的新头部的指针为NULL。因此,当链接列表中的第二项成为新头时:
*head = temp->next;
它没有上行指针,因此是新头。
答案 1 :(得分:0)
------ ------
| | <--prev--- | |
NULL <----- | temp | | node | -----> ...
| | ---next--> | |
------ ------
简答:
(temp->next)->prev=NULL;
确保node->prev
没有
访问无效内存。*head=temp->next;
使temp
成为新列表的负责人。答案很长:
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
。即使释放内存,仍然可以错误地访问内存。