2012-01-03 15 views
6

Ho scritto un programma abbastanza complesso rispetto a quello che ho affrontato fino ad ora. Ad ogni modo, a un certo punto, dovrei scrivere una funzione che manipolerà una struct list. Sto cercando di rendere questa domanda il più semplice possibile, quindi ho scritto un semplice pezzo di codice solo per riferimento.Come posso modificare un puntatore a un nodo elenco da una funzione in una ricorsione?

Qui è la cosa: in un primo momento che io chiamo testf da un'altra funzione dotandola di una valida current così come un i con un valore pari a 0. Ciò significa che testf chiamerà sé circa 100 volte prima che cominci l'accesso il resto del codice. Questo è quando tutte le istanze generate di testf inizieranno a essere risolte.

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

Se, diciamo, ho abbastanza nodi della lista connessi a mia disposizione, è current = current->next; il modo corretto per l ' "ultima" la funzione testf per accedere e modificare il valore del chiamante current2 (che è di questa funzione current), o sono terribilmente sbagliato? Se lo sono, qual è il modo per apportare modifiche alle variabili della funzione chiamante dall'interno della funzione chiamata ed essere sicuro che non andranno via non appena la funzione chiamata ritorna? Trovo che sia difficile riuscire a capire bene come funzionano i puntatori.

È molto probabile che abbia omesso informazioni importanti o che non abbia posto abbastanza chiaramente la mia domanda. Ti prego di informarmi se è così che posso modificare in qualunque cosa ti serva.

Grazie in anticipo.

+2

Devi passare un POI prima del puntatore, o modifica 'current' prima di recitare –

+0

+1 per fornire un semplice esempio –

risposta

4

È possibile passare puntatore a un puntatore nella funzione, e derefrence per ottenere un puntatore listnode indietro, ecco come il codice sarà simile, dopo che (non testato per la compilazione):

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

Qui è una lista di ottimi articoli per i puntatori di apprendimento:

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

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

+0

Nella tua ultima riga prima del' return', penso che stai solo cambiando il valore del doppio puntatore sullo stack. Prova questo: '* current = (* current) -> next;' –

+0

@PlatinumAzure, grazie, corretto. – DhruvPathak

+0

Nessun problema! Mi sono imbattuto in quello tutto il tempo ed è un tale dolore eseguire il debug. –

Problemi correlati