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

Ete*_*ght 6 c recursion pointers pass-by-reference

直到现在,我一直在编写一个相当复杂的程序.无论如何,我应该编写一个操作结构列表的函数.我试图让这个问题尽可能简单,所以我写下了一段非常简单的代码供参考.

事情是这样的:首先我testf从另一个函数调用它,为它提供一个有效的current以及i一个值为0.这意味着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;
 }
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

Dhr*_*hak 4

您可以将指针传递给函数中的指针,并取消引用它以返回 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;
 }
Run Code Online (Sandbox Code Playgroud)

以下是一些非常好的学习指南文章列表:

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

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