Как я могу отредактировать указатель на узел списка из функции в рекурсии? - PullRequest
6 голосов
/ 03 января 2012

Я пишу довольно сложную программу по сравнению с тем, с чем я имел дело до сих пор. В любом случае, в какой-то момент я должен написать функцию, которая будет манипулировать структурным списком. Я пытаюсь сделать этот вопрос как можно более простым, поэтому я написал довольно простой фрагмент кода только для справки.

Вот в чем дело: сначала я вызываю 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;
 }

Если, скажем, в моем распоряжении достаточно подключенных узлов списка, current = current->next; является правильным способом для "последней" функции testf получить и отредактировать значение current2 вызывающего абонента (то есть current этой функции) ) или я ужасно неправ? Если да, как можно изменить переменные функции вызывающей стороны внутри вызываемой функции и быть уверенным, что они не исчезнут, как только вызванная функция вернется? Мне трудно понять, как работают указатели.

Весьма вероятно, что я пропустил важную информацию или недостаточно четко задал вопрос. Пожалуйста, сообщите мне, если это так, чтобы я мог редактировать все, что вам нужно.

Заранее спасибо.

1 Ответ

4 голосов
/ 03 января 2012

Вы можете передать указатель на указатель в своей функции и разыменовать его, чтобы получить указатель на список узлов, вот как будет выглядеть код после этого (не проверенный для компиляции):

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

...