如果head-> next为NULL,我想将头结构为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;
}
虽然它没有传递给函数时工作正常,但是直接在main函数中完成。 我哪里出错?
答案 0 :(得分:4)
作为参数传递给remove
的指针被复制到函数中。函数内的head
是该指针的副本。您将该副本设置为NULL
,并将外部副本保持不变。您可以通过引用简单地获取指针:
void remove(struct node*& head)
{
// ...
}
请注意head
类型中的&符号。这意味着它是“对node
指针的引用”,并允许您精确引用传递的对象,而不是它的副本。
答案 1 :(得分:3)
问题是你传递的指针允许你修改它所指向的node
,但你不能修改指针本身,因为指针本身是按值传递的。因此,您无法在remove
函数中执行此操作:
node = NULL;
人们给你的一个解决方案是将它作为对指针的引用传递,就像在node *&head
中一样,这完全正常。但是我相信你想知道这种事情的一般约定(修改指针本身)是通过传递一个双指针(即指向node
的指针):
void remove(node **head) { ... }
然后在main中传递指针的地址:
node *theHead = blah;
remove(&theHead);
然后在remove
中,您可以更改指针的值:
*head = NULL;
你当然也可以取消引用它:
(*head)->next; // etc