verkettete liste - komplette liste löschen



  • Hallo!

    Habe ein kleines Problem mit einer einfach verketteten Liste.

    Ich kann die komplette Liste ab 3 Einträgen nicht mehr löschen. Das Programm stürzt ab.

    Hier die Funktion allesLöschen():

    void allesLoeschen(void)
    {
    	struct arbeitsstunden *zeiger, *zeiger1;
    
    	if(pStart != NULL)
    	{
    		zeiger = pStart->pNext;
    		while(zeiger != NULL)
    		{
    			zeiger1 = pStart->pNext->pNext;
    			pStart->pNext = zeiger1;
    			free(zeiger->pNext);
    			free(zeiger);
    			zeiger = zeiger1;
    		}
    
    		free(pStart->pNext);
    		free(pStart);
    		pStart = NULL;
    		printf("Liste geloescht\n");
    	}
    	else
    		printf("Keine Liste zum Loeschen vorhanden\n");
    }
    

    Wie gesagt, ab 3 Einträgen und mehr stürzt das Programm mit der Meldung:
    "Debug Assertion Failed!
    .
    .
    Expression: _CrtIsValidHeapPointer(pUserData)
    .
    .
    "

    Bin noch Anfänger, daher hab ich keine Ahnung, was zu tun ist.

    Vielen Dank im Voraus!

    mfg roland

    ps: der komplette programmcode wäre zu lang, um ihn hier hinein zu kopieren.
    kann ihn aber verschicken, wenn interesse besteht.



  • void allesLoeschen(void)
    {
        struct arbeitsstunden *first,
                               *temp;
    
        if( !first )
            printf( "Keine Liste..." );
        while( first )
        {
            temp = first;
            first = first->next;
            free(temp);
        }
    }
    

    Also 100% sicher bin ich mirnicht aber das sollte es gewesen sein...
    Hab gerade keine Zeit es zu testen xD

    Was du da macsht ist einfach:

    solange erstesElement:
        zeige hilfspointer auf erstes element,
        zeige mit pointer (der immer auf erstes element zeigt) auf das 2te element,
        lösche das element worauf der hilfspointer zeigt... //der pointer der auf  das "2te" element zeigt, ist nun automatisch das erste xD
    


  • äh. das ist ein bisschen kompliziert, was du gemacht hast...
    mach es dir leicht. gehe die liste durch und lösche den eintrag hinter dir. für eine einfach verkettete list (keine ahnung, was du hast, aber ich nutze mal nur sachen, die du auch selber genutzt hast.) sieht es so aus:

    zeiger=pStart;
    while (zeiger->pNext)
    {
    	zeiger1=zeiger;
    	zeiger=zeiger->pNext;
    	free(zeiger1);
    }
    free(zeiger);
    


  • ghorst schrieb:

    äh. das ist ein bisschen kompliziert, was du gemacht hast...

    Meintest du mich? Hab ja iwi das selbe.. nur das letzt free vergesesen xD



  • vielen dank!

    hat funktioniert!

    war echt einfacher, als ich dachte ^^

    mfg roland



  • lippoliv schrieb:

    ghorst schrieb:

    äh. das ist ein bisschen kompliziert, was du gemacht hast...

    Meintest du mich?

    nein. du bist zwar der direkt vor mir stehende, aber trotz meiner recht flinken finger, schaffe ich es nicht, den text in 26s zu tippen. 😉 war also an amokrabbit gerichtet.



  • Jo stimmt xD
    Wobei das tippen in 26 Sekunden nich das Problem sein sollte, eher das überlegen xD



  • Bei mir ist das Problem das er nicht die komplette Liste Löscht.
    Weiß einer wo das Problem ist?
    #include <iostream>
    #include <iomanip> // Zur Formatierung ins besondere von Zahlenausgaben
    #include <fstream> // Für das Dateihandling
    #include <stdlib.h> // Benoetigt für den Befehl exit

    using namespace std;

    //Daten Struktur//
    struct Bauteil{
    string Bauteilname;
    string Lieferant;
    double Preis;
    int Stueckzahl;
    Bauteil* next; // Zeiger
    };
    //------------------------------------------------------------------------------//
    //Funktion//
    void ausgabe(Bauteil* b){
    cout<<setw(25)<<left<<b->Bauteilname;
    cout<<setw(25)<<b->Lieferant;
    cout<<setw(25)<<right<<fixed<<setprecision(2)<<b->Preis;
    cout<<setw(25)<<b->Stueckzahl<< endl;
    }
    //------------------------------------------------------------------------------//
    //Funktion
    Bauteil* eingabe(Bauteil* Anfang){
    Bauteil *bt=new Bauteil;

    cout<<"Bauteil:"; cin>>bt->Bauteilname;
    cout<<"Lieferant:"; cin>>bt->Lieferant;
    cout<<"Preis:"; cin>>bt->Preis;
    cout<<"Stueckzahl:"; cin>>bt->Stueckzahl;

    bt->next=Anfang;
    return bt;
    }
    //------------------------------------------------------------------------------//
    //Funktion
    void liste_drucken(Bauteil* Eintrag){

    cout<<setw(25)<<left<<"Bauteil";
    cout<<setw(25)<<"Lieferant";
    cout<<setw(25)<<right<<"Preis";
    cout<<setw(25)<<"Anzahl" << endl;

    while (Eintrag != NULL){
    ausgabe(Eintrag);
    Eintrag=Eintrag->next;
    }

    }
    void liste_speichern(Bauteil* Eintrag){
    ofstream d1("bauteil.txt");

    d1<<setw(25)<<left << "Bauteil";
    d1<<setw(25)<< "Lieferant";
    d1<<setw(25)<<right << "Preis";
    d1<<setw(25)<< "Anzahl" << endl;

    while(Eintrag!=NULL){
    d1<<setw(25)<<left <<Eintrag->Bauteilname;
    d1<<setw(25)<< Eintrag->Lieferant;
    d1<<setw(25)<<right<<fixed<<setprecision(2) <<Eintrag->Preis;
    d1<<setw(25)<< Eintrag->Stueckzahl<< endl;
    Eintrag=Eintrag->next;
    }
    d1.close();

    };
    void liste_loeschen(Bauteil* b){
    Bauteil*a;
    while(a->next!=NULL){
    a=b->next;
    b->next=a->next;
    delete a;
    }
    }
    int main(){
    Bauteil *root=NULL;

    root = eingabe( root );
    root = eingabe( root );
    root = eingabe( root );
    liste_speichern( root );
    liste_drucken( root );
    liste_loeschen(root);
    liste_drucken( root );
    return 0;
    }



  • gavergofie schrieb:

    Weiß einer wo das Problem ist?

    Du grabst einen 10 Jahre alten Thread aus.
    Du bist im falschen Unterforum, da du in C++ programmierst. (hier ist C angesagt)
    Du benutzt keine Code-Tags. Dadurch geht die Formatierung flöten und dein Code ist schlecht lesbar.
    Du löscht b nicht und deine löschen-Funktion ist zu kompliziert.


Anmelden zum Antworten