c - 在 C 中修改链表项的正确方法

标签 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->valuemain() 调用它们之后(在本例中为 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/

相关文章:

c++ - C++实现哈希表时出现SIGSEGV错误

java - 不要更新 JTable

C - 为什么必须与 NULL 进行比较?

c - 如何将命令行参数传递给 C 函数

C 指针 : Assignment from incompatible pointer type

c++ - 删除指针

c++ - 警告 : suggest parentheses around assignment while (*(arg_to++) = *(arg_from++));

c - 返回一个指向结构体的指针,该结构体中有一个 char ** 指针到指针

c - 如何在 C 中取消引用和自动递增强制转换指针?

c - epoll 最多可以处理多少套接字?