Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C、 链接数据结构和双指针行为_C++_C_Pointers - Fatal编程技术网

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

C++ C、 链接数据结构和双指针行为,c++,c,pointers,C++,C,Pointers,此问题涉及单链表的删除函数,其中搜索并删除值。请考虑以下代码: 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) {

此问题涉及单链表的删除函数,其中搜索并删除值。请考虑以下代码:

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

感谢您抽出时间阅读

在这里,如果我简单地写temp=temp->next而不是*a=temp->next,并删除node*c=temp和free(c)行,这样temp就不会受到任何影响,结果是函数外部的节点指针不会改变,也不会发生删除

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

它们是不同的

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

但是
*a=temp->next


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

问题是因为您传递了一个
节点**
,可能是为了修改函数外部的指针,但即使要删除的值不在头部,您也会修改它

解决方案是抛弃
temp
,使用
a
的抽象(即您跟踪的链接,需要修改)。这样,您就不需要
b
,而且您的代码更简单:

void delete(node **a, int d) {
  if (!a)
    return;

  while(*a != NULL) {
    if((*a)->data == d) {
      node *c = *a;
      *a = c->next;
      free(c);
      break;
    }
    else {
       a = &((*a)->next); // When you pass to the next node, you need to
                          // modify the link in the current node on removal
    }
  }
}

你能用一句话来解释这个问题吗?读了这一段后很难理解这个问题(我现在确实读了三遍)。问题是什么?我没有看到任何以问号结尾的句子。对不起,如果我不能正确地表达。如果我只是简单地编写temp=temp->next而不是上面的*a=temp->next,那么为什么这段代码不起作用code@AminIqbal因为*a和temp是不同的。temp是*a的副本。这就像在
a=1之后期望a为2;b=a;b=2@AjayBrahmakshatriya,但else案例确实改变了*a的值。当我分配TEMP= B时,*A被改变了。但是如果你考虑了B不是空的情况,B-> Next=TEMP-> Next,然后TEMP= B清楚地影响*A,因为删除确实发生了。是的,因为你没有改变温度,您正在更改temp->next,这意味着您正在直接修改节点的下一个指针,因此*aSo temp和temp->next之间的区别是什么?它们都是指向*a的临时点和指向(*a)->下一个的临时->下一个点的指针节点。为什么改变温度不起作用?事实上,温度不会指向任何地方。它只在*a处存储值(即头指针的地址)。当你这样做的时候,temp=temp->next意味着现在temp存储下一个节点的地址,但*a将保持不变,因为temp现在只存储新地址,不修改除自身以外的任何其他内容。我终于明白了。非常感谢。