Doppelt verkette Liste: Ausgabe stimmt nicht
-
Hallo Community,
meine doppelt verkettete Liste gibt nicht das aus was sie soll.
Gebe ich die Zahlen 1,2 und 3 ein, dann werden sie in originaler Reihenfolge korrekt ausgegeben. In umgekehrter Reihenfolge steht dann aber 0,3,2 da. Könnt Ihr mir helfen warum das so ist?#include <stdio.h> #include <stdlib.h> /* * Definition des Listenknotentyps */ struct DListNode { double m_data; struct DListNode * m_next; struct DListNode * m_prev; }; int main () { /* Temporaere Variable zur Aufnahme der Eingabedaten */ double tem_data; double summe =0; int count=-1,i,x=1,y; /* Zeiger auf Anfang und Ende der Liste */ struct DListNode * list_begin = NULL; struct DListNode * list_end = NULL; /* Temporaerer Zeiger auf Listenknoten */ struct DListNode * tem_node; do{ count=count+1; printf("Zahlen eingeben : \n"); scanf("%lf",&tem_data); /* Speicher fuer neuen Listenknoten anfordern */ tem_node = malloc (sizeof (struct DListNode)); /* Auf Speicherfehler testen ... */ if (tem_node == NULL) { fprintf (stderr, "\aSpeicherfehler!\n"); exit (1); } /* Anwendungsinformation eintragen */ summe=summe+tem_data; tem_node -> m_data = tem_data; /* Der Vorgaenger des neuen Knotens ist der bislang letzte Knoten */ tem_node -> m_prev = list_end; /* Der Nachfolger des letzten Knotens ist nicht definiert, also NULL */ tem_node -> m_next = NULL; if (list_begin == NULL) { /* Falls noch kein Listenanfang definiert ist, dann ist der gerade angelegte Knoten der Anfang der Liste */ list_begin = tem_node; } else { /* Der Nachfolger des bislang letzten Knotens ist der gerade neu angelegte Knoten */ list_end -> m_next = tem_node; } /* Der gerade neu angelegte Knoten ist nun der letzte Knoten */ list_end = tem_node; }while(tem_data != 0); // soll abbrechen wenn Zahl 0 ist printf("count = %d \n",count); /* Ausgabe vorwaerts ... */ tem_node = list_begin; printf("Summe = %1.1lf\n",summe); printf("Ausgabe vorwaerts: \n"); for(i=0;i<count;i++) { printf ("%1.1f ", tem_node -> m_data); /* Zum nachsten Knoten weitergehen ... */ tem_node = tem_node -> m_next; } printf("\n"); /* Ausgabe rueckwaerts ... */ tem_node = list_end; printf("Ausgabe rueckwaerts: \n"); for(y=0;y<count;y++) { printf ("%1.1f ", tem_node -> m_data); /* Zum nachsten Knoten weitergehen ... */ tem_node = tem_node -> m_prev; } printf("\n"); }
-
Ich habs mal grob überflogen:
Schau dir mal deine Abbruchbedingung für die Eingabe der Zahlen an.
Wenn du 0 eingibst, so soll die Eingabe beendet werden. Allerdings schreibst du den Wert 0 trotzdem mit in deine Liste als regulären Wert rein.do { printf("Zahlen eingeben : \n"); scanf("%lf",&tem_data); if(tem_data != 0) { // Speicher reservieren und Wert eintragen [...] ++count; } }while(tem_data != 0);
Für die Ausgabe zieh ich persönlich eine while-Schleife for.
tem_node = list_begin; while(tem_node != NULL) { printf ("%1.1f ", tem_node -> m_data); /* Zum nachsten Knoten weitergehen ... */ tem_node = tem_node -> m_next; }
Außerdem wird dein Speicher am Ende des Programmes nicht freigegeben. > free verwenden.
-
Du gibst doch eine 0 ein damit die Eingabe beendet wird. Die wird auch abgelegt.
Bei der Ausgabe sollte die Abbruchbedingen sein ob es einen Nachfolger in der Liste gibt und nicht i< irgendetwas.
Speicher Freigeben nicht vergessen!
Auch hier musst du allen Speicher freigeben:if (tem_node == NULL) { fprintf (stderr, "\aSpeicherfehler!\n"); exit (1); }
Wenn das beim letzten Element passiert musst du alle anderen auch freigeben.
-
Danke für Eure Antworten,ich versuche das umzusetzen!!