Elemente aus dem LIFO mit free freigeben in C
-
Hallo Leute ich hab ein Verständnis Problem mit der free() Funktion.
Ich muss die einzelnen Elemente (aus dem LIFO Stack) nach dem zurückgeben der Werte wieder freigeben. Nun, so wie ich es mache ist es anscheinend falschAusschnitte aus der Aufgabe
1.Die Funktion pop() bekommt einen Stack on Reference übergeben.
Wenn der Zeiger auf das erste Listenelement ungleich NULL ist, wird der
Wert aus dem ersten Element als Ergebnis genutzt und es wird das
aktuelle erste Element freigegeben. Der Nachfolger des aktuellen ersten
Elements wird das neue erste Element. Bei Fehlern wird eine
entsprechende Meldung ausgegeben.2. Die Prozedur deleteStack() bekommt eine Stack-Variable
on reference übergeben. In deleteStack() werden alle Elemente des
Stacks freigegeben. Implementieren Sie diese Prozedur rekursiv!Wo ist denn mein Fehler?
Ich versteh es einfach nicht.
Die Normalen einfachen Beispiele die man so findet sind soweit klar aber ich kann es nicht auf dieses Problem übertragenEdit: Hab jetzt den gesamten Code reingestellt
Headder Datei lifo.h
#ifndef LIFO_H_ #define LIFO_H_ typedef struct ListItem{ int value; struct ListItem *next; }LItem; typedef struct stack{ int groese; struct ListItem *next; }stack; struct stack init(); void push(stack *stack, int value); int pop(stack *st); void delitestack(stack *stackL); #endif /* LIFO_H_ */
Main Datei LIFO.c
#include <stdio.h> #include <stdlib.h> #include "lifo.h" int main(void){ stack st=init(); int wert; push(&st, 1); push(&st, 2); push(&st, 3); push(&st, 4); wert=pop(&st); printf("%d",wert); wert=pop(&st); printf("%d",wert); // wert=pop(&st); // printf("%d",wert); // wert=pop(&st); // printf("%d",wert); delitestack(&st); return EXIT_SUCCESS; } struct stack init(){ stack st;//es wird direckt eine dtrucktur erzeugt mi dem namen st st.groese=0; //es wird direckt auf die struchtur zugegriffen und die groese gesetzt st.next=NULL; return st; } void push(stack *stack, int value){ LItem *neu=(LItem*) malloc(sizeof(LItem*)), *temp; neu->value=value; neu->next=NULL; if(stack->next==NULL){ stack->groese=1; stack->next=neu; } else{ stack->groese=stack->groese+1; //größe wird um eins erhöht temp=stack->next; //temp zeiger und den stack zu ordnen stack->next=neu; neu->next=temp; } } int pop(stack *st){ if(st->next!=NULL){ int z=(st->next)->value; LItem *temp=(st->next)->next; st->groese=st->groese-1; free (st->next); st->next=temp; return z; } else return 0; } void delitestack(stack *st){ if(st->next!=NULL){ LItem *temp; st->groese=st->groese-1; temp=st->next->next; free(st->next); st->next=temp; delitestack(st); } }
-
Ich habe es jetzt nur gelesen, nicht debugged, aber mich dünkt in Zeile 53 sollte es
temp=st->next->next;
heißen.
-
Ja stimmt.
Danke,
habs geändert das Program läft jetzt durch.Aber benutze ich den das free() richtig, übergebe ich dem die richtigen Zeiger?
Kann das nicht überprüfen.
Wenn ich mit dem Debugger an die Zeile 42 komme kriege ich diese FehlermeldungNo source available for "ntdll!TpWaitForAlpcCompletion() at 0x77110475"
Ich benutze Wascana 1.0 als Entwicklungsumgebung.
-
Das war eigentlich der einzige Fehler, der mir auffiel. Kannst du mal ein vollständiges, ausführbares Beispiel (bis auf den Fehler) zeigen? Dann können Helfer selber mal mit dem Debugger durchgehen.
-
Sicher, dass die Rekursion richtig terminiert?
-
Gibt ein Tipp, terminiere ich den LIFO richtig?
-
LItem *neu=(LItem*) malloc(sizeof(LItem*)), *temp;
Das noch Fakt? Wenn ja, geh dir nochmal gedanklich durch was da passiert.
Bei sowas hat mir immer Valgrind gute Dienste geleistet.P.S. Cast in C nicht gern gesehen.
Edit: Hab mir den Rest auch nochmal durchgehen lassen(Referenz Programmcode erster Post "18:46:05 25.11.2011"):
- Vermisse ein "LItem *temp" in push-Function.
- Habe schmunzeln müssen, bis ich delitestack, als deletestack ausgemacht habe. Funktional handelt es sich ja auch weniger um eine Stackveredelung etc.Weiter hab ich nichts finden können, aber kannst ja noch mit Debugger und Valgrind etc. durchrödeln lassen.
-
Von delitestack war für mich gedanklich kein weiter Weg zum delitesnack - hier in Bayern zählt ein Leberkäs-Brötchen zu diesen ausgewählten Köstlichkeiten und schon waren die Prioritäten von memhandling auf magenfilling verschoben
-
Ich schwör ja auf Pizzaleberkäs' Brötchen... aber naja, bin ja auch Franke