我正在尝试向链接列表添加新的根元素。我已经知道正确的答案,但是我不明白为什么会有指向当前根元素的双指针。这是正确的代码:
void elementAsRoot(Element **oldRoot, Element *newRoot){
newRoot -> next = *oldRoot;
*oldRoot = newRoot;
}
答案 0 :(得分:2)
我很确定您可以删除双指针,因为最后您将取消引用双指针。
void elementAsRoot(Element *oldRoot, Element *newRoot) {
newRoot->next = oldRoot;
oldRoot = newRoot;
}
答案 1 :(得分:1)
我通过评论回答您。这是elementAsRoot
内部发生的事情。
oldRoot
是指向变量位置/地址的指针,该变量将列表的根保留在调用函数中。您想在elementAsRoot
内更改此根,这就是为什么传递指针地址的原因。
void elementAsRoot(Element **oldRoot, Element *newRoot){
首先,您将newRoot初始化为指向旧根
newRoot -> next = *oldRoot;
接下来,您将旧的根(在此函数的外部定义)突变为指向新添加的节点。
*oldRoot = newRoot;
}
调用函数看起来像
Element *root, *newroot;
....
newroot = malloc(sizeof Element);
// here your list look like root=A => rest .
// This call will mutate root to be new.
elementAsRoot(&root, new);
// here your list look like root=new => A => rest
答案 2 :(得分:1)
Map
该函数的调用方式如下:
#standardSQL
SELECT User_info,
(SELECT COUNT(1) FROM UNNEST(column1) value
WHERE NOT value IN (SELECT value FROM UNNEST(column2) value)
) Missing_count
FROM `project.dataset.table`
要从调用方更新变量,该函数需要一个指向该变量的指针。如果第一个参数只是Row User_info Missing_count
1 userId1 0
2 userId2 0
3 userId3 2
,而不是void elementAsRoot(Element **oldRoot, Element *newRoot){
newRoot -> next = *oldRoot;
*oldRoot = newRoot;
}
,则该函数将无法更新Element *list = ...some linked list...;
elementAsRoot(&list, ...some new element...);
// now 'list' points to the new first element, not the old one (which is now second)
的值,因此它将无法完成其工作。 / p>