Hey,
also ich wusste garnicht wirklich wie ich dieses Thema hier nennen soll, denn ich weiß nicht wirklich was ich falsch gemacht habe...
Ich lese schon seit längeren ein Buch über C und nun bin ich bei den verketteten Listen. Ich habe ein Programm geschrieben das mit einer verketteten Liste Abreitet. Jetzt habe ich aber ein Problem, welches miener Meinung garnichts damit zu tun hat. Wenn ich bei meinem Programm ein neues Element in der Liste erstellen wird, funktioniert die Eingabe nicht wirklich. Ich kann nämlich keinen Namen eingeben, es wird übersprungen.
Kann mir jemand helfen?
Code:
also ich wusste garnicht wirklich wie ich dieses Thema hier nennen soll, denn ich weiß nicht wirklich was ich falsch gemacht habe...
Ich lese schon seit längeren ein Buch über C und nun bin ich bei den verketteten Listen. Ich habe ein Programm geschrieben das mit einer verketteten Liste Abreitet. Jetzt habe ich aber ein Problem, welches miener Meinung garnichts damit zu tun hat. Wenn ich bei meinem Programm ein neues Element in der Liste erstellen wird, funktioniert die Eingabe nicht wirklich. Ich kann nämlich keinen Namen eingeben, es wird übersprungen.
Kann mir jemand helfen?

Code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF 255
struct Noten {
char name[BUF];
int note;
struct Noten *next;
};
struct Noten *anfang = NULL;
void hinzufuegen(char *name, int note) {
struct Noten *zeiger;
if(anfang == NULL) {
if((anfang = malloc(sizeof(struct Noten))) == NULL) {
fprintf(stderr, "Konnte keinen Speicher anfordern\n");
return;
}
strcpy(anfang->name, name);
anfang->note = note;
anfang->next = NULL;
} else {
zeiger = anfang;
while(zeiger->next != NULL)
zeiger = zeiger->next;
if((zeiger->next=malloc(sizeof(struct Noten))) == NULL) {
fprintf(stderr, "Konnte keinen Speicher anfordern\n");
return;
}
zeiger = zeiger->next;
strcpy(zeiger->name, name);
zeiger->note = note;
zeiger->next = NULL;
}
}
void eingabe(void) {
char name[BUF];
int note;
printf("Name....: ");
fgets(name, BUF, stdin);
printf("Note....: ");
scanf("%d", ¬e);
hinzufuegen(name, note);
}
void loesche(char *name) {
struct Noten *weg, *vor;
if(anfang != NULL) {
if(strcmp(anfang->name, name) == 0) {
weg = anfang->next;
free(anfang);
anfang = weg;
}else {
vor = anfang; //vor wird auf den Anfang gesetzt
while(vor->next != NULL) { //Gibt es ein nächstes Element in der Liste?
weg = vor->next; //Wenn Ja, dann gebe weg, die Adresse des nächsten Elementes. Beim ersten durchlauf ist vor = Anfang. Da aber anfang nicht das gesuchte Element sein kann, kann das nächste element das mögliche sein, dass gelöscht werden soll
if(strcmp(weg->name, name) == 0) { //Ist das Element (Im ersten durchlauf das Element nach Anfang) das gesuchte,
vor = weg->next; //dann bekommt das Element davor die Adresse des Elements des nächsten, als Parameter für *next, da es nach dem löschen des einen, das nächste Element wäre (Im 1. Durchlauf das 3. Element), somit steht das ELement das gelöscht werden kann "frei"
free(weg); //Somit wird es jetzt auch "freigelassen"
break; //Und es wird aus der while()-Schleife gesprungen, da das gesuchte Element gefunden und gelöscht wurde
}
}
}
}else
printf("Es konnte kein Element gefunden wurden\n");
}
void ausgabe(void) {
struct Noten *zeiger = anfang;
printf("\n\n");
printf("==============================\n");
printf(" Name | Note \n");
printf("==============================\n");
if(anfang != NULL) {
while(zeiger != NULL) {
printf("| %s | %d |\n", zeiger->name, zeiger->note);
zeiger = zeiger->next;
}
printf("\n\n");
} else
printf("Es sind keine Daten in der Liste vorhanden!\n\n");
}
int main(void) {
int auswahl;
char name[BUF];
do {
printf("Was wollen sie machen\n\n");
printf("-1- Einen neuen Eintrag machen\n");
printf("-2- Alle Eintraege ausgeben\n");
printf("-3- Ein Element loeschen\n");
printf("-0- Programm beenden\n");
printf("Ihre Auswahl: ");
scanf("%d", &auswahl);
switch(auswahl) {
case 1: eingabe(); break;
case 2: ausgabe(); break;
case 3: printf("Wie lautet der Name der geloescht werden soll: ");
fgets(name, BUF, stdin);
loesche(name);
break;
case 0: break;
default: printf("Falsche Eingabe!!\n");
}
}while(auswahl != 0);
system("PAUSE");
return EXIT_SUCCESS;
}