Wo ist der Fehler?



  • Mein Programm soll beliebig viele Zahlen vom Benutzer einlesen, ohne dass die Anzahl vorher bekannt ist. Mein Programm liest aber bisher nur eine Zahl ein und macht dann einfach gar nichts mehr. Hat vielleicht hier jemand eine Ahnung, woran das liegt?

    # include <stdio.h>
    # include <stdlib.h>
    
    typedef struct LISTENELEMENT {   
    	float fZahl;                 //Nutzdaten
    	struct LISTENELEMENT *pNext; //Struktur braucht Name, damit Zeiger auf sich selbst def werden kann
    }ZAHL_ELEMENT;
    
    typedef struct {  
    	ZAHL_ELEMENT* pFirst;
    	int iAnzahl;         // erste Element sein soll
    }ZAHL_LISTE;
    
    void deleteFirst(ZAHL_LISTE *pEineZahlenListe)
    {
    	ZAHL_ELEMENT *pTempZahlenElement; //Zeiger auf Listenelement
    	if(pEineZahlenListe->pFirst==NULL) 
    		return;
    	else
    	{
    		pTempZahlenElement=pEineZahlenListe->pFirst->pNext; 
    
    		free (pEineZahlenListe->pFirst);
    		pEineZahlenListe->pFirst=pTempZahlenElement;		pEineZahlenListe->iAnzahl--; //dekrementieren der Anzahl
    	}
    }
    
    void deleteList(ZAHL_LISTE *pEineZahlenListe)
    {
    	while (pEineZahlenListe->pFirst!=NULL)
    		deleteFirst(pEineZahlenListe);
    }
    
    ZAHL_ELEMENT *newElement(ZAHL_ELEMENT Zahl)
    {
        ZAHL_ELEMENT *temp; //Zeiger auf ZAHL_ELEMENT
    
        temp=(ZAHL_ELEMENT*) malloc (sizeof(ZAHL_ELEMENT));
    
    	temp->fZahl=Zahl; 	return temp;
    }
    
    void initListe(ZAHL_ELEMENT *Liste)
    {
    	Liste->pNext = NULL; //initialisiert leere Liste
    }
    
    void insertLast(ZAHL_ELEMENT *pEineZahlenListe, ZAHL_ELEMENT *ElementZahl)//Zeiger auf Kopf, Zeiger auf Zahl
    {
    	while (pEineZahlenListe->pNext==NULL); 	pEineZahlenListe=pEineZahlenListe->pNext; 
    	pEineZahlenListe->pNext=ElementZahl; 
    }ElementZahl->pNext=NULL;
    
    int main()
    {
    	int i=1;
    	float d=1;
    
    	ZAHL_ELEMENT kopf;    //Listenelement mit Namen "kopf"
    	ZAHL_ELEMENT *iTemp; //Zeiger auf Listenelement
    
    	initListe(&kopf);//leere Liste soll initialisiert werden 
    
    	while (d!=0)
    	{
    		printf("Geben sie eine Zahl ein (0 fuer Ende):");
    			scanf("%lf",&d);
    			insertLast(&kopf, newElement(d)); 
    	}
    
    	iTemp=kopf.pNext;//Zeiger auf Listenelement kopf
    
    	while(iTemp)
    	{
    		printf("%d.Zahl: %lf\n",iTemp->fZahl);
    		iTemp=iTemp->pNext; //Zeiger auf das nächste Listenelement
    		i++;
    	}
    	deleteList(&kopf);//Listenelement löschen
    	return 0;
    
    }
    


  • Stephi# schrieb:

    Mein Programm liest aber bisher nur eine Zahl ein und macht dann einfach gar nichts mehr.

    Wenn das stimmt, und

    while (d!=0) 
        { 
            printf("Geben sie eine Zahl ein (0 fuer Ende):"); 
                scanf("%lf",&d); 
                insertLast(&kopf, newElement(d)); 
        }
    

    daß die (korrekte) Einlesemethode ist, kann es nur sein, daß die
    Funktion insertLast nie beendet wird.

    Mal einen Debugger benutzen oder ein paar printf's einbauen, um
    zu sehen wo sich das Programm rumtreibt.



  • Kann es vielleicht auch an newElement liegen?
    Dass ich falsche Paramter im Header angebe?



  • Hallo,

    deine Funktion newElement erwartet ein ZAHL_ELMENT und keinen Integer. Des weiteren hast du in der Funktion insertLast einige Fehler.

    void insertLast(ZAHL_ELEMENT *pEineZahlenListe, ZAHL_ELEMENT *ElementZahl)//Zeiger auf Kopf, Zeiger auf Zahl
    {
        while (pEineZahlenListe->pNext==NULL);     pEineZahlenListe=pEineZahlenListe->pNext;
    

    Der Strichpunkt hinter der while Schleife sollte da wohl nicht sein, desweiteren ist dein Abbruchkriterium falsch. Du willst ja zm nächsten Element gehen. Also solange weiterlaufen wie der pNext-Zeiger nicht null ist.

    Güsse
    Tobi


Anmelden zum Antworten