Problem: Doppelt Verkettete Liste
-
Ich hänge jetzt schon seit Wochen an diesem Problem.
Ich habe versucht eine Einfach Verkettete Liste in eine Doppelt Verkettete Liste
umzuschreiben.Das Programm sollte den Listeninhalt vorwärts und rückwärts ausgeben.
Das geht aber irgendwie nicht. Ich vermute mal, dass das am Zeiger "last" liegen muss ich komme aber nicht darauf was fehlt oder falsch ist.
/* ##################################
Doppelt verkettete Liste
###################################*/#include <iostream.h>
// Definition des Typs für die Elemente der Liste als Struktur
struct listenelement {
char daten[30];
listenelement* next;
listenelement* last;
};// Zeiger auf den Anfang der Liste
listenelement* listenanfang;// Hilfszeiger, um in der Liste wandern zu können
listenelement* hilfszeiger;// Funktion zum Einfügen von Elementen in die Liste
void einfuegen(char datenneu[30]) {
// Hilfszeiger an den Anfang der Liste setzen
hilfszeiger = listenanfang;
//Durch die Liste gehen, bis das letzte Element
//erreicht ist
while (hilfszeiger->next != NULL) {
hilfszeiger = hilfszeiger->next;
}
// Neues Element in die Liste einfügen
hilfszeiger->next = new(listenelement);
hilfszeiger->last = new(listenelement);
// Hilfszeiger auf das neue Element setzen// Daten im neuen Element eintragen
strcpy(hilfszeiger->next->daten,datenneu);}
// Alle Elemente der Liste ausgeben
void ausgeben() {
// Hilfszeiger auf den Anfang der Liste setzen
hilfszeiger = listenanfang;
// erstes Element ausgeben
cout << hilfszeiger->daten << "\n";
// Solange das Ende der Liste noch nicht erreicht ist :
while (hilfszeiger->next != NULL) {
//hilfszeiger auf nächstes Element setzen
hilfszeiger = hilfszeiger->next;
//Daten ausgeben
cout << hilfszeiger->daten << "\n";
}
}void ausgaberueckwaerts()
{
//Hilfsziger auf Listenanfang setzen
hilfszeiger = listenanfang;
//Durch die Liste gehen, bis das letzte Element
//erreicht ist
while(hilfszeiger->next != NULL)
{
hilfszeiger = hilfszeiger->next;
}
// Letztes Element ausgeben
cout << hilfszeiger->daten << "\n";//vom Ende nach vorne gehen und Elemente ausgeben
while (hilfszeiger->last != NULL) {
//Daten ausgeben
cout << hilfszeiger->daten<<endl;}
//erstes Element ausgeben
cout << hilfszeiger->daten<<endl;}
// Initialisieren der Liste
void init() {
//erstes Element erzeugen
listenanfang = new(listenelement);
//Daten in das erste Element schreiben
listenanfang->next = NULL;
strcpy(listenanfang->daten,"Element 0");
}// Liste leeren und speicher freigeben
void ende() {
//Solange noch Elemente in der Liste sind
while (listenanfang != NULL) {
//Hilfszeiger auf das erste Element der Liste
hilfszeiger = listenanfang;
//Zeiger für den Listenanfang auf das
//nächste Element setzen
listenanfang = listenanfang->next;
//Das herausgenommene Element löschen
delete(hilfszeiger);
}
}void main () {
init();
einfuegen("Element 1");
einfuegen("Element 2");
ausgeben();
ausgaberueckwaerts();
ende();char p[50];
cin.getline(p,50);
}
-
- Überarbeite bitte deinen Code mit Code-Tags. Sowas lesen sich hier die Wenigsten durch.
- WAS für ein Fehler tritt WANN auf?
-
Die Daten werden nicht rückwärts ausgegeben. Ich dachte eigentlich, dass
das an dem Zeiger "last" liegt; finde selbst aber keinen Fehler.
-
Du solltest in der Schleife Deinen hilfszeiger auch updaten. Ansonsten das nächste mal bitte Code-Tags, es ist sehr schwer sich so in dem Code zurecht zu finden.
-
auf den ersten blick würd ich sagen ist der fehler hier:
// Neues Element in die Liste einfügen hilfszeiger->next = new(listenelement); hilfszeiger->last = new(listenelement);//?? hier trennst du die kette nach hinten // Hilfszeiger auf das neue Element setzen
du bist auf dem letzten element und hängst eins hinten ran!
dann mußt du beim rangehangenen natürlich auf das bisher letzte zeigen. also:hilfzeiger->next->last = hilfszeiger;
-
Danke für die Infos haben mir echt geholfen.