我正在尝试温习我的 C 语言技能,并且正在研究链表。我还试图不让 head 成为全局变量(允许函数更通用)。我遇到的问题是如何在不使用指向指针的情况下更改头指向的位置。
这是我尝试过但不起作用的代码; head 没有被更改为指向第二个节点。 (我认为这是原始代码,或者至少接近它。我已将其修复为使用双指针,所以......)
int nodeRemove(Node*top, int data)
{
if(top == NULL)
return -1;
Node *current = top;
Node *previous = top;
while(current != NULL)
{
if(current->data == data)
{
if(current == top)
{
top = current->next;
}
else
{
previous->next = current->next;
free(current);
}
return 1;
}
previous = current;
current = current->next;
}
}
我终于将代码更改为这样......
int nodeRemove(Node **top, int data)
{
if(top == NULL)
return -1;
Node *current = *top;
Node *previous = *top;
while(current != NULL)
{
if(current->data == data)
{
if(current == *top)
{
*top = current->next;
free(current);
}
else
{
previous->next = current->next;
free(current);
}
return 1;
}
previous = current;
current = current->next;
}
}
但我想知道两件事
在 C 中,参数按值传递(复制)。如果您需要更改函数中的指针(也称为输出参数),那么您需要知道指针的地址,因此需要知道双重间接寻址(
Node **top
)。这是一种非常标准的做事方式。
您还可以返回新值,然后调用者使用该值来更新其指针:
char *root;
// ...
root = nodeRemove(root, 42);
如果需要,这会更新调用者的
root
变量。