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 vermutlichptr=ptr->next;
heißen - die jetzige Version führt zu einer Endlosschleife, wenn du die obigen Punkte in Ordnung gebracht hast.
-
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.