链接列表添加新的根元素

时间:2019-06-18 19:53:58

标签: c list linked-list nodes

我正在尝试向链接列表添加新的根元素。我已经知道正确的答案,但是我不明白为什么会有指向当前根元素的双指针。这是正确的代码:

void elementAsRoot(Element **oldRoot, Element *newRoot){
  newRoot -> next = *oldRoot;
  *oldRoot = newRoot;
}

3 个答案:

答案 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>