2012-01-03 6 views
6

Pisałem program, który jest dość skomplikowany w porównaniu do tego, z czym miałem do czynienia do tej pory. W każdym razie mam napisać funkcję, która będzie manipulować listą elementów. Staram się, aby to pytanie było tak proste, jak to tylko możliwe, więc napisałem całkiem prosty fragment kodu, tylko w celach informacyjnych.Jak mogę edytować wskaźnik do węzła listy z funkcji rekursji?

Oto rzeczy: najpierw zadzwonię testf z innej funkcji zapewniając jej ważnej current jak również i o wartości 0. Oznacza to, że testf będzie nazywać się około 100 razy, zanim zacznie dostępu resztę kodu. Wtedy wszystkie wygenerowane instancje testf zaczną być rozwiązywane.

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

Jeśli, powiedzmy, mam wystarczająco dużo podłączonych lista węzłów w mojej dyspozycji, jest current = current->next; poprawny sposób na „ostatni” funkcja testf dostęp i edytować rozmówcy current2 wartość (co jest ta funkcja current) czy jestem okropnie zły? Jeśli tak, to w jaki sposób wprowadzić zmiany w zmiennych funkcji wywołującej z wywoływanej funkcji i upewnić się, że nie znikną, gdy tylko funkcja zwróci funkcję? Uważam, że trudno jest dobrze zrozumieć, w jaki sposób działają wskaźniki.

Jest bardzo prawdopodobne, że pominąłem ważne informacje lub że nie zadałem wystarczająco jasnego pytania. Jeśli tak, proszę poinformuj mnie, żebym mógł edytować wszystko, czego potrzebujesz.

Z góry dziękuję.

+2

trzeba zdać poi nter do wskaźnika lub zmodyfikuj 'current' zanim powtarzasz –

+0

+1 za podanie prostego przykładu –

Odpowiedz

4

można przekazać wskaźnik do wskaźnika w swojej funkcji, a derefrence go uzyskać wskaźnik listnode powrotem, tutaj jest jak kod będzie wyglądał po tym (nie testowane na kompilacji):

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

Tutaj jest to lista naprawdę dobrych artykułów dla wskaźników learning:

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

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

+0

W twojej ostatniej linii przed' return', myślę, że zmieniasz tylko wartość podwójnego wskaźnika na stosie. Spróbuj tego: '* current = (* current) -> next;' –

+0

@PlatinumAzure, dzięki, poprawiono to. – DhruvPathak

+0

Nie ma problemu! Często to robiłem, a debugowanie jest bardzo trudne. –

Powiązane problemy