如何在没有指向指针的情况下更改函数中的指针值

问题描述 投票:0回答:1

我正在尝试温习我的 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;
    }
}

但我想知道两件事

  1. 为什么我不能像让第二个节点指向第四个节点那样将 head 更改为指向第二个节点,从而从列表中删除节点 3?
  2. 有没有一种方法可以在不使用双指针的情况下做到这一点。如果是这样,它是如何以及为什么有效而我原来的方法却不起作用?
c function pointers
1个回答
0
投票

在 C 中,参数按值传递(复制)。如果您需要更改函数中的指针(也称为输出参数),那么您需要知道指针的地址,因此需要知道双重间接寻址(

Node **top
)。这是一种非常标准的做事方式。

您还可以返回新值,然后调用者使用该值来更新其指针:

char *root;
// ...
root = nodeRemove(root, 42);

如果需要,这会更新调用者的

root
变量。

© www.soinside.com 2019 - 2024. All rights reserved.