c - 在理解 C 中的链表代码方面需要帮助

标签 c pointers linked-list double-pointer

以下代码是我从linus on understanding pointers得到的.

typedef struct list_entry {
   int val;
   struct list_entry *next;
} list_entry;    


list_entry **pp = &head; /* pointer to a pointer */
list_entry *entry = head;

while (entry) {
    if (entry->val == to_remove)
        *pp = entry->next;            //6      

    pp = &entry->next;                //8   
    entry = entry->next;
} 

谁能帮助理解第 6 行和第 8 行?如果 entry->val == to_remove,第 6 行被求值,*pp 成为移除后的下一个条目,那么第 8 行在那之后做什么?当前条目已被删除,如何在第 8 行重新使用此条目?

另外,我理解*pp是指指针pp的值,&entry->next是指pp的地址,总觉得什么时候该用*,什么时候该用&,总觉得很迷茫。具体来说,第6行可以是:

pp = &entry->next; 

第 8 行是:

*pp= entry->next; 

如果不是,为什么?

最佳答案

更新:

博客中的代码是不完整的,并且假设只有一个元素将被删除,并且 free 不是必需的。如果有两个或多个连续元素要删除,序列中的第二个元素将不会被删除。

正确的代码是,它还假定不必释放节点:

while (entry) {
    if (entry->val == to_remove)
        *pp = entry->next;           
    else
        pp = &entry->next;  

    entry = entry->next;
} 

如果你必须释放节点:

while (entry) 
{
    if(entry->value == to_remove  )
    {
        *pp = entry->next;            
        free( entry ) ;
        entry = *pp ;
    }
    else
    {
        pp = &entry->next;               
        entry = entry->next;
    }
} 



写下整个结构确实有助于理解这一点。

struct Node
{
    int val ;
    struct Node* next ; //hint, this has an address too.

} ;

诀窍在声明中

pp = &entry->next ;

这看起来像是指向下一个 节点,但实际上您只是获取当前节点指针的地址。 差别很大!

所以 pp = &entry->next ; 几乎等同于第一个例子中的 prev = entry; ,唯一的区别是你指向当前 struct Node 的成员 next 而不是指向整个当前 struct Node

关于c - 在理解 C 中的链表代码方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26471777/

相关文章:

c - 具有离散建模的图形 : faster?

c - 如何使用 opengl 函数制作用于在 c 中绘制 3D 点的 3D 窗口?

c++ - 这如何打印整个数组?

c++ - 添加到链表或遍历链表时出现问题

c - 如何在 C 中读取一行中的多个单词?

c - 如何实现可移植指针比较和交换?

c++ - 当指针运算用作 C++ 中函数的参数时会发生什么?

c - 使用 free() 释放指针后使用指针

java - 方法的空指针异常

c++ - 内联 STL 类型列表管理器