Doppelt verkettete Liste

Ferris
Hallo, smile smile

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: Augenzwinkern
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: böse
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. verwirrt

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 habe versucht alles so gut und so verständlich wie möglich zu kommentieren.

Hier der Source für die main():
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
#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:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
#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;

}




Vorab schon mal vielen Dank für eure Mühe
Ferris
Neutron Games
Hi,

Was mir aufgefallen ist, ist die Structur Enum. Sie schein nicht korrekt zu sein.

Du hast folgendes drine stehen:

code:
1:
enum { NONE = 0,FIRST, LAST, MIDDLE };


Ich würde für FIRST LAST und MIDDLE auch jeweils ein Wert angeben.

code:
1:
enum {NONE = 0, FIRST = 1, MIDDLE = 2, LAST = 3};


Sonst wird er nie richtig eine Liste Erstellen können.