gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:41:03 26 4
gpt4 key购买 nike

以下代码是我从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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com