2

如果 head->next 为 NULL,我想将 head 结构设为 NULL。但是,当我将它传递给一个函数以使其为空时,它不起作用。

void remove(struct node* head)
{
 int val;

 cout << "Enter a value to delete: ";
 cin >> val;

 if (head->next == NULL)
  if (head->data == val)
   head = NULL;
}

虽然它在不传递给函数时工作正常,但直接在主函数中完成。我哪里错了?

4

2 回答 2

4

作为参数传递的指针remove被复制到函数中。head函数内部是该指针的副本。您将该副本设置为NULL,而外面的副本保持不变。您可以简单地通过引用获取指针:

void remove(struct node*& head)
{
  // ...
}

注意类型中的和号head。这意味着它是“对指针的引用node”,让您可以精确地引用传递的对象,而不是它的副本。

于 2013-03-23T17:10:38.063 回答
3

问题是您传递的指针允许您修改node它指向的指针,但您不能修改指针本身,因为指针本身是按值传递的。所以你不能在你的remove函数中这样做:

node = NULL;

人们给你的一个解决方案是将它作为对指针的引用传递,就像 in 一样node *&head,这工作得很好。但是我相信你想知道这种事情的一般约定(修改指针本身)是通过传递一个双指针(即指向指针的指针node):

void remove(node **head) { ... }

然后在 main 中将指针的地址传递给它:

node *theHead = blah;
remove(&theHead);

然后在remove你可以改变指针的值:

*head = NULL;

当然,您也可以取消引用它:

(*head)->next; // etc
于 2013-03-23T17:19:27.347 回答