2016-08-29 56 views
-2

我试图做一个函数,将一个节点添加到列表的开头,然后更改变量“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在指着,但实际上一切都没有改变。

+0

'first = n'在'addToStart'中改变函数参数'first',但不是'main'中的'head'。 'first'是'head'的副本,因为C是按值传递的,只有副本被改变。 –

+0

这与'void f(int n){n = 0; }'不能用于将整数设置为零。和C中的所有东西一样,试着首先了解'int'的情况,然后推广到其他类型。 –

+0

你对'int'的情况是正确的,但是不是指向一个变量的指针,而不是保存变量本身?我假定传递一个指针变量,改变指针也会有效地改变原始变量。 –

回答

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实例变量中。所以Node n;在Java是(有点)像在Node *n;在C.

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

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

+0

谢谢我明白你做了什么..但我认为这让我意识到我可能有一个误解。我认为一个指针类似于Java中的引用变量;所以当我通过参数'node * first'和'node * n'时,不会'first = n'改变指针吗? –

+0

@AdnanZaman编辑:) – cxw

+0

现在,这是我不知道的!哇,这使我在过去犯了很多错误,现在变得更有意义。这些错误似乎不再神秘。我想这就是他们所说的“按价值传递”。非常感谢! –

相关问题