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.