如何从递归函数中编辑指向列表节点的指针?

Posted

技术标签:

【中文标题】如何从递归函数中编辑指向列表节点的指针?【英文标题】:How can I edit a pointer to a list node from a function in a recursion? 【发布时间】:2012-02-01 06:09:19 【问题描述】:

我一直在编写一个与我之前处理过的程序相比相当复杂的程序。无论如何,在某些时候我应该编写一个操作结构列表的函数。我试图让这个问题尽可能简单,所以我写了一段非常简单的代码仅供参考。

事情是这样的:起初我从另一个函数调用testf,为它提供了一个有效的current以及一个值为0的i。这意味着testf之前会调用自己大约100次它开始访问其余的代码。这是所有生成的testf 实例将开始解析的时间。

 void testf(listnode *current, int *i) 
   wordwagon *current2;

   current2 = current;
   if (*i < 100) 
     *i = *i + 1;
     current2 = current2->next;
     testf(current2, i);
   


   current = current->next;
   return;
 

假设我有足够的连接列表节点可供我使用,current = current-&gt;next; 是“最后一个”testf 函数访问和编辑调用者的 current2 值的正确方法(这是这个函数的 current ),还是我大错特错? 如果我是,那么从被调用函数内部更改调用函数变量并确保它们不会在被调用函数返回后立即消失的方法是什么?我发现很难很好地掌握指针的工作原理。

很可能是我遗漏了重要信息,或者我的问题问得不够清楚。如果是这种情况,请通知我,以便我可以根据您的需要进行编辑。

提前致谢。

【问题讨论】:

你必须将指针传递给指针,或者在递归之前修改current +1 提供一个简单的例子 【参考方案1】:

您可以将指针传递给函数中的指针,然后对其取消引用以获取返回的 listnode 指针,这是之后代码的样子(未经编译测试):

void testf(listnode **current, int *i)   // accept pointer to listnode pointer
   wordwagon *current2;

   current2 = *current;   // retreive pointer value by dereferece
   if (*i < 100) 
     *i = *i + 1;
     current2 = current2->next;
     testf(&current2, i);  // recursively call by reference to the pointer
   

   *current = (*current)->next; /* change the current pointer next pointer, CORRECTED as suggested by Azure */
   return;
 

这里有一个非常好的学习指南文章列表:

a)http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

b)http://cslibrary.stanford.edu/103/LinkedListBasics.pdf

【讨论】:

return 之前的最后一行中,我认为您只是在更改堆栈上双指针的值。试试这个:*current = (*current)-&gt;next; 没问题!我以前经常遇到这种情况,调试起来很痛苦。

以上是关于如何从递归函数中编辑指向列表节点的指针?的主要内容,如果未能解决你的问题,请参考以下文章

递归结构(二叉树):通过内部函数的结构指针获取值

二叉树遍历的非递归实现

我不明白如何递归地编写函数

js_递归函数在严格模式下的调用方法

如何在不停止递归的情况下返回递归函数中的值?

共享指针递归删除递归数据结构,堆栈溢出