verkette Liste mit Funktion erzeugen



  • Hallo Leute.

    Ich wollte eine einfach verkettete Liste mit einer Funktion erzeugen. das Problemist allerdings, dass ich als Ausgabe immer noch eine Zahl "hinten dran" ausgegeben bekomme.

    typedef struct _zahlliste {
    
    		int ziffer ;
    		struct _zahlliste * next;
    
    	} zahlenliste;
    
    void eintragen(zahlenliste **pointer, int wert){
    
    	zahlenliste *zeiger=*pointer;
    
    	while(zeiger->next!=NULL)
    		zeiger=zeiger->next;
    
    	zeiger=(zahlenliste *) malloc(sizeof(zahlenliste));
    	if(zeiger->next==NULL) return;
    
    	zeiger->ziffer=wert;
    	zeiger->next=NULL;
    
    	printf("%d\n",zeiger->ziffer);
    
    	*pointer=zeiger;
    
    }
    
    int main(){
    
    	zahlenliste *zeiger;
    	zeiger->next=NULL;
    
    	eintragen(&zeiger, 42);
    	eintragen(&zeiger, 22);
    

    Als Ausgabe (siehe Befehl in Zeile 21) bekomme ich "42 22 0". Wie kommt das zustande?

    Gruß und schonmal Danke!



  • Als Ausgabe (siehe Befehl in Zeile 21) bekomme ich "42 22 0".

    Ich einen Segfault. Wirst wohl an eine böse Stelle schreiben.
    🙂



  • als kleiner tipp wenn du dir das letzte element merkst dann brauchst es nicht immer wieder zu suchen

    while(zeiger->next!=NULL)
        zeiger=zeiger->next;
    

    oder du fügst dann einfach in der mitte ein...

    typedef struct _zahlliste {
        int ziffer;
        struct _zahlliste *next;
    }zahlenliste;
    
    zahlenliste *eintragen(zahlenliste *last, int wert){
        zahlenliste *ret = malloc(sizeof(zahlenliste));
        if(ret != NULL){
            ret->ziffer = wert;
            if(last->next == NULL)
                ret->next = NULL;
            else
                ret->next = last->next;
            last->next = ret;
        }
        return ret;
    }
    
    void plot(zahlenliste *first){
        while(last != NULL){
            printf("%d\n",last->ziffer);
            last = last->next;
        }
    }
    int main(void){
        zahlenliste root;
        root.next = NULL;
        root.ziffer = 0;
        zahlenliste *zeiger = root;
    
        zeiger = eintragen(zeiger, 42);
        zeiger = eintragen(zeiger, 42);
        plot(root.next);
    }
    

    hoffe das klappt so wenn nicht sag bescheid

    btw. kpl wie die ausgabe zustande kommt "42 22 0"

    lg lolo



  • µngbd schrieb:

    Als Ausgabe (siehe Befehl in Zeile 21) bekomme ich "42 22 0".

    Ich einen Segfault. Wirst wohl an eine böse Stelle schreiben.

    Und zwar gleich in Z 30. Nicht schwer zu finden.
    🙂



  • zahlenliste *zeiger = &root; 
    statt
    zahlenliste *zeiger = root;
    

    hoffe da sind nicht noch mehr fehler... 😕



  • So habe nochmal komplett umgestellt und in 2 Fälle aufgeteilt:
    1. wenn die Liste leer ist
    2. wenn die Liste nicht leer ist

    void eintragen(zahlenliste **pointer, int wert){
    
    	if(*pointer==NULL)
    	{
    		*pointer=(zahlenliste *) malloc(sizeof(zahlenliste));
    		if(*pointer==NULL) return;
    
    		(*pointer)->ziffer=wert;
    		(*pointer)->next=NULL;
    
    	}
    
    	else
    	{
    		zahlenliste *hilf=*pointer;
    		while(hilf->next!=NULL)
    			hilf=hilf->next;
    
    		hilf->next=(zahlenliste *) malloc(sizeof(zahlenliste));
    		if(hilf->next==NULL) return;
    
    		hilf->ziffer=wert;
    		hilf->next=NULL;
    
    	}
    
    }
    int main(){
    
    	zahlenliste *zeiger=NULL;
    
    	eintragen(&zeiger, 42);
    	eintragen(&zeiger, 22);
    	eintragen(&zeiger, 33);
    
    printf("%d\n",zeiger->ziffer);
    
    	return 0;
    
    }
    

    Allerdings bekomme ich die Ausgabe nicht hin, weil mein Zeiger immer auf das letzte Element zeigt. Ich frage mich warum, weil ja eigentlich der übergebene Zeiger nicht verändert wird, außer die Liste ist leer. 😞



  • 1. du brauchst keinen zeiger auf nen zeiger zu übergeben das ist überflüssig
    [/cpp]void eintragen(zahlenliste *pointer, int wert){[cpp]
    dann kannst in der function eintragen schon mal min. 6
    entfernen und klammern kannst dir auch schenken, schau dir doch einfach mal meinen letzten post an auch wenns kein musterbeispiel für gute programmierung ist, aber laufen sollts schon...



  • uiii 😮

    void plot(zahlenliste *first){
        while(first != NULL){
            printf("%d\n",first->ziffer);
            first = first->next;
        }
    } 
    statt
    void plot(zahlenliste *first){
        while(last != NULL){
            printf("%d\n",last->ziffer);
            last = last->next;
        }
    }
    


  • @ nobblolo

    wenn ich doch den anfang verändern möchte worauf der zeiger zeigt muss ich doch den doppelten übergeben oder nicht? weil sonst könnte ich den zeiger doch nicht verändern, an erster stelle

    EDIT: sry nooblolo



  • nee du kannst da übergeben was du willst du wirst aus ner einfach verketteten liste nie den vorgänger bekommen, das geht nur wit einer doppelt verketteten liste

    was man machen kann:

    einfach verkettet
    -------- knoten ---------->

    doppelt verkettet
    <------- knoten ---------->

    du mußt aber mindestens einen einfachen zeiger übergeben weil sonst die structur zahlenliste in die function kopiert wird und deine veränderung von "hilf.next" (der punkt deshalb weil hilf eine kopie und kein zeiger ist) würde beim verlassen der function einfach verworfen außer du kopierst die structur zahlenliste mit einem return wieder raus aber das macht fast keiner evtl. ;fricky .... 😉


Anmelden zum Antworten