Problem mit Menü
-
Hey Leute, ich schreibe gerade ein Programm mit Listenverarbeitung
Mein Problem ist das Menü: Wenn ich starte, dann kommt das Menü. Wenn ich dann 1 eingebe, dann kommt das menü wieder, das ist 3x so. Dann beendet das Programm. Aber es müsste ja alles richtig sein, oder? also das unterprogramm Menü wird aufgerufen, ein wert eingelesen und dann returnt. Es soll so sein, dass ich nach dem einlesen wieder das Hauptmenü sehe und einen anderen Punkt auswählen kann..
Bitte um Hilfe
PS: Kann jemand meine "Löschen" Funktion kontrollieren bzw. sagen wo eventuell ein Fehler ist, da ich mit den Variablen für das zu löschende Element (also der INT wert) und dem zeiger nicht ganz zurechtkomme...
/* Name: Sebastian Schmidt Funktion: Beispiel einer einfach verketteten Liste */ #include <stdio.h> #include <conio.h> #include <stdlib.h> //für malloc(..) typedef struct ELEMENT { struct ELEMENT *n; // Zeiger auf das nächste Listenelement int inhalt; } Element; void loesche_element(Element *p, Element *kopf); int menue(int auswahl); void main() { Element *kopf; // Zeiger auf Struktur Element - Listenkopf Element *p; // Zeiger auf ein Struktur Element int zahl; // Hilfsvariable für das Einlesen int i=0; // Zählvariable int auswahl=0; //Auswahl für Menü menue(auswahl); if(auswahl==1) { system("cls"); // Aufbau der Liste kopf = NULL; // Initialisierung printf("%d.Listenelement: " ,++i); scanf("%d", &zahl); while(zahl != 0) { p = (Element *) malloc(sizeof(Element)); if (p != NULL) { p->inhalt = zahl; p->n = kopf; // neues Listenelement einhängen kopf = p; printf("%d.Listenelement: " ,++i); scanf("%d", &zahl); } else { printf("Zu wenig Speicherplatz"); zahl = 0; // oder: break } } } //if Auswahl==1 (einlesen) ENDE menue(auswahl); if(auswahl==2) { printf("Ausgabe der Liste \n"); p = kopf; //An den Anfang gehen while (p != NULL) { printf("%d\n" , p->inhalt); p = p->n; } getch(); }// ausgeben ENDE menue(auswahl); if(auswahl==3) //Element löschen { loesche_element(&p, &kopf); } } void loesche_element(Element *p, Element *kopf) { int loesch_nr; //welches Element soll gelöscht werden? Element *loesch; //Zeiger auf das zu löschende Element Element *help1, *help2; //help1 = für weiterrücken, help2 = für element auslassen (=löschen) printf("Element löschen\n"); printf("Welches Element soll gelöscht werden?"); scanf("%d", &p->inhalt); kopf = p; //"Zeiger" an den Anfang der Liste setzen, damit alle Elemente überprüft werden können help1 = NULL; help2 = NULL; while(p->inhalt != (int)loesch_nr) //solange das zu löschende Element nicht gefunden wurde { p->n = help1; //Um ein Element weiterrücken help1 = p->n->n; if(p->inhalt==loesch_nr) //Wenn das Element gefunden wurde { p->n = loesch; p->n->n = p; free(loesch); } } } int menue(int auswahl) { printf(" Listenverarbeitung\n\n"); printf("[1] Elemente einlesen\n"); printf("[2] Elemente anzeigen\n"); printf("[3] Elemente loeschen\n\n"); printf("Auswahl: "); scanf("%d", &auswahl); return auswahl; }
-
wird deins einwandfrei kompiliert, oder krieg nur ich die blöden Warnungen?
-
Die Warnungen bekomme ich auch^^
-
Basti 13 schrieb:
Die Warnungen bekomme ich auch^^
Schon mal versucht zu deuten, und dort anzusetzen? ^^
ich kann's halt nichtmal zum Laufen bringen, deswegen versteh ich grade auch gar nicht wieso sich da bei dir überhaupt irgendwas wiederholt.
-
Hab das Programm schnell überflogen.
Mir scheint du hast noch ein bisschen aufholbedarf in den Grundlagen.void main()
ist nicht zulässig.
int main(void)
oder
int main(int argc, char *argv[])
menue(auswahl); if(auswahl==1)
Ausserdem bewirkt dieser Funktionsaufruf menue gar nichts.
auswahl ist immer 0, da der Returnwert keiner Variable zugewiesen wird.auswahl=menue(); if(auswahl==1) int menue(void) //Funktionsprototyp
oder
menue(&auswahl); if(auswahl==1) int menue(int *auswahl)
-
danke
aber ich verstehe noch immer nicht ganz, wieso man auswahl=menue(); schreiben muss...
wenn ich im unterprogramm menue() die variable auswahl returnen lasse, reicht es dann nicht?
-
Basti 13 schrieb:
danke
aber ich verstehe noch immer nicht ganz, wieso man auswahl=menue(); schreiben muss...
wenn ich im unterprogramm menue() die variable auswahl returnen lasse, reicht es dann nicht?
auswahl ist eine Variable, die dazu dient, den Return wert von menue(); zu speichern, damit du mit diesem Wert weiter arbeiten kannst.
Würdest du den wert nicht zuweisen, müsstest du die funktion menue immer wieder aufrufen, um mit dem return wert arbeiten zu können.