Unverständliches Programmverhalten beim Löschen einer verketetten Liste
-
Hallo!
Ich habe eine verketette Liste erstellt und möchte nun bei der Ausgebe sie Element für Element löschen. Dazu habe ich eine Funktion pop() geschrieben.
Meine Intension war nun die folgende: Da während der Ausgabe jedes Element meiner Struktur der Reihe nach aufgerufen wird, übergebe ich das jeweilige Element als Pointer an pop() und terminiere es dort.
pop() macht genau das, was es machen soll. Aber! Wenn ich pop() in meiner Ausgabe-Fkt aufrufe, übergibt es nicht die neuen Werte an mein Element.Weiß einer Rat?
void pop(POINT* stack_point){ POINT *pointTmp = stack_point; stack_point = pointTmp->next; free(pointTmp); } void printStack(){ POINT *stackPoint; if(isEmpty() == 1){ printf("Nix drinne\n"); }else{ stackPoint = first; while(stackPoint != NULL){ printf("x: %.2f, y: %.2f, z: %.2f\n" ,stackPoint->x,stackPoint->y,stackPoint->z); pop(stackPoint); } first = NULL; } }
-
Die ganze Struktur stimmt nicht, unklar ist was das Programm eingentlich machen soll. POINT ist ja eigentlich eine Struktur aus Windows. Hat mit einem Stackpointer
eigentlich nichts zu tun.
-
Scheppertreiber schrieb:
POINT ist ja eigentlich eine Struktur aus Windows. Hat mit einem Stackpointer
eigentlich nichts zu tun.ist doch wumpe was es unter windoofs ist. hier ist es ein 3D-punkt mit einem link dabei.
-
Hai Fricky,
ich habe nur irgendwie das Gefühl, er hat POINT mir Pointer verwechselt ...
-
Oder du hast irgendwie keine Ahnung und laberst hier irgendwie nur Müll...irgendwie...
-
POINT ist bei mir eine Struktur dieser Form:
typedef struct point{ int x; int y; int z; } POINT;
Mein Programm macht folgendes: Es liest n dieser Punkte (vom Typ POINT) ein und legt sie auf einen Stack. Nun rufe ich in der main mein printStack() auf, welches zunächst Element für Element den Stack rausliest und dabei immer pop() aufruft.
first (vom Typ POINT
ist stets das erste Element vom Stack.
isEmpty() überprüft nur, ob der Stack leer ist. Wenn ja, bekommt man eine Meldung.
-
POINT:
typedef struct point{ int x; int y; int z; struct point *next; } POINT;
-
Du änderst nicht den urprünglichen Zeiger, sondern nur seine Kopie innerhalb der Funktion. Du musst einen Zeiger auf den Zeiger übergeben und dessen Inhalt ändern.
void pop(POINT** p) { POINT* tmp = (*p)->next; free(*p); *p = tmp; }
-
Wenn mein Debugger dann bei pop() angelangt ist, bekomm ich folgendes raus:
-
Rufst du die Funktion pop(&stackPoint); so auf?
-
Funktioniert einwandfrei. Danke sehr euch beiden!