为什么链接列表的头部不会改变?

时间:2016-08-29 14:56:57

标签: c data-structures linked-list

我尝试创建一个将节点添加到列表开头的函数,然后更改变量“head”(保持列表的上一个开头)以包含新节点。

void addToStart(node * n, node * first){
   printf("[Before adding] Node: %d, First: %d\n",&(*n),&(*first));
   n->next = first;
   first = n;
   printf("[After adding] Node: %d, First: %d\n",&(*n),&(*first));
}


int main(){
    node * head = createNode(0);
    printf("This is the location of head: %d\n",&(*head));
    node * fred = createNode(2);
    addToStart(fred,head);
    traverse(head); //Displays the list starting from the given node
    return 0;
}

这是输出:

This is the location of head: 10113040                                                                                                                                                   
[Before adding] Node: 10113072, First: 10113040                                                                                                                                          
[After adding] Node: 10113072, First: 10113072                                                                                                                                           
(0)[10113040]->NULL

问题在于我希望函数能够改变head指向的内容,但实际上没有任何改变。

1 个答案:

答案 0 :(得分:0)

因为addToStart将头指针的副本作为node *。要更改头部,您需要使用

void addToStart(node * n, node ** first){
                           //   ^
   printf("[Before adding] Node: %d, First: %d\n",&(*n),&(**first));
   n->next = *first;
          // ^
   *first = n;
// ^
   printf("[After adding] Node: %d, First: %d\n",&(*n),&(**first));
}

编辑 C中的每个函数都有自己的参数副本,所以实际上没有像C ++或其他语言那样的引用。无论你在哪里使用引用,快速和肮脏的选项(可能并不总是有效!)是在每次提及前加上额外的*。在这里,您希望first成为参考。 first是一个节点指针,因此它已经是node *。要将其用作“参考”(原样),它会获得额外的*,因此node **。同样,无论在何处引用,都会获得额外的**first = ...

有关Java内部的更多信息,请参阅a Java answer that's related。基本上,第一个*隐含在Java实例变量中。因此,Java中的Node n;(类似于)C中的Node *n;

希望有所帮助 - 绝对检查页面顶部链接的重复问题,以及那里的答案。如果您遇到另一个代码问题,请问另一个问题!

C向导注意:是的,我知道盲目添加*是一个坏主意!不过,它有时很有用。我试图以一种将OP向前推进一步的方式回应OP的评论。