C 理解添加到链接列表的前面

C 理解添加到链接列表的前面,c,data-structures,linked-list,nodes,C,Data Structures,Linked List,Nodes,假设我有这样一个列表: [1]-> [2]-> [3]-> [4]-> [5]->NULL 其中1的值为头部,5的值为尾部。 下面是示例代码: 我不明白的是这一行(在addtoFront函数中) 这是我得到的。 ptr->value=input 此行使用给定值初始化名为指针的节点 `ptr->next = head;` 这一行将新项目的下一个指针(插入前面)设置为前一个标题,因此我们有如下内容: 在前面插入[9],以便: [9] (new head po

假设我有这样一个列表:

[1]-> [2]-> [3]-> [4]-> [5]->NULL
其中1的值为头部,5的值为尾部。 下面是示例代码:

我不明白的是这一行(在addtoFront函数中)

这是我得到的。
ptr->value=input

此行使用给定值初始化名为指针的节点

`ptr->next = head;` 
这一行将新项目的下一个指针(插入前面)设置为前一个标题,因此我们有如下内容:

在前面插入[9],以便:

[9] (new head points to old head)
[9] -> [1] (9's next pointer points to 1)
我不明白的是这句话:

head = ptr; 
读这篇文章让我感到困惑,因为我将其解释为将两个节点设置为彼此相等,即[1]变为[9],因此我们有两个节点是[9],
[9]->[9]->[2]->[3]->[4]->[5]->NULL

但事实显然并非如此


一旦他们没有箭头符号
->
,我似乎就完全迷失在正在发生的事情中(对于当前的大多数函数)。任何帮助都将不胜感激

这里的问题是,您考虑的指针是具体实例,而不是指向内存位置的实际指针

在您引用的问题中,head是指向包含节点实例的内存位置的指针

代码:
水头=ptr

正在更新磁头指向的内存位置,而磁头的原始位置现在包含在ptr->next中

要获取head的实际节点值,需要取消对指针的引用:

*head
例如,给定一个指向内存位置8的链表头,其中包含一个值为“a”的节点实例和一个新的输入“b”:

在执行您指向的代码之前:

  • 水头==8
  • 头->值=='a'
  • head->next=NULL
  • ptr==12//这是我从调用malloc返回的任意内存位置
  • ptr->value==“b”
  • ptr->next=NULL 执行突出显示的代码块后:

  • 水头=12
  • 头部->值=='b'
  • head->next=8
  • 头部->下一步->值==“a”
  • head->next->next==NULL
  • ptr==12
  • ptr->value==“b”
  • ptr->next=NULL
    这里的问题是,您将指针视为具体实例,而不是内存位置的实际指针

    在您引用的问题中,head是指向包含节点实例的内存位置的指针

    代码:
    水头=ptr

    正在更新磁头指向的内存位置,而磁头的原始位置现在包含在ptr->next中

    要获取head的实际节点值,需要取消对指针的引用:

    *head
    
    例如,给定一个指向内存位置8的链表头,其中包含一个值为“a”的节点实例和一个新的输入“b”:

    在执行您指向的代码之前:

  • 水头==8
  • 头->值=='a'
  • head->next=NULL
  • ptr==12//这是我从调用malloc返回的任意内存位置
  • ptr->value==“b”
  • ptr->next=NULL 执行突出显示的代码块后:

  • 水头=12
  • 头部->值=='b'
  • head->next=8
  • 头部->下一步->值==“a”
  • head->next->next==NULL
  • ptr==12
  • ptr->value==“b”
  • ptr->next=NULL
    假设您有这样一个链表:

     H         T
    [3]->[2]->[1]->NULL
    
    我们想在前面(头部侧)插入一个元素为
    4
    的节点。首先,我们需要在一旁创建一个新节点,由
    ptr
    指向:

    ptr      H         T
    [4]     [3]->[2]->[1]->NULL
    
    然后我们需要将其链接到列表的标题:

    ptr->next = head
    
    ptr      H         T
    [4]---->[3]->[2]->[1]->NULL
    
    最后但并非最不重要的一点是,我们需要更新head指针以指向列表的新开头,因为现在它将指向列表中的第二个元素,而不是第一个元素
    ptr
    现在指向列表中新的第一个元素

    head = ptr;
    
    ptr
     H              T
    [4]->[3]->[2]->[1]->NULL
    

    然后,插入就完成了。

    假设您有这样一个链表:

     H         T
    [3]->[2]->[1]->NULL
    
    我们想在前面(头部侧)插入一个元素为
    4
    的节点。首先,我们需要在一旁创建一个新节点,由
    ptr
    指向:

    ptr      H         T
    [4]     [3]->[2]->[1]->NULL
    
    然后我们需要将其链接到列表的标题:

    ptr->next = head
    
    ptr      H         T
    [4]---->[3]->[2]->[1]->NULL
    
    最后但并非最不重要的一点是,我们需要更新head指针以指向列表的新开头,因为现在它将指向列表中的第二个元素,而不是第一个元素
    ptr
    现在指向列表中新的第一个元素

    head = ptr;
    
    ptr
     H              T
    [4]->[3]->[2]->[1]->NULL
    
    现在,插入已完成。

    以下是详细信息:

    您的指针如下所示:

    头部->下一个->下一个->下一个->尾部

    ptr->value = input;
    
    现在看起来是这样的:

    头部->下一步->下一步->尾部->空

    head = ptr;
    

    ptr->null

    在这一点上,你基本上有两个列表

    ptr->next = head;  // Point next value to the previous head
    
    现在,您将附加两个列表:

    ptr->head->next->next->next->tail->null

    head = ptr;
    
    现在你要确保你所说的
    head
    指向新的块而不是旧的块

    头部(以前的ptr)->next(以前的头部)->next->next->next->tail->null

    head = ptr;
    
    现在,您已将该新值插入列表的前面。

    以下是详细信息:

    您的指针如下所示:

    头部->下一个->下一个->下一个->尾部

    ptr->value = input;
    
    现在看起来是这样的:

    头部->下一步->下一步->尾部->空

    head = ptr;
    

    ptr->null

    在这一点上,你基本上有两个列表

    ptr->next = head;  // Point next value to the previous head
    
    现在,您将附加两个列表:

    ptr->head->next->next->next->tail->null

    head = ptr;
    
    现在你要确保你所说的
    head
    指向新的块而不是旧的块

    头部(以前的ptr)->next(以前的头部)->next->next->next->tail->null

    head = ptr;
    

    现在,您已经将该新值插入到列表的前面。

    头始终指向第一个节点,因此当您