C 为什么不是';我的链接列表的标题没有改变吗?
我尝试创建一个函数,将一个节点添加到列表的开头,然后更改变量“head”(保持列表的前一个开头)以包含新节点C 为什么不是';我的链接列表的标题没有改变吗?,c,data-structures,linked-list,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
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
指向的内容,但实际上没有任何更改。因为addToStart
将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));
}
<>强>编辑< /强> C中的每个函数都得到了自己的参数副本,所以实际上没有像C++或其他语言那样的引用。无论您在哪里使用参考资料,快速而肮脏的选项(可能并不总是有效!)就是在每个参考资料前面加上一个*
。在这里,您首先希望作为参考first
是一个节点指针,因此它已经是一个节点*
。要将其用作“引用”(实际上),它会得到一个额外的*
,因此节点**
。类似地,无论在哪里引用它,它都会得到一个额外的*
:*first=…
有关Java内部构件的更多信息,请参阅。基本上,第一个*
隐式地存在于Java实例变量中。SoNode n有点像Node*n代码>在C中
希望这会有所帮助-请务必查看页面顶部链接的重复问题,以及那里的答案。如果您遇到另一个代码问题,只需问另一个问题
C向导注意:是的,我知道盲目添加*
是个坏主意!不过,它有时很有用。我正试图以一种将OP向前推进一步的方式回应OP的评论。first=n
在addToStart
中更改函数参数first
,但不更改head
frommain
first
是head
的副本,因为C是按值传递的,只有副本被更改。这与void f(int n){n=0;}
不能用于将整数设置为零的原因相同。与C语言中的所有内容一样,首先尝试理解int
的情况,然后推广到其他类型。关于“int”的情况,您是对的,但指针不是引用变量,而不是保存变量本身吗?我假设传递一个指针变量并更改指针也会有效地更改原始变量。谢谢,我理解你所做的…但我想这让我意识到我可能有一个误解。我认为指针类似于Java中的引用变量;因此,当我传递参数“node*first”和“node*n”时,执行“first=n”不会改变指针吗?@AdnanZaman编辑:)这是我不知道的!哇,这让我过去犯过的很多错误现在变得更有意义了。这些错误似乎不再那么神秘了。我想这就是他们所谓的“传递值”的意思。非常感谢你!