1

我是 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);
}
4

2 回答 2

1
(temp->next)->prev=NULL;

这一行使你的新头的 prev 指针为 NULL。这样当您的链表中的第二个项目成为新的头时:

*head = temp->next;

它没有 prev 指针,因此是新的头。

于 2013-02-17T02:55:40.200 回答
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.

提示:如果您像我一样挑剔,您可能希望在释放它后立即分配tempNULL它。这确保您永远不会错误地访问temp其余代码。即使在释放内存后,仍然可以错误地访问内存。

于 2013-02-17T08:51:48.660 回答