000
07.09.2006, 13:02 Uhr
WindDancer1
|
Hallo,
Vorab erst mal, ich weiss dass es zig Möglichkeiten gibt verkettete Listen zu bauen, selbstverständlich auch nur mit Klassen als Container usw. mir geht es aber hier ums Verständnis der hier benutzten Art von verketteten Listen. Das Problem ist wahrscheinlich sehr gering aber ich dreh mich schon seit Tagen um mich selbst und find den Bug nicht!
Was Funktioniert: 1. Die Liste wird korrekt angelegt und ausgegeben auch die Anzahl der Elemente. 2. Das neue erste Element wird korrekt angelegt und die Liste wird ebenso korrekt ausgegeben auch die Anzahl der Elemente.
Was nicht funktioniert: Das neue letzte Element wird wahrscheinlich nicht richtig angelegt und deshalb wird das letzte Element nicht ausgegeben wenn die Liste ausgegeben wird.
Wird jedoch der obere Teil in der Funktion addNewLastElement(int wert) einkommentiert, in diesem Teil füge ich das letzte Element wie bei einer einfach verketteten Liste ein dann funktioniert alles.
Ich gehe übrigens davon aus dass sich schon ein Element in der Liste befindet (keine Plausibilitätsprüfung) da ich die Liste ja zuvor erstellt habe. Ich hab versucht alles so gut und verständlich wie möglich zu kommentieren.
Hier der Code für die main():
C++: |
#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();
cout << "Neues Erstes Element einfuegen" << endl; mvListe.addElement(5, FIRST); mvListe.showElements(); cout << "Neues letztes Element einfuegen" << endl; mvListe.addElement(10, LAST); mvListe.showElements(); }
|
Hier der Code für die List.h:
C++: |
#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() { 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
delete neu; delete head; delete tail; delete current1; delete current2; }
//******************************* PROTOS DER MEMBERFUNKTIONEN ********************************** void showElements(); void addElement(int wert, int , int); void addNewFirstElement(int wert); void addNewLastElement(int wert); void addNewMiddleElement(int wert, int atPosition); };
//********************************************************************************************** //******************************* ENTSCHEIDUNG FUNKTIONAUFRUFE *********************************
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 { addNewFirstElement(wert); } } //********************************************************************************************** //****************************** NEUES ERSTES ELEMENT EINFÜGEN *********************************
void mvList::addNewFirstElement(int wert) { neu = new Listenknoten;
neu->prev = NULL; neu->next = head; head = neu; neu->data = wert;
counterElements++; cout << "Elemente: " << counterElements; }
//********************************************************************************************** //************************* NEUES LETZTES ELEMENT EINFUEGEN INSERT AFTER ***********************
void mvList::addNewLastElement(int wert) {
neu = new Listenknoten; // // // current1 = head; // einkommentieren // while (current1->next != NULL) // einkommentieren // { // einkommentieren // current1 = current1->next; // einkommentieren // } // einkommentieren // neu->next = NULL; // einkommentieren // // einkommentieren // current1->next = neu; // einkommentieren // // einkommentieren // neu->data = wert; // einkommentieren
neu->next = NULL; // auskommentieren neu->prev = tail; // auskommentieren tail = neu; // auskommentieren neu->data = wert; // auskommentieren 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; } }
|
vielen vielen Dank für eure Mühe WinDDancer |