Zweites Listenelement verursacht Fehler
-
Hi, hab wieder ein Problem mit meiner Studentendatenbank.
Das Programm läuft bei der Eingabe des ersten Studenten noch einwandfrei, aber wenn ich alle Daten des zweiten Studenten eingegeben habe, bricht das Programm mit einer Fehlermeldung ab.
Ich hab alles mehrmals durchsucht und finde den Fehler einfach nicht.Vielleicht hat hier ja einer einer besseres Auge dafür.
studenten_eingeben() ist hier die organisierende Funktion
#include <stdio.h> #include <string.h> #include <stdlib.h> /* globale Definitionen */ typedef char STR30[30]; #define MAX_PRUEFUNGEN 15 #define INITFILE "init.cfg" #define STERNE "\t**********************************************************\n" /* Struktur Personalien */ typedef struct personalien { STR30 vorname, nachname, strasse, ort; int hausnummer, plz; }PERSONALIEN; /* Struktur Pruefung */ typedef struct pruefung { STR30 name; double note; }PRUEFUNG; /* Struktur Student */ typedef struct student { int matrikelnummer, fachsemesterzahl, anz_pruefungen; PERSONALIEN personalien; PRUEFUNG *ptr_pruefung[2]; struct student *next_student; }STUDENT; /* Listenkopf */ STUDENT *head = NULL; /* Zeichenkette einlesen */ void string30_einlesen(char *daten) { int ch=76, i=0; STR30 ausgabe; for(i=0; (i<29) && ((ch=getchar()) != EOF) && (ch != '\n'); i++) ausgabe[i]=(char)ch; ausgabe[i]='\0'; fflush(stdin); strcpy(daten,ausgabe); return; } /* Studentendaten einlesen */ STUDENT *daten_einlesen() { STUDENT *ausgabe; fflush(stdin); ausgabe = (STUDENT*)malloc(sizeof(STUDENT)); printf("Personalien eingeben:\n"); printf("\nVorname : "); string30_einlesen(ausgabe->personalien.vorname); printf("\nNachname : "); string30_einlesen(ausgabe->personalien.nachname); printf("\nStrasse : "); string30_einlesen(ausgabe->personalien.strasse); fflush(stdin); printf("\nHausnr.: "); scanf("%i",&ausgabe->personalien.hausnummer); fflush(stdin); printf("\nPLZ: "); scanf("%i",&ausgabe->personalien.plz); fflush(stdin); printf("\nOrt : "); string30_einlesen(ausgabe->personalien.ort); fflush(stdin); printf("\n\nabsolvierte Fachsemester: "); scanf("%i",&ausgabe->fachsemesterzahl); fflush(stdin); return ausgabe; } /* Listenelement erstellen */ STUDENT *create_studlist_element(STUDENT *student) { STUDENT *neu; neu = (STUDENT*)malloc(sizeof(STUDENT)); if(neu == NULL) { printf("create_studlist_element: malloc failed\n"); exit(1); } else { neu = student; } neu->next_student = NULL; return neu; } /* Sortiertes Einfügen eines Listenelementes */ void sorted_insert_studlist_element(STUDENT *neu) { STUDENT *ptr; ptr = (STUDENT*)malloc(sizeof(STUDENT)); if(head == NULL) { head = neu; } else { for(ptr = head; ptr->next_student->matrikelnummer < neu->matrikelnummer; ptr=ptr->next_student) ; /* Leeranweisung */ if(ptr->next_student->matrikelnummer == neu->matrikelnummer) { printf("Matrikelnummer existiert bereits!"); exit(0); } else { neu->next_student = ptr->next_student; ptr->next_student = neu; } } } /* Studenten eingeben */ void studenten_eingeben() { int matrikelnummer = 76; STUDENT *neuer_student; STUDENT *neu; printf("\nneue Matrikelnummer (0 = ENDE): \n\n"); fflush(stdin); scanf("%d",&matrikelnummer); fflush(stdin); while(matrikelnummer != 0) { neuer_student = (STUDENT*)malloc(sizeof(STUDENT)); neuer_student = daten_einlesen(); neuer_student->anz_pruefungen = 0; fflush(stdin); neuer_student->matrikelnummer = matrikelnummer; neu = create_studlist_element(neuer_student); neuer_student = neu; sorted_insert_studlist_element(neuer_student); printf("\n\n"); printf("neue Matrikelnummer (0 = ENDE): \n\n"); fflush(stdin); scanf("%d",&matrikelnummer); fflush(stdin); } }
-
Warum machst du für jeden neuen Studenten dreimal malloc?
-
Ich hatte vorher so viele Fehler wegen fehlender mallocs, da hab ich überall eins reingehauen, wo es mir nützlich erschien, auch wegen Zeitdruck. Hab das nicht mehr so genau überblickt. Wenn der Fehler darin liegen kann, muss ich das wohl nochmal überarbeiten.