Ich bin eigentlich Java gewohnt und in C++ noch relativ unerfahren. Ich versuche gerade, in C++ eine einfach verkettete Liste zu implementieren, ganz simpel. Dazu habe ich eine Klasse MyList erstellt, die die Attribute "head" und "tail" aufweist, wobei es sich bei ersterem um ein Listenelement (Typ wstring) und bei letzterem um die referenzierte Restliste handelt.
Mit der Methode isEmpty() kann getestet werden, ob die Liste oder Teilliste noch leer ist (also ob "head" ein leerer String ist). Nun sollen über die Methode shift() Elemente am Anfang der Liste eingefügt werden. Die Methode printElements() soll alle Elemente einer Liste schön formatiert in einer Zeile ausgeben:
Bei einigen Testaufrufen von shift() und printElements() verhält sich das Programm nicht wie erwartet. Je nachdem, in welcher Reihenfolge ich die Methoden ausführe und seltsamerweise scheinbar auch abhängig davon, welche Debug-Statements mit "wcout" ich noch drin habe, bleibt das Programm wahlweise an irgendeiner Stelle hängen (Endlosschleife?) oder das zweite Element der Liste ist Kauderwelsch. Ich habe jetzt stundenlang versucht, das mit Konsolenausgaben zu debuggen, finde aber einfach keinen Fehler.
Habe ich bei der Referenzierung bzw. Dereferenzierung von "tail" irgendetwas falsch gemacht? Oder hat es möglicherweise mit den wstrings und wcouts zu tun?
Code:
class MyList {
public:
bool isEmpty();
void shift(wstring newElement);
void printElements();
private:
wstring head = L"";
MyList *tail = NULL;
};
Mit der Methode isEmpty() kann getestet werden, ob die Liste oder Teilliste noch leer ist (also ob "head" ein leerer String ist). Nun sollen über die Methode shift() Elemente am Anfang der Liste eingefügt werden. Die Methode printElements() soll alle Elemente einer Liste schön formatiert in einer Zeile ausgeben:
Code:
/* check if the list is empty */
bool MyList::isEmpty() {
return (this->head.empty());
}
/* add an element at the beginning of the list */
void MyList::shift(wstring newElement) {
if (!isEmpty()) {
// add the head to the existing tail
if (this->tail != NULL) {
(this->tail)->shift(this->head);
} else { // create a new tail
MyList newTail;
newTail.shift(this->head);
this->tail = &newTail;
}
}
this->head = newElement;
}
/* print the elements of the list on the console */
void MyList::printElements() {
if (isEmpty()) {
wcout << L"|" << endl;
} else {
wcout << L"| " << this->head << L" ";
if (this->tail != NULL) {
(this->tail)->printElements();
} else {
wcout << L"|" << endl;
}
}
}
Bei einigen Testaufrufen von shift() und printElements() verhält sich das Programm nicht wie erwartet. Je nachdem, in welcher Reihenfolge ich die Methoden ausführe und seltsamerweise scheinbar auch abhängig davon, welche Debug-Statements mit "wcout" ich noch drin habe, bleibt das Programm wahlweise an irgendeiner Stelle hängen (Endlosschleife?) oder das zweite Element der Liste ist Kauderwelsch. Ich habe jetzt stundenlang versucht, das mit Konsolenausgaben zu debuggen, finde aber einfach keinen Fehler.
Habe ich bei der Referenzierung bzw. Dereferenzierung von "tail" irgendetwas falsch gemacht? Oder hat es möglicherweise mit den wstrings und wcouts zu tun?