2016-11-02 17 views
-1

Ich habe diesen verknüpften Warteschlangencode zum Entfernen eines Elements aus einer verknüpften Warteschlangenstruktur in C erhalten. Normalerweise würde ich dies anders implementieren, aber dieser Code verwendet Rekursion. Wird es tun, was es tun soll, und warum? Und wenn nicht, gibt es eine Möglichkeit, es zu reparieren? Ich bin wirklich neu in dieser Rekursionssache. Vielen Dank!Aus verknüpfter Warteschlange rekursiv entfernen in C

typedef struct telement T; 
struct telement{ 
    int value; 
    T* next; 
}; 

void Out (T **A){ 
    if ((*A)->next == NULL){ 
     printf("\n --I'm removing element with value %d.---", (*A)->value); 
     (*A) = NULL; 
     free(*A); 
    } 
    else{ 
     Out(&(*A)->next); 
    } 
} 
+0

Was soll es tun? Wenn es Kaffee kochen soll, dann wird es das nicht tun. – immibis

+0

@immibis rekursiv auf den letzten Knoten einer Vorwärtsverknüpfungsliste, setzt den Zeiger, der auf besagten Knoten zeigt, auf NULL, gibt dann den Nullzeiger frei und gibt Speicher frei. Kurz gesagt, es ist eine Übung in Rekursion und Pointer-to-Pointer-Verwendung, um eine Aufgabe in der wohl * effizientesten möglichen Weise auszuführen. Es wird auch garantiert, ein undefiniertes Verhalten aufzurufen, wenn es in einer leeren Warteschlange (Nullzeiger) ausgeführt wird. – WhozCraig

+0

@WhozCraig Das ist nicht, was ich gefragt habe. Lies meinen Kommentar noch einmal. – immibis

Antwort

2

Diese Funktion entfernt das letzte Element. Beachten Sie, dass im letzten Schritt der Rekursion A entweder auf den Listenkopfzeiger oder auf den Zeiger des vorletzten Elements next zeigt.

Es setzt dann diesen Zeiger auf NULL und hebt die Verknüpfung des letzten Elements von der Liste auf.

Es wird jedoch nicht das letzte Element frei, weil free(NULL) nichts tut.

+0

Sie könnten die Antwort auf * wie es zu beheben * – chqrlie

Verwandte Themen