Einfach verkettete Liste, Problem bei Ausgabe der Daten



  • Hallo,

    habe ein Problem mit meiner verketteten Liste. Das Einlesen der Listenelemente funktioniert, aber die Ausgabe auf dem Bildschirm nicht. Leider weis ich nicht so recht wo ich ansetzen soll. Hab es mit Hilfe von Beispielen schon versucht.

    #include <stdio.h>
    #include <stdlib.h> 
    #include <string.h>
    
    typedef struct liste {
       int daten;
       struct liste *pnext;
    } Liste;
    
    void eingabe();
    void ausgabe();
    
    void eingabe() 
    {
       int i, anzahl;
       Liste *pstart, *p;
    
       pstart = NULL;
    
       printf("\nGewuenschte Elementanzahl: ");
       scanf("%d", &anzahl);
    
       printf("\n");
    
       for (i = 1; i <= anzahl; i++) {
    
          p = (Liste*)malloc(sizeof(Liste));
    
          printf("Listenelement %d: ", i);
          scanf("%d", &p -> daten);
    
          getchar();
    
          p -> pnext = pstart;
          pstart = p;    
       }     
    }
    void ausgabe() 
    {
       Liste *p, *pstart;
    
       p = pstart;
    
       while (p != NULL)
       {   
          printf("%d\n", p -> daten);
          p = p -> pnext;
       }  
    
    }
    int main()
    {  
       int auswahl;
    
       do {
    
          printf("\n1. Daten eingeben\n");
          printf("2. Liste ausgeben\n");
          printf("0. Programmende\n");
    
          printf("\nAuswahl: ");  
          scanf("%d", &auswahl);
    
          switch (auswahl) {
    
             case 0:
                     break;
             case 1: eingabe();
                     break;
             case 2: ausgabe();
                     break;
          }
    
       } while (auswahl != 0);
    
    }
    

    Danke.

    Gruß



  • Hallo,

    dein Problem ist, dass du zwar deine List in eingabe() anlegst, aber die dann auch da drin bleibt... bzw. der Pointer auf den Speicherbereich wird vernichtet (lokale Variablen werden am Ende einer Funktion zerstört).
    Daher sind die Variablen *pstart und *p, die du in ausgabe() deklariert hast, zwei gaaanz andere Pointer, die nichts von der Liste aus eingabe() wissen. Zudem sind sie uninitialisiert und ich bin etwas verwundert, warum du noch keinen Segmentation Fault bekommen hast 😉

    Also entweder du deklarierst die Liste global oder du reichst sie per Parameter herum. Ach so: Und Speicher, den man mit malloc/calloc/realloc angefordert hat, immer mit free wieder freigeben.

    MfG

    GPC



  • Würde die Liste gerne über die Parameter zugänglich machen, allerdings hab ich nicht genau verstanden wie dies funktionieren soll. Komme da immer wieder mit dem "Rückgabewert" den eine Funktion haben kann durcheinander. Ausserdem ist dies das Erste Mal dass ich mit Zeigern zu tun habe und muss sagen, dass ich da wirklich meine Probleme habe.



  • Jo, ich habe mal einen Artikel zum Thema Pointer geschrieben: http://www.c-plusplus.net/forum/viewtopic-var-t-is-124532.html

    Darin wird auch die Übergabe usw. erläutert. Nachdem du das gelesen hast, dürftest du das eigentlich selber hinkriegen (oder zumindest nahe dran sein).



  • Sorry, ich kapiers trotzdem nicht. Die in deinem Artikel angegebenen Beispiele sind allesamt leicht verständlich, aber ich bekomme den Bezug auf mein Problem nicht hin. Die strikte Trennung in zwei Unterfunktionen (Eingabe und Ausgabe) machen das Ganze so kompliziert.

    Diese Zeiger gehen mir wirklich auf den Zeiger...😡



  • lösch einfach diese zeile:

    Liste *pstart, *p;
    

    aus beiden funktionen und setz' sie vor den kopf der 'eingabe' funktion, dann könnte es klappen (wenn nicht noch andere fehler drin sind)
    🙂
    edit: sowas ähnliches hat GPC auch schon erwähnt...



  • Hallo,

    vielen Dank für die Hilfestellung. Das Programm funktioniert soweit, allerdings habe ich noch ein Problem mit der Ausgabe der Listenelemente. Diese sollen in korrekter Reihenfolge ausgegeben werden. In meinem Programm erfolgt nach dem Anlegen der Elemente, also

    Element 1: 24
    Element 2: 2
    Element 3: 87

    die Ausgabe in der Form:

    87
    2
    24

    Nun würde ich die Elemente gerne in umgekehrter Reihenfolge ausgeben lassen. Ich war der Meinung es würde reichen den entsprechenden Zeiger p auf pstart zu setzen, also an den Anfang der Liste. Leider klappt dies aber nicht so. Hier mal ein Auszug:

    void ausgabe() 
    {
       int r;
    
       printf("\n1. Normale Ausgabe (1)");
       printf("\n2. Umgekehrte Ausgabe (2)");
       printf("\n\nAusgabetyp: ");
       scanf("%d", &r);
    
          if(r == 1) {
    
             printf("\n"); 
             while (p != NULL) 
             {
                printf("%d\n", p -> daten);
                p = p -> pnext;
             } 
    
          } else if (r == 2) {
    
             p = pstart;
    
             printf("\n");
             while (p != NULL) 
             {
                printf("%d\n", p -> daten);
                p = p -> pnext;
             }
          }
    }
    

    ***EDIT***

    Hat sich erledigt.


Anmelden zum Antworten