2012-01-03 14 views
6

He estado escribiendo un programa que es bastante complejo en comparación con lo que he tratado hasta ahora. De todos modos, en algún momento se supone que debo escribir una función que manipule una lista de estructuras. Intento hacer que esta pregunta sea lo más simple posible, así que escribí un código bastante simple para referencia.¿Cómo puedo editar un puntero a un nodo de lista desde una función en una recursión?

Aquí está la cosa: en un primer momento que llamo testf de otra función dotándolo de una válida current así como un i con un valor de 0. Esto significa que testf llamará a sí mismo alrededor de 100 veces antes de que comience el acceso al resto del código Aquí es cuando todas las instancias generadas de testf comenzarán a resolverse.

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; 
} 

Si, digamos, he suficientes nodos lista de conectados a mi disposición, es current = current->next; el camino correcto para el "último" función testf para acceder y editar el valor de la persona que llama current2 (que es de esta función current), ¿o estoy horriblemente equivocado? Si lo estoy, ¿cuál es la forma de hacer cambios a las variables de la función de llamada desde dentro de la función llamada y asegúrese de que no desaparecerán tan pronto como regrese la función llamada? Me resulta un poco difícil comprender cómo funcionan los punteros.

Es muy probable que haya omitido información importante o que no he hecho mi pregunta con suficiente claridad. Por favor, infórmeme si ese es el caso, así puedo editar lo que necesite.

Gracias de antemano.

+2

tienes que pasar un POI nter al puntero, o modificar 'current' antes de recurse –

+0

+1 para proporcionar un ejemplo simple –

Respuesta

4

Puede pasar puntero a un puntero en su función y derefrence que para obtener un puntero NodoLista atrás, aquí es cómo el código se verá como después de eso (no probado para la compilación):

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; 
} 

Aquí es una lista de artículos muy buenos para los punteros de aprendizaje:

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

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

+0

En su última línea antes del' return', creo que solo está cambiando el valor del doble puntero en la pila. Pruebe esto: '* current = (* current) -> next;' –

+0

@PlatinumAzure, gracias, corrigió eso. – DhruvPathak

+0

¡Ningún problema! Solía ​​encontrarme con eso todo el tiempo y me duele tanto depurarlo. –

Cuestiones relacionadas