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

我是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);
}
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
。即使在释放内存后,仍然可以错误地访问内存