Verkettete Liste: Segmentation Fault



  • Hallo,
    ich lerne ergänzend zu meinem Studium C++. In einer Übungsaufgabe will ich eine einfach verkettete Liste realisieren. Ich habe es jetzt schon auf tausend verschiedene Weisen versucht, aber ich bekomme immer den "segmentation fault". Ich nehme also an, dass meine Pointer irgendwo hinzeigen, wo sie nicht sollen.
    Kann mir irgend jemand meinen Fehler sagen? Danke im Voraus.

    Ich habe zuerst eine abstrakte Liste erstellt, die dann irgendwelche Objekte aufnehmen soll. Der Fehler tritt schon beim Einfügen in die Liste auf

    Hier der Code:

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #include <string>
    
    using namespace std;
    
    class Element {
    		friend class List;
    	private:
    		Element * next;  //Pointer auf nächstes Element
    
    	public:
    		Element() : next(0) {} //Soll immer auf "0" initialisiert werden
    		virtual void print() const=0;  //rein virtuelle Funktion
    
    	protected:
    		inline void insert(Element * position) {  //Element an Position einfügen
    			next = position->next;
    			position->next = this;
    		}
    };
    
    class List {
    	private:
    		Element * head;  //Kopfzeiger der Liste
    
    	public:
    		List() : head(0) {} //Kopzeiger immer mit "0" initialisieren
    		void insert(Element * pointer) {pointer->insert(head);}
    		void print() const {
    			Element * ep;
    			for(ep = head->next; ep != 0; ep = ep->next) {ep->print();}
    		}
    };
    
    class Test : public Element {  //Testklasse von Basisklasse "Element" abgeleitet
    	private:
    		int data;  //irgendwelche Daten (völlig nebensächlich)
    
    	public:
    		virtual void print() const {
    			cout << "\ndata:  " << data << endl;
    		}
    		Test(int a) : data(a) {}
    
    };
    
    int main(){
    	cout << "\n DATA:   ";
            int in;
    	cin >> in;
    	Test * testelement = new Test(in);
    	List list;
            list.insert(testelement);
    
    	list.print();
    
    	cout << "\n OUTPUT: ";
    	return 0;
    }
    


  • Geh mal Schritt für Schritt durch, was beim Einfügen des allerersten Elements passiert, d.h. wenn du die Zeiger umbiegst um das Element hinter "head" einzuhängen.
    Du kannst das auch direkt mit einem Debugger verfolgen was dann passiert 🙂



  • Schau dir mal an, was beim ersten Aufruf von List::insert() passiert



  • Du willst C++ lernen, aber für mich sieht es aus, als wäre Dein Problem, dass Du mit ganz gewöhnlichen Pointern schon ein Verständnisproblem hast. Vielleicht verwirrt Dich dabei der C++ /O Kladderadatsch mehr, als er hilft.

    Gehörst Du zu der Generation, die erst im Studium richtig Programmieren lernt? Und das evtl. mit einer Sprache wie Java, wo Pointer "böse" sind?

    Egal. Reduziere das Problem erstmal auf das Wesentliche, mach eine minimalistische C Lösung (wegen mir auch C++ ohne OO).

    Wo willst Du einfügen? Vorne oder hinten? Gibt es jeweils Sonderfälle zu beachten?
    Z.B. wenn die Liste noch leer ist?

    Ich will Dich nicht entmutigen, aber doppelt verkettete Listen (evlt. mit sortiertem Einfügen) sind dann nochmal etwas hakeliger. Also erstmal auf das Wesentliche konzentrieren und das Kernproblem korrekt lösen! Danach kann man es schön objektorientiert machen, oder auch generisch.


Anmelden zum Antworten