c-链表说明



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

相关内容

  • 没有找到相关文章

最新更新