Programm stürzt ohne Fehlermeldung ab



  • Ich übe mich gerade in dynamischen Datenstrukturen und habe eine ADT erschaffen mit einer doppel verketteten Liste als Element.

    Nachdem ich 50 Einträge in die Liste geschrieben habe, möchte ich diverse Zahlen herauslöschen.
    Leider stürzt das Programm jedesmal unerwartet ab, obwohl ich keine Fehlermeldungen beim Compilieren bekomme

    Hier der Code:

    Die Klasse

    #ifndef INTLIST_H_INCLUDED
    //#define NULL 0
    #define INTLIST_H_INCLUDED
    
    class intList
    {
        struct intElem
        {
            int info;
            intElem* pred;
            intElem* succ;
        };
    
        intElem* head;
    
        public:
    
        intList();
        ~intList();
        intElem* request() const {
            intElem* help=head;
            if(!help)
                return 0;
            int i=0;
            while(help)
            {
                help=help->succ;
                i++;
            }
            if(i>1000)
                return 0;
        }
    
        void free(intElem*);//gibt den speicher für el wieder frei
        void insert(int);//geordnetes einfügen eines wertes
        bool exists(int);//test auf vorhandensei eines elements
        void remove(int);//entfernt wert aus der liste
        void readList();//liest listenelemente aus
    };
    
    #endif // INTLIST_H_INCLUDED
    
    #include "intlist.h"
    #include <iostream>
    using namespace std;
    
    intList::intList() {
        head=NULL;
    }
    
    void intList::insert(int n){
        intElem* temp=new intElem;
        temp->info=n;
        if(!head)
        {
            temp->pred=NULL;
            temp->succ=NULL;
            head=temp;
        }
        else
        {
            intElem* help=head;
            while(help->succ && help->succ->info<n)
                help=help->succ;
            if(help->succ)
            {
                temp->succ=help->succ;
                help->succ->pred=temp;
                help->succ=temp;
                temp->pred=help;
            }
            else
            {
                help->succ=temp;
                temp->pred=help;
                temp->succ=NULL;
            }
        }
    }
    
    void intList::readList()
    {
        intElem* help=head;
        while(help)
        {
            cout<<help->info<<endl;
            help=help->succ;
        }
    }
    
    void intList::free(intElem* el)
    {
        el->pred->succ=el->succ;
        el->succ->pred=el->pred;
        delete el;
    }
    
    intList::~intList()
    {
        intElem* help=head;
        while(help)
        {
            head=head->succ;
            delete help;
            help=head;
        }
    }
    
    void intList::remove(int n)
    {
        intElem* help=head;
        while(help && !(help->info>n))
        {
            if(help->info==n)
            {
                if(!help->pred)
                {
                    intElem* temp=help;
                    help=help->succ;
                    delete temp;
                    head=help;
                }
                if(!help->succ)
                {
                    intElem* temp=help;
                    help->pred->succ=NULL;
                    delete temp;
                }
                else
                {
                    intElem* temp=help;
                    help->pred->succ=help->succ;
                    help->succ->pred=help->pred;
                    delete temp;
                }
    
            }
            help=help->succ;
        }
    }
    
    bool intList::exists(int n)
    {
        intElem* help=head;
        while(help)
        {
            if(help->info==n)
                return true;
            help=help->succ;
        }
        return false;
    }
    

    und hier die Main-Funktion

    #include <iostream>
    #include <string>
    #include "intList.h"
    using namespace std;
    
    int main()
    {
        intList bumm;
        for(int i=2;i<51;i++)
        {
            bumm.insert(i);
    
        }
        bumm.readList();
        cin.get();
        int k=0;
        string jo="";
        for(k=2;k<=50;k++) {
            if(k%2==0)
                bumm.remove(k);
        }
        for(k=2;k<=50;k++) {
            if(k%3==0)
                bumm.remove(k);
        }
        for(k=2;k<=50;k++) {
            if(k%5==0)
                bumm.remove(k);
        }
        bumm.readList();
    /*    do
        {
        cout<<"loeschen k=";
        cin>>k;
        bumm.remove(k);
        bumm.readList();
        cout<<endl<<" nochmal? j n"<<endl;
        cin>>jo;
        }while(jo[0]=='j');
     */ return 0;
    }
    

    ich wäre euch sehr dankbar, wenn ihr mir meine(n) Fehler aufschlüsselt, da ich langsam verzweifel 🙂



  • Warst du schon im Debugger?



  • Also erst mal ist es ja klar dass der Compiler dir keine fehlermeldung gibt, wenn das Programm kompiliert ist. Würde er nen Fehler melden, würde er au nicht kompilieren;-)
    Zu deinem Programm, da ich leider gerade nur mein smartphone zur
    hand habe, habe ich keine Lust alles zu durchforsten, aber jetzt wäre für dich der perfekte Zeitpunkt um den Umgang mit einem Debugger zu erlernen.
    Aber es wird sich sicherlich gleich auch jemand finden der dir genaueres sagen kann.

    LG freeG

    Edit:

    EOutOfResources schrieb:

    Warst du schon im Debugger?

    Gleicher Gedanke, dauert bloß so ewig mim Handy 😉 😃



  • if(!help->pred) 
                { 
                    intElem* temp=help; 
                    help=help->succ; 
                    delete temp; 
                    head=help; 
                } 
                if(!help->succ) 
                { 
                    intElem* temp=help; 
                    help->pred->succ=NULL; 
                    delete temp; 
                } 
                else 
                { 
                    intElem* temp=help; 
                    help->pred->succ=help->succ; 
                    help->succ->pred=help->pred; 
                    delete temp; 
                }
    

    Schau dir mal an, welche der Bedingungen hier erfüllt sind, wenn du das auf das Kopf-Element anwendest (sowas nennt sich "double delete" und gehört zu undefiniertem Verhalten).


Anmelden zum Antworten