verkettete Liste



  • Hallo zusammen,

    mittlerweile habe ich diesen Code zustandegebracht, der auch brav kompiliert wird, aber aus irgendwelchen Gründen bekomme ich bei der Ausführung einen Speicherzugriffsfehler. Erkennt Jemand das Problem?
    Vielen Dank schonmal im Voraus...

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    struct datum
    {
    	int tag;
    	int monat;
    	int jahr;
    };
    
    struct angestellt
    {
    		string name;
    		string vorname;
    		struct datum geburtstag;
    		struct datum eingestellt;
    		long gehalt;
    };
    
    struct node
    {
    	struct angestellt data;
    	node* prev;
    	node* next;
    };
    
    struct liste
    {
    	node* first;
    	node* current;
    } ;
    
    liste init()		// Initialisierung der Liste.
    {
    	liste l;
    	l.first = NULL;
    	l.current = NULL;
    	return l;
    }
    
    liste empty(liste& l)	//Soll die Liste wieder löschen.
    {
    	delete& l;
    }
    
    angestellt dataErstellen()
    {
    	struct angestellt temp;		//temporäre Struktur-Instanz für die Übergabe
    	cout << endl << "Bitte den Namen des Mitarbeiters eingeben: ";
    	cin >> temp.name;
    	cout << endl << "Bitte den Vornamen des Mitarbeiters eingeben: ";
    	cin >> temp.vorname;
    	cout << endl << "Bitte den Geburtstag des Mitarbeiters eingeben (erst Tag, enter, Monat, enter, Jahr, enter): ";
    	cin >> temp.geburtstag.tag;
    	cin >> temp.geburtstag.monat;
    	cin >> temp.geburtstag.jahr;
    	cout << endl << "Bitte den Einstellugnstag des Mitarbeiters eingeben (erst Tag, enter, Monat, enter, Jahr, enter): ";
    	cin >> temp.eingestellt.tag;
    	cin >> temp.eingestellt.monat;
    	cin >> temp.eingestellt.jahr;
    	cout << endl << "Bitte das Gehalt des Mitarbeiters eingeben: ";
    	cin >> temp.gehalt;
    	cout << endl << endl << "Der Datensatz wird nun der Liste zugefügt";
    
    	return temp;
    }
    
    void einfuegen(liste& l, const angestellt& d)
    {
    	node* item = new node;
    	item->next = l.current->next;
    	item->prev = l.current;
    
    	item->next->prev = item;	//Überprüfung
    	item->prev->next = item;
    	l.current = item; 
    }
    
    int main()
    {
    	liste l = init();
    
    	einfuegen(l, dataErstellen());
    
    }
    


  • goetz schrieb:

    Erkennt Jemand das Problem?

    Ja.
    Das Problem ist dass Du Deinen Code nicht debuggst sondern den Weg des geringsten Widerstandes wähltst.

    //...
    liste init()        // Initialisierung der Liste.
    {
    //...
        l.current = NULL;
    //...
    }
    //...
    void einfuegen(liste& l, const angestellt& d)
    {
    //...
    	item->next = l.current->next;
    //...
    }
    //...
    int main()
    {
    	liste l = init();
    
    	einfuegen(l, dataErstellen());
    }
    

    => (l.current)->next <=> ((node*)NULL)->next => Crash

    Grüsse

    *this



  • Gast++ schrieb:

    Ja.
    Das Problem ist dass Du Deinen Code nicht debuggst sondern den Weg des geringsten Widerstandes wähltst.

    Das stimmt so nicht, ich sehe den Fehler wirklich nicht...

    Gast++ schrieb:

    //...
    liste init()        // Initialisierung der Liste.
    {
    //...
        l.current = NULL;
    //...
    }
    //...
    void einfuegen(liste& l, const angestellt& d)
    {
    //...
    	item->next = l.current->next;
    //...
    }
    //...
    int main()
    {
    	liste l = init();
    
    	einfuegen(l, dataErstellen());
    }
    

    => (l.current)->next <=> ((node*)NULL)->next => Crash

    Hmm...ehrlich gesagt verstehe ich nicht so ganz, was du damit meinst, was stimmte denn an meiner Zuordnung nicht? Der erste Node soll doch NULL sein und auf NULL zeigen bei einer Liste, oder nicht? STL sollen wir übrigens nicht einsetzen (Uni-Hausaufgaben) ... sorry, ich stehe gerade total auf dem Schlauch 😕



  • Das erklär ich Dir dann wenn Du mir erklärst wie Du den Code von Deinen OP überhaupt kompiliert zu haben meinst.

    Grüsse

    *this



  • Gast++ schrieb:

    Das erklär ich Dir dann wenn Du mir erklärst wie Du den Code von Deinen OP überhaupt kompiliert zu haben meinst.

    *this

    g++ ./dateinmane.cpp

    bei mir gibts da wirklich keine fehler... ich arbeite auf einer linux-maschine



  • g++ ./dateinmane.cpp
    

    Ach ja?

    liste empty(liste& l)    //Soll die Liste wieder löschen.
    {
        delete& l;
    }
    

    Und an dem fehlenden "return" stört sich der g++ nicht?

    Grüsse

    *this



  • Nein, tut er nicht...
    Aber das bringt mich gerade nicht weiter, da die Empty-Funktion nicht das war, was mich interessiert hat.

    Trotzdem, vielen Dank



  • goetz schrieb:

    Nein, tut er nicht...

    Sollte er aber. Versuch's mal mit "-Wall -pedantic".

    goetz schrieb:

    Aber das bringt mich gerade nicht weiter, da die Empty-Funktion nicht das war, was mich interessiert hat.

    Was dich interessieren sollte hat dir Gast++ vorher schon rausgesucht...



  • goetz schrieb:

    Nein, tut er nicht...
    Aber das bringt mich gerade nicht weiter, da die Empty-Funktion nicht das war, was mich interessiert hat.

    Trotzdem, vielen Dank

    Zeile 75: Du dereferenzierst einen Nullpointer.

    Grüsse

    *this


Anmelden zum Antworten