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