我正在使用 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
。)
最佳答案
是的,这两个都可以,但您可能想要第一个版本。您将指针传递给节点,以便您的函数能够修改节点本身。第二个版本使您能够修改指针(即 main()
中的变量 first
),但如果您不需要这样做,则没有使用第二个选项的原因。
关于您关于在第二个函数中直接使用 modify
的问题,正确的语法是 (*modify)->value = 10
。
关于c - 在 C 中修改链表项的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38295690/