链接列表说明

时间:2013-02-17 02:51:21

标签: 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)->prev=NULL;  <-- there is where i get lost.
          *head=temp->next;
       }
        free(temp);
}

2 个答案:

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