einfach verkettete Liste - Element eintragen/Adresse innerhalb der Funktion zuordnen



  • Hallo,

    ich habe ein Problem beim Erzeugen einer einfachen Liste in C. Meine insert-Funktion ist nicht funktionsfähig. Soweit ich das sehe funktioniert die Zuordnung (Codezeile 27) einer Adresse nicht. Ich vermute hier liegt ein semantischer Fehler vor, richtig?

    Bin für jeden Hinweis und Kritikpunkt dankbar!

    Vielen Dank im voraus!
    Lg

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct list_izahl_element  {
            int  izahl;
            struct list_izahl_element *pnext;
        } Liste_izahlen;
    
    void print_list(Liste_izahlen **list){
        int counter=1;
        Liste_izahlen *runner=&list;
    
        if (runner==NULL)
            printf("Leere Liste!\n");
        else
            while (runner!=NULL){
                printf("%d. %d\n", counter++, runner->izahl);
                runner=runner->pnext;}
    }
    
    void insert(Liste_izahlen **select, int iZahlinput){
        Liste_izahlen *newelement=(Liste_izahlen*) malloc (sizeof(Liste_izahlen));
        newelement->izahl=iZahlinput;
        newelement->pnext=NULL;
    
        if (*select==NULL)
            *select=newelement;
        else{
            newelement->pnext=(*select)->pnext;
            (*select)->pnext=newelement;
            }
        free(newelement);
    }
    
    int main(void){
    int input;
    Liste_izahlen *xylist=NULL;
    
    while(1){
        printf("Geben Sie eine Ganzzahl ein: ");
        if (scanf("%d", &input)){
            insert(&xylist,input);
            print_list(&xylist);
        }
    }
    }
    


  • Wenn du in einer Funktion eine Variable ändern willst, muss die Funktion mit einem Zeiger auf die Variable arbeiten.
    Wenn du also einen Zeiger (Anfang der Liste) ändern willst, musst du einen Zeiger auf einen Zeiger übergeben.

    fflush(stdin) ist nicht standardkonform und Anfängerschrott.



  • Wutz schrieb:

    Wenn du in einer Funktion eine Variable ändern willst, muss die Funktion mit einem Zeiger auf die Variable arbeiten.
    Wenn du also einen Zeiger (Anfang der Liste) ändern willst, musst du einen Zeiger auf einen Zeiger übergeben.

    Ok danke. Klingt logisch 😉 Hab den Quelltext oben mal ein wenig angepasst, auch wenn er noch immer nicht lauffähig ist.

    Wutz schrieb:

    fflush(stdin) ist nicht standardkonform und Anfängerschrott.

    Gibt es eine (brauchbare) Alternative?



  • Kannst du nächstes Mal den neune Code in einem neuen Beitrag posten?
    Sonst versteht man den Zusammenhang nicht mehr wenn du die Fehler rauseditierst. Danke.
    Ich nehme meistens gets(array) um den Eingabebuffer zu leeren.



  • Binggi schrieb:

    Kannst du nächstes Mal den neune Code in einem neuen Beitrag posten?
    Sonst versteht man den Zusammenhang nicht mehr wenn du die Fehler rauseditierst. Danke.

    Ok, werde ich in Zukunft machen!

    Binggi schrieb:

    Ich nehme meistens gets(array) um den Eingabebuffer zu leeren.

    Das scheint in einigen Kreisen auch verpönt zu sein:

    http://www.gidnetwork.com/b-56.html schrieb:

    You should never use gets(). Never. Never. Never. I hope I am being clear. NEVER!!


Anmelden zum Antworten