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 falsch 😞

    Ausschnitte 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 übertragen

    Edit: 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);
    	}
    }
    

  • Mod

    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 Fehlermeldung

    No source available for "ntdll!TpWaitForAlpcCompletion() at 0x77110475"

    Ich benutze Wascana 1.0 als Entwicklungsumgebung.


  • Mod

    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 😃


Anmelden zum Antworten