gpt4 book ai didi

c++ - C、链接数据结构和双指针行为

转载 作者:行者123 更新时间:2023-11-30 16:48:37 26 4
gpt4 key购买 nike

这个问题是关于单链表的删除函数,其中搜索并删除一个值。请考虑以下代码:

void delete(node **a, int d)
{
node *temp = *a;
node *b = NULL;
while(temp != NULL)
{
if(temp->data == d)
{
node *c = temp;
if(b == NULL)
{
*a = temp->next;
}
else
{
b->next = temp->next;
temp = b;
}
free(c);
break;
}
else
{
b = temp;
temp = temp->next;
}
}
}

这里,指针变量temp指向双指针 a 中包含的值,其行为是可预测的,除非要删除值,即 d是链表的第一个元素。在这里,如果我简单地写 temp = temp->next而不是*a = temp->next ,并删除行 node *c = tempfree(c)这样 temp 就不会受到任何影响,结果证明函数外部的节点指针没有改变,也没有发生删除。这让我想知道为什么在其他情况下 temp能够改变*a ,但不是在上述情况下。我的想法是*a不会改变,除非指向它的指针被temp->next改变。而不仅仅是temp 。然而,这个问题只有当结构体作为函数参数时才会出现。

感谢您花时间阅读。

最佳答案

Here, if I simply write temp = temp->next instead of *a = temp->next, and remove the lines node *c = temp and free(c) so that temp is not affected in any way, it turns out that the node pointer outside of the function does not change and no deletion occurs.

*a = temp->nexttemp = temp->next

不同。

temp = temp->next 表示现在temp存储的是下一个节点的地址 但 head 指针仍然指向第一个节点,因为您没有更改它。

但是*a = temp->下一个

这里*a存储头指针(即起始节点)的地址。这意味着更改 *a 将更改头指针。

关于c++ - C、链接数据结构和双指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884507/

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