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!!


Anmelden zum Antworten