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++ - c/c++项目什么时候需要配置文件?

c - 从使用多个 .c 文件生成的 .o 文件创建 .so 文件时出错

java - Java 取消引用是如何工作的?

java - 从Java学C++,尝试做一个链表

java - 在双链表中插入新元素

java - 这个 for 循环如何翻译成英语?

c - GCC 在编译/链接期间确定的符号的值

c - 这个表达代表什么?

c - 为什么可以这样在struct中声明一个数组,又该如何使用呢?

c - 在结构体中释放 char**