Probleme mit verketteter Liste
-
Hallo allerseits,
Ich habe ein Problem mit dem gleich folgenden Programm:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 25 #define BEM 4096 struct daten{ char vorname[MAX]; char nachname[MAX]; char *bemerkung; struct daten *next; }; struct daten *first = NULL; void eingabe() { char vn[MAX], nn[MAX], anmerkung[BEM]; struct daten *str_ptr; printf("Vorname : "); fgets(vn, MAX, stdin); printf("Nachname : "); fgets(nn, MAX, stdin); printf("Bemerkung : "); fgets(anmerkung, BEM, stdin); if(NULL == first) { first = (struct daten *)malloc(sizeof(struct daten *)); if(NULL == first) { printf("Speicherplatzmangel...\n"); exit(0); } strcpy(first->vorname, vn); strcpy(first->nachname, nn); first->bemerkung = (char *)malloc(strlen(anmerkung)+1); if(first->bemerkung == NULL) { printf("Speichermangel...!!!\n"); exit(0); } strcpy(first->bemerkung, anmerkung); first->next = NULL; } else { str_ptr=first; while(str_ptr != NULL) str_ptr=str_ptr->next; str_ptr=(struct daten *)malloc(sizeof(struct daten *)); if(NULL == str_ptr) { printf("Speicherplatzmangel...\n"); exit(0); } strcpy(str_ptr->vorname, vn); strcpy(str_ptr->nachname, nn); str_ptr->bemerkung = (char *)malloc(strlen(anmerkung)+1); if(str_ptr->bemerkung == NULL) { printf("Speichermangel...!!!\n"); exit(0); } strcpy(str_ptr->bemerkung, anmerkung); str_ptr->next = NULL; } } void ausgabe() { struct daten *str_ptr = first; while(str_ptr != NULL) { printf("Vorname : %s",str_ptr->vorname); printf("Nachname : %s",str_ptr->nachname); /* Hier stürtzt das Programm ab, warum??? */ printf("Bemerkung: %s",str_ptr->bemerkung); str_ptr = str_ptr->next; } } int main() { int auswahl; do{ printf("-1- Neue Daten eingeben\n"); printf("-2- Alle Daten ausgeben\n"); printf("-3- Ende\n"); printf("Ihre Wahl: "); scanf("%d",&auswahl); getchar(); if(auswahl == 1) eingabe(); else if(auswahl == 2) ausgabe(); }while(auswahl != 3); return 0; }
Bei der Ausgabe des Programms stürtzt es bei folgender Zeile immer ab:
printf("Bemerkung: %s",str_ptr->bemerkung);
Liegt das vielleicht daran, dass ich bei für diese Strukturvariable einen dynamischen String verwende, welche in der Funktion eingabe() erstellt wird?
Über hilfe würde ich mich sehr freuen.Gruss
Jonathan
-
Hmmm. Also bei mir funzt das Programm. Die Ausgabe sieht nur n bissel komisch aus,
aber sonst funzt es.
-
while(str_ptr != NULL) str_ptr=str_ptr->next; str_ptr=(struct daten *)malloc(sizeof(struct daten *));
Vielleicht übersehe ich etwas, aber das hier scheint mir doch arg komisch.
Du ignorierst das letzte Element, dass Du durch die while() Schleife herausgefunden hast und überschreibst den Pointer mit dem malloc() Aufruf.
So könnte es aussehen:struct la *start; struct la *tmp; struct la *new; tmp = start; while(tmp->next != NULL) tmp=tmp->next; if(!(new = malloc(sizeof(struct la)))) return -1; tmp->next = new;
Ich habe es nicht getestet...
Gruß
grottenolm
-
kann es sein, dass du mit malloc nur die grösse des zeiger reservierst?
nicht aber die tatsächliche grösse des structs?first = (struct daten *)malloc(sizeof(struct daten *));
wohl eher:
first = (struct daten *)malloc(sizeof(struct daten));