C 链表说明
我是C语言新手,我正在学习链表,有人能给我解释一下下面的代码吗。 我理解其中的一部分,但不是全部C 链表说明,c,linked-list,C,Linked List,我是C语言新手,我正在学习链表,有人能给我解释一下下面的代码吗。 我理解其中的一部分,但不是全部 void deletefrombeginning( node **head, node **tail) { node *temp; if(*head==NULL) return; temp=*head; if(*head==*tail) *head=*tail=NULL; else { (temp->next
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);
}
void deletefromstart(节点**头部,节点**尾部)
{
节点*温度;
如果(*head==NULL)
返回;
温度=*水头;
如果(*头部==*尾部)
*head=*tail=NULL;
其他的
{
(临时->下一步)->prev=NULL;下一步;
}
免费(临时);
}
这一行将使新头部的上一个指针为空。这样,当链接列表中的第二个项目成为新的标题时:
*head = temp->next;
它没有上一个指针,因此是新的头
这一行将使新头部的上一个指针为空。这样,当链接列表中的第二个项目成为新的标题时:
*head = temp->next;
它没有上一个指针,因此是新的头 ------ ------
| | <--prev--- | |
NULL <----- | temp | | node | -----> ...
| | ---next--> | |
------ ------
-------
| | | |
------ ------
简短回答:
确保(temp->next)->prev=NULL
节点->上一个
节点 访问无效内存
*head=temp->next代码>使
成为列表的新标题temp
长答案:
- 您当前处于
temp
- 您不能先删除
,因为这样会断开链接(temp
指向什么?)node->prev
- 这意味着您必须首先删除与
相关的链接李>temp
- 由于
是第一个节点,temp
应该指向temp->prev
NULL
- 所以
相当于(temp->next)->prev=NULL
node->prev=NULL代码>
- 不能直接做
node->prev=NULL代码>因为我们不知道此时是否存在
节点
确保新列表头是*head=temp->next
(在我上面的ascii演示中)节点
- 然后,下一步将释放
使用的内存temp
提示:如果你像我一样挑剔,你可能想在释放
temp
后立即将其分配给NULL
。这确保您永远不会错误地访问代码其余部分中的temp
。即使在释放内存后,仍然可以错误地访问它。-------
| | | |
------ ------
简短回答:
确保(temp->next)->prev=NULL
节点->上一个
节点 访问无效内存
*head=temp->next代码>使
成为列表的新标题temp
长答案:
- 您当前处于
temp
- 您不能先删除
,因为这样会断开链接(temp
指向什么?)node->prev
- 这意味着您必须首先删除与
相关的链接李>temp
- 由于
是第一个节点,temp
应该指向temp->prev
NULL
- 所以
相当于(temp->next)->prev=NULL
node->prev=NULL代码>
- 不能直接做
node->prev=NULL代码>因为我们不知道此时是否存在
节点
确保新列表头是*head=temp->next
(在我上面的ascii演示中)节点
- 然后,下一步将释放
使用的内存temp
提示:如果你像我一样挑剔,你可能想在释放
temp
后立即将其分配给NULL
。这确保您永远不会错误地访问代码其余部分中的temp
。即使在释放内存后,仍然可以错误地访问内存