einfach verkettete Listen



  • Hey ich habe ein Problem beim ausgeben von verketteten Listen

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct test {
           char name [255];
           int alter;
           struct test *next;
    };
    
    struct test *anfang;
    
    void ausgabe (void)
    {
         struct test *ptr=anfang;
         int i=1;
         while (ptr!=NULL)
         {     
              printf("Name=%s\n",ptr->name);
              printf("Alter=%d\n",ptr->alter);
              ptr=anfang->next;
    
        }
    }
    
    int main(int argc, char *argv[]) {
    
        struct test *zeiger;
    
        anfang=malloc(sizeof(struct test));    
        strcpy(anfang->name,"Maximilian");
        anfang->alter=17;
    
        zeiger=anfang->next;
        zeiger=malloc(sizeof(struct test));    
        if (zeiger == NULL)
            printf("malloc lief schief!\n");
        strcpy(zeiger->name,"Andre");
        zeiger->alter=16;    
    
        zeiger=zeiger->next;
        zeiger=malloc(sizeof(struct test));
        strcpy(zeiger->name,"Samu");
        zeiger->alter=16;
        zeiger->next=NULL;
    
       ausgabe();   
    
       system("PAUSE");
    }
    

    Wenn ich das Programm starte wird nur der erste Eintrag angezeigt und anschließend kommt "programm.exe hat ein Problem festgestellt und muss beendet werden."

    Was mache ich falsch? 😕



  • Erstens schreibst du nie etwas in anfang->next, d.h. dort wird vermutlich irgendein Müllt drinn stehen.
    Zweitens sind die Zuweisungen in Zeile 44/45 unsinnig. "zeiger" hat keinen Bezug zu deiner Liste. Korrekt wäre es so rum:

    zeiger = malloc(...);
    ...
    anfang->next = zeiger;
    

    Drittens solltest du globale Variablen vermeiden - und das Einfügen von Elementen auch in einer Funktion kapseln.
    Viertens: In Zeile 24 sollte es vermutlich ptr=ptr->next; heißen - die jetzige Version führt zu einer Endlosschleife, wenn du die obigen Punkte in Ordnung gebracht hast.


  • Mod

    Zeile 44 benutzt du einen uninitialisierten Wert. Die Reihenfolge soll wohl eher sein, dass du anfang->next den malloc Wert zuweist und dann zeiger anfang->next zuwweist. Genauso bei den späteren Einfügeanweisungen.

    Und in Zeile 24 sollte prt->next genommen werden.

    Pro-Tipp: Schreib eine Funktion zum Einfügen.

    edit: Zu langsam.



  • void ausgabe (void)
    {
         struct test *ptr=anfang;
         int i=1;
         while (ptr!=NULL)
         {
              printf("Name=%s\n",ptr->name);
              printf("Alter=%d\n",ptr->alter);
              ptr=ptr->next;
    
        }
    }
    
    int main(int argc, char *argv[]) {
    
        struct test **zeiger;
    
        anfang=malloc(sizeof*anfang);
        {
          struct test tmp={"Maximilian",17};
          *anfang = tmp;
        }
    
        zeiger = &anfang->next;
        *zeiger=malloc(sizeof**zeiger);
        {
          struct test tmp={"Andre",16};
          **zeiger = tmp;
        }
    
        zeiger = &(*zeiger)->next;
        *zeiger=malloc(sizeof**zeiger);
        {
          struct test tmp={"Samu",16};
          **zeiger = tmp;
        }
    
       ausgabe();
    
       return 0;
    }
    

    Speicherfreigabe fehlt noch bei dir, auch benutzt man nur selten globale Variablen.



  • danke für eure antworten 😉 Ja ich habe jetzt verstanden wo der Fehler liegt.


Anmelden zum Antworten