在c中的递归函数中传递指针地址

时间:2014-12-06 06:35:11

标签: c linked-list

我试图理解以下代码:

void recursiveReverse(struct node **head_ref)
{
    struct node *first;
    struct node *rest;

    if (*head_ref == NULL)
       return;   

    first = *head_ref;  
    rest  = first->next;
    if (rest == NULL)
       return;   
    recursiveReverse(&rest);
    first->next->next  = first;  
    first->next  = NULL;          
    *head_ref = rest;     
}

我注意到,一旦代码超出rest,变量recursiveReverse(&rest)对于所有递归调用都具有相同的值。但first->next有不同的价值观。通过将它们写在堆栈上并将其与每个调用进行比较,我能够理解为什么first->next具有不同的值。但我无法理解rest如何为所有调用而不是堆栈中的(rest = first->next)具有相同的值。如果问题不明确或需要任何细节,请告诉我。 感谢

更新:我观察到,正确排列参数,如果我调用recursivereverse(rest)而不是rev​​ursivereverse(& rest),则每次递归调用的剩余值都会像revursion堆栈上的任何其他变量一样更改。我无法理解在电话会议中有什么区别和休息。

2 个答案:

答案 0 :(得分:2)

考虑以下输入。

1 2 3 4。

第一次递归,

*Head_ref = 1;//value of head_Ref
 first =1; // first=*head_ref;
 rest=2;// rest=first->next;

第二次递归,

*Head_ref = 2;//value of head_Ref
 first =2; // first=*head_ref;
 rest=3;// rest=first->next;

第三次递归。

*Head_ref = 3;//value of head_Ref
 first =3; // first=*head_ref;
 rest=4;// rest=first->next;

第四次递归,

*Head_ref = 4;//value of head_Ref
 first =4; // first=*head_ref;
 rest=NULL;// rest=first->next;

条件失败,它进入第三次递归,在那里调用。

第三次递归,

    first=3;
    first->next->next=first// here it means the rest link.
    first->next=NULL;// it will make the pointer that is end.
    *head_ref=rest; // making the starting address in this recursion

现在列表就像这样,4 - > 3.现在,休息值变为4。

现在进入第二次递归,

休息将指向4,但是第一个> next指向3。

first=2;
rest=4;
first->next->next=first// here it means the rest link.
first->next=NULL;// it will make the pointer that is end.
*head_ref=rest; // making the starting address in this recursion

所以现在head_ref指向4.然后现在列表将是4 - > 3 - > 2。

它涉及第一次递归,

在这里,

first=1,rest=4, But first -> next =2.
first->next->next=first// here it means the rest link.
first->next=NULL;// it will make the pointer that is end.
*head_ref=rest; // making the starting address in this recursion

最后它变成了

4 -> 3 -> 2 -> 1.

所以现在列表正好相反。这里主要是使*head_ref在递归结束时进入最后位置。

答案 1 :(得分:0)

考虑链接列表1->2->3->4。根据{{​​1}},在满足recursiveReverse()时递归函数调用的迭代(节点' 4'),(rest == NULL) = 4;此后,调用返回上一次迭代(节点' 3')。这里函数递归的当前迭代的基本*head_ref(=' 4')变量(节点' 3')实际上是最后一次迭代的rest(最后一个节点) ' 4')其中*head_ref被计算为4.因此在递归函数的末尾(节点' 3'),我们正在进行*head_ref,即。 *head_ref = rest; = 4,因为*head_ref从函数迭代节点=' 4'收到4。现在,在下一次从这些函数连续递归返回时,返回rest的地址,该地址保持不变,因此语句*head_ref提供相同的值。