erste verkettete liste



  • CJosef schrieb:

    wintik schrieb:

    also wenn ich mir einen hilfszeiger nehme und diesen gleich A setze und dann weiter schiebe hab ich doch wieder das gleiche problem das nach einem free(hilfszeiger) dieser wieder weg ist?

    Standard Vorgehen ist vom Ansatz her: next-Zeiger per Hilfszeiger speichern, Vorgänger löschen ... so hangelst du dich durch bis zum Listenende NULL.

    ah klar, jetzt wo du es geschrieben hast, hätte mir eigentlich auch einfallen können sollen 🙄

    CJosef schrieb:

    wintik schrieb:

    das C mir nicht gerade liegt ist mir auch schon aufgefallen, etwas damit klarkommen muss ich trotzdem, deswegen versuch ich soviel es geht zu verstehen und zu lernen 😉

    Das am Anfang nicht gleich alles klappt ist normal, gerade bei C. 😃
    Also, nicht entmutigen lassen.

    danke danke, besonders für die ermutigung 😃



  • do { 
            A->next=B; 
            free(A); 
    		A=B;
        }while (B != NULL);
    

    löschen diese zeilen richtig oder sieht es für mich nur so aus? (also hab noch printList zur kontrolle dahinter,
    das hat aber vorher mit der alten while-schleife auch schon nichts mehr angezeigt)



  • Das sieht vermutlich für dich nur so aus. Wie soll denn B jemals NULL werden?
    Wenn du das anfangs noch nicht überblickst dann mals dir auf, das ist keine Schande und sehr lehr/hilfreich. Mit rumraten kommste nicht allzu weit...



  • sagen wir mal die liste hat 3 elemente

    A->[1|n]->[2|n]->[3|n]->NULL
    

    1.B=A->next;

    A->[1|n]B->[2|n]->[3|n]->NULL
    

    2.free(A);

    [ | ]B->[2|n]->[3|n]->NULL
    

    3.A=B;

    [ | ]B,A->[2|n]->[3|n]->NULL
    

    damit wär man wieder beim ausgangszustand, nur das halt das erste element befreit ist.

    dann müsste im 3ten durchlauf es so aussehen

    1.   B,A->[3|n]->NULL
    2.     A->[3|n]B->NULL
    3.        [ | ]B->NULL
    

    ist dann nicht B=NULL? wer sieht den fehler in meiner logik? ^^


  • Mod

    Bei Zuweisungen steht das Objekt, das verändert werden soll, auf der linken Seite.



  • ach mist, natürlich

    do { 
            B=A->next; 
            free(A); 
    		A=B;
        }while (B != NULL);
    


  • wintik schrieb:

    sagen wir mal die liste hat 3 elemente

    A->[1|n]->[2|n]->[3|n]->NULL
    

    1.B=A->next;

    A->[1|n]B->[2|n]->[3|n]->NULL
    

    2.free(A);

    [ | ]B->[2|n]->[3|n]->NULL
    

    3.A=B;

    [ | ]B,A->[2|n]->[3|n]->NULL
    

    damit wär man wieder beim ausgangszustand, nur das halt das erste element befreit ist.

    dann müsste im 3ten durchlauf es so aussehen

    1.   B,A->[3|n]->NULL
    2.     A->[3|n]B->NULL
    3.        [ | ]B->NULL
    

    ist dann nicht B=NULL? wer sieht den fehler in meiner logik? ^^

    Das sieht gut aus, hättest du das mal auch so umgesetzt 😃

    wintik schrieb:

    do {
            B=A->next;
            free(A);
            A=B;
        }while (B != NULL);
    

    Das ist noch nicht so prall, das kann noch crashen, wenn A NULL ist!



  • if(A != NULL){
        do { 
            B=A->next; 
            free(A); 
    		A=B;
        }while (B != NULL);
    }
    

    so nicht mehr oder? 🙂


  • Mod

    Stilistisch besser

    while ( A != NULL )
    {
        struct sEmpList* B = A;
        A = A->next;
        free(B);
    }
    

    - A wird nie ungültig
    - die Freigabe erfolgt zum Schluss



  • okay, ist auch einfacher zu lesen


Anmelden zum Antworten