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.


Anmelden zum Antworten