在C中修改链接列表项的正确方法

时间:2016-07-10 19:24:25

标签: c pointers linked-list parameter-passing

我正在使用C中的链表并尝试理解将节点传递给函数并修改该节点值的正确方法。

假设为了这些例子,我有一个单节点列表,只关心修改第一个节点。

struct node {
    int value;
    struct node *next
};

在main中我声明了我的(单节点)列表:

int main(){ 
    struct node *first;
    first = malloc(sizeof(struct node));
    first->value = 5;
    first->next  = NULL;
    //someFunctA(first);
    //someFunctB(&first);
};

要修改函数中的first->value,我应该使用:

void someFunctA(struct node *modify){
    modify->value = 10;}

或:

void someFunctB(struct node **modify){
    struct node *temp = *modify;
    temp->value = 10;}

(或者这些都不是?)

两个似乎都可以工作 - 在调用someFunctA(home)someFunctB(&home)之后,我在调用后的first->value中看到main()中的预期值他们(在这种情况下是10)。

这些方法中的任何一种都是正确的吗?都?如果两者兼而有之,两者之间的权衡是什么?

此外,是否可以使用引用指针传递first(如someFunctB中所示,对吧?)并且仍可直接处理它而无需复制? (当我使用引用指针并尝试访问函数中的modify->value*modify->value**modify->value时,我收到错误request for member ‘value’ in something not a structure or union。)

1 个答案:

答案 0 :(得分:2)

是的,这两个都可以,但你可能想要第一个版本。您正在传递指向节点的指针,以便您的函数能够修改节点本身。第二个版本使您能够修改指针(即first中的变量main()),但如果您不需要这样做,则没有理由使用第二个选项。 / p>

关于在第二个函数中直接使用modify的问题,正确的语法为(*modify)->value = 10