Problem mit Ausgabe der Elemnte einer doppelt verketteten Liste



  • Hi zusammen 🙂 ;

    ich hab ein prob. mit der Ausgabe der Elemente einer doppelt verketteten Liste.
    Das ganze sieht folgendermassen aus:
    1.)wenn die Liste gebaut wurde (3 Elemente), wird mit showElements die ganze Liste ausgegeben. 🙂

    2.)Dann wird mit mvListe.addElement(5, FIRST); die Zahl 5 als erstes Element eingefügt, dann wird wieder die ganze Liste ausgegeben. 🙂

    3.)Mit addElement(10, LAST); wird die Zahl 10 als letztes Element in die Liste eingefügt und wieder die ganze Liste ausgegeben. 😞

    Bei 1 und 2 funktioniert das, beim 3. Mal wird aber nur das erste und das letzte Element ausgegeben 😕 😕 😕

    Ich häng da schon ewig dran und find den fehler net was mach ich bloss falsch ?
    Ich hab den Source so gut wie möglich angehängt 😉

    Code in der main :

    #include "List.h"
    
    void main()
    {
    	mvList mvListe;
    	int i;
    	int j = 1;
    
    	cout << "Liste ist leer !!! ==> Liste mit 3 Elementen bauen" << endl;
    
    	for (i = 0; i < 3; i++)
    	{
    		mvListe.addElement(j++);
    	}
    	mvListe.showElements();                 // funktioniert
    
    	cout << "Neues Erstes Element einfuegen" << endl;
    	mvListe.addElement(5, FIRST);
    	mvListe.showElements();                 // funktioniert
    
    	cout << "Neues letztes Element einfuegen" << endl;
    	mvListe.addElement(10, LAST);
    	mvListe.showElements();                 // funktioniert nicht
    
    }
    

    Und hier der Code für die List.h:

    #include <iostream>
    using namespace std;
    
    enum { NONE = 0,FIRST, LAST, MIDDLE };
    
    class mvList
    {
    private:
    
    //*************************************** SRTUCT ERSTELLEN *************************************
    	struct Listenknoten
    	{
    		int data;
    		Listenknoten *next;
    		Listenknoten *prev;
    	};
    
    public:
    
    //******************************* ZEIGER AUF STRUCT ERSTELLLEN *********************************
    	Listenknoten *neu;
    	Listenknoten *head;
    	Listenknoten *tail;
    	Listenknoten *current1;
    	Listenknoten *current2;
    	int			  counterElements;
    
    //********************************** KONSTRUKTOR / DESTRUKTOR **********************************
    	mvList()
    	{
    		neu				=	NULL; // Zeiger mit Null initialisieren
    		head			=	NULL; // Zeiger mit Null initialisieren
    		tail			=	NULL; // Zeiger mit Null initialisieren
    		current1		=	NULL; // Zeiger mit Null initialisieren
    		current2		=	NULL; // Zeiger mit Null initialisieren
    		counterElements =	0;
    	}
    
    	~mvList()
    	{
    	}
    
    //******************************* PROTOS DER MEMBERFUNKTIONEN **********************************
    	void showElements();								
    	void addElement(int wert, int , int);
    	void addNewFirstElement(int wert);
    	void addNewLastElement(int wert);	
    };
    
    void mvList::addElement(int wert, int atPos = NONE, int pos = 0)
    {
    	if (atPos != NONE)
    	{
    		switch(atPos)
    		{
    		case FIRST:	addNewFirstElement(wert);
    			break;
    		case LAST:	addNewLastElement(wert);
    			break;
    
    		default:
    		    break;
    		}
    	}else
    	{
    		addNewLastElement(wert);
    	}
    }
    //**********************************************************************************************
    //*************************************** INSERT AFTER *****************************************
    void mvList::addNewLastElement(int wert)
    {
    	if (head == NULL)					// Wenn die Liste leer ist
    	{
    		addNewFirstElement(wert);		// dann ERSTES Element hinzufügen
    	}  else {							// ansonsten
    
    		neu = new Listenknoten;			// ein Element anhängen (INSERT AFTER)
    		tail->next = neu;
    		neu->next  = NULL;
    		neu->prev = tail;
    		tail = neu;
    
    		neu->data = wert;
    		counterElements++;
      }
    
    cout << "Elemente: " << counterElements;
    
    }
    //**********************************************************************************************
    //****************************** NEUES ERSTES ELEMENT EINFÜGEN *********************************
    void mvList::addNewFirstElement(int wert)
    {
    	neu = new Listenknoten;
    	neu->prev = head;
    	neu->next = head;
    	head = neu;
    	tail = neu;
    
    	neu->data = wert;
    	counterElements++;
    	cout << "Elemente: "  << counterElements;
    
    }
    
    //**********************************************************************************************
    //************************************** ELEMENTE ANZEIGEN *************************************
    void mvList::showElements()
    {
    	int counter = 1;
    	current1 = head;
    	while (current1 != NULL )
    	{
    		cout << "\nWert an Position " << counter++ << " = " << current1->data;
    		current1 = current1->next;
    	}
    	cout << endl << endl << endl;
    	if(head == NULL)
    	{
    		cout << "\nKeine Elemente in der Liste !!!" << endl << endl;
    	}
    
    }
    

    Danke schon mal für eure Mühe vorab 😉
    ShadowEater



  • ERstmal solltest du Variablen, die nur lokal benötigt werden, auch nur lokal definieren ("neu" und "current1" als Member mitzuschleifen ist nur unnötiger Ballast).

    Zweitens sieht mir addNewFirstElement() etwas verunglückt aus - der Vorgänger des neuen Elements ist das zweite Element und dessen Vorgänger wird nicht angepasst.

    Drittens solltest du das Ganze mal debuggen und die Zeigerwerte mitverfolgen, denn irgendwo werden noch weitere Zeiger umgebogen - die dein Problem auslösen.



  • Hi CStoll,

    hab ich schon probiert aber wie gesagt ich find den Fehler nach langem suchen nicht, vielleicht hat ja jemand ne konkretere Idee worans liegen könnte ???

    SE



  • Heyho,
    ich habe hier jetzt nicht lange geguckt, aber erstmal solltest du im Destruktor deiner Liste die vorher mit new allokierten Entries freigeben(delete!), oder du solltest einen garbage collector implementieren.

    Zusätzlich ist mir dies suspekt:

    void mvList::addNewFirstElement(int wert)
    {
        neu = new Listenknoten;
        neu->prev = head;
        neu->next = head;
        head = neu;
        tail = neu;
    
        neu->data = wert;
        counterElements++;
        cout << "Elemente: "  << counterElements;
    
    }
    

    erstmal setzt du head und tail auf das neue Element, was definitiv (?) falsch ist. Zusätzlich setzt du prev und next auf das gleiche Element, was auch falsch ist (?).
    Ich würde sagen, dass es so richtig ist:

    void mvList::addNewFirstElement(int wert)
    {
    neu = new Listenknoten;
    neu->prev = NULL;
    neu->next = head;
    neu->data = wert;
    head=neu;
    if(!tail)
    {
    tail=neu;
    }
    }
    

    Wiegesagt, ich habe nicht lange geguckt (muss hier so eine behinderte Pädagogikaufgabe eigentlich machen 😞 ) und daher bin ich mir nicht sicher!



  • D*A*N*K*E* Trundle0x7e@scheissSchule,

    jetzt klappts !

    Wenn ich Dir bei deiner Aufgabe helfen kann ?!
    SE 😉



  • Ich helf doch gerne 🙂

    Btw. Nö, du musst mir nicht helfen, ich schaff das schon alleine. Ist nur unter meinem Niveau (der Unterricht). Jede Stunde PC Raum und Wikipedia...



  • Macht Du grad ne Lehre oder so ???
    oder studierst Du Lehramt ?

    SE



  • ShadowEater schrieb:

    Macht Du grad ne Lehre oder so ???
    oder studierst Du Lehramt ?

    SE

    Ich geh zur Schule (Gymnasium) 😉



  • Hab Dir grad ne Mail geschrieben 😉

    ShadowEater


Anmelden zum Antworten