Einfach verkettete Listen
-
Hi,
also ich hab' ein kleines Problem. Jedesmal, wenn ich ein Element einer Liste am Anfang löschen will, funktioniert es irgendwie nicht. Im Unterprogramm wird first (der Zeiger auf den Anfang) auf den nächsten gesetzt. Im Hauptprogramm funktioniert es aber nicht mehr... Ich steh' auf der Leitung. Die 5 will er am Anfang nicht löschen.
/* Liste6.cpp */ #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 struct Liste { int number; // Daten struct Liste *next; // Zeiger auf naechstes Element }; typedef Liste* PListe; // Zeigertype definieren bool Loesche(PListe, PListe, int); int main(void) { int i, // Wert, der gesetzt wird abfrag; PListe akt,first = NULL; // erzeugen und vorne einfuegen for (i=1; i<=6; i++) { akt=new Liste; // ja, ich weiß in C++- Stil akt->next = first; akt->number = (35-5*i); // Daten first=akt; } while(akt) { printf("%i\n", akt->number); akt = akt->next; } akt = first; printf("\nWelche Zahl soll geloescht werden? "); scanf("%i", &i); Loesche(akt, first, i); printf("\n-->%p\n", first); akt = first; printf("\n\n"); while(akt) { printf("%i\n", akt->number); akt = akt->next; } printf("\n\n"); } // ------ Unterprogramm Loesche ----------------------------------------------- bool Loesche(PListe akt, PListe first, int i) { PListe vorher, loesch_zgr; vorher = akt; printf("\n%i\n", akt->number); /* Am Anfang loeschen */ if (akt->number >= i) { loesch_zgr = akt; printf("\n%p\n", akt->next); printf("\n%i\n", akt->next->number); first = akt->next; printf("\n%p\n", first); delete loesch_zgr; return TRUE; } while (akt) { /* in der Mitte loeschen */ if (akt->number == i) { loesch_zgr = akt; vorher->next = akt->next; delete loesch_zgr; return TRUE; } /* Am Schluss loeschen */ if (akt->next == NULL) { loesch_zgr = akt; vorher->next = NULL; delete loesch_zgr; return TRUE; } vorher = akt; akt = akt->next; } }
Bitte helft mir. Ich bin auch noch für alle möglichen Verbesserungsvorschläge offen.
Thomas
-
Wenn du eine Funktion aufrufst, werden Kopien von den Parametern erzeugt (außer bei Arrays). Die Variable first in der Funktion Loesche ist also eine Kopie der Variablen first in der main-Funktion. Da Loesche mit einer Kopie arbeitet, kannst du nur diese Kopie ändern, nicht die Originalvariable in main. Daran ändern auch die identischen Namen nichts.
Wenn Loesche diesen Parameter ändern können soll, musst du dessen Adresse übergeben, also einen Zeiger auf PListe.
-
Versteh' ich nicht ganz... In der Mitte und am Ende kann ich ein Element löschen. Am Anfang nicht.
Außerdem ist ja first ein Zeiger auf Liste. Ich kenn' mich grad überhaupt nicht mehr aus.
typedef Liste* PListe; // Zeigertype definieren
Thomas
-
thomas1036 schrieb:
Versteh' ich nicht ganz...
Dann solltest du nochmal ein Tutorial zum Thema funktionen durcharbeiten. Das sind Grundlagen. Stichwort "call by value"
In der Mitte und am Ende kann ich ein Element löschen.
Klar. Das liegt daran, dass du dazu first nicht ändern musst.
Am Anfang nicht.
Auch klar. Siehe oben.
Außerdem ist ja first ein Zeiger auf Liste.
Ich weiß. Du brauchst einen Zeiger auf PListe. Oder einen Zeiger auf Zeiger auf Liste, das ist dasselbe.
-
Ok, danke. Ich werd' mir das Tutorial noch mal anschauen.