verkettete Listen (Block einketten)



  • Hi, könnte mir jemand dabei bitte helfen, diesen Code zu verstehen?

    [cpp]
    typedef struct T_BLOCK *P_BLOCK;
    
    typedef struct T_BLOCK {
      char*    pContent; /* Inhalt: C-String          */
      P_BLOCK  pNext;    /* Zeiger auf nächsten Block */
    } T_BLOCK;
    
    void ListeVorneEinketten (P_BLOCK *pListe, P_BLOCK pBlock) {
      assert (pBlock && pBlock->pContent);
      pBlock->pNext = *pListe;
      *pListe = pBlock;
    }[/cpp]
    

    also ich erläutere jetzt mal, was ich verstehe. Es wäre nett, wenn ihr mich dann auf meine Fehler hinweisen würdet ;-).

    Also wir haben eine Struktur namens T_BLOCK die einen Zeiger auf Char (pContent) enthält und einen Zeiger (pNext) der auf die Struktur selbst zeigt.

    Im oberen Typedef definieren wir noch einen Datentyp, der auf die Struktur T_BLOCK zeigt.

    ListeVorneEinketten: Hier fängt es schon an mir Probleme zu bereiten.
    Ich verstehe es so: Wir übergeben beim Funktionsaufruf dem *pListe die Adresse des Listenanfangs. Das zweite Argument pBlock ist weiterhin ein Zeiger der auf eine Struktur T_BLOCK zeigt.

    Aber was machen wir jetzt mit dem pNext? Normalerweise (denke ich mal) müsste man pNext jetzt doch die Adresse des vorherigen ersten Blocks bzw. des Listenanfangs übergeben, damit der neue pBlock eben eingekettet werden kann.
    Schön und gut, aber wieso schreibt man das als

    pBlock->pNext = *pListe;

    heißt es nicht eigtl pBlock->pNext = pListe?

    Wenn man es wie im Code oben so stehen lässt, heißt es doch eigtl. dass pNext auf den nächsten Block, *pListe zeigt, in der nächsten Zeile kriegt jedoch *pListe wieder die Adresse von pBlock zugewiesen.

    Könnt ihr mir bitte helfen?

    😞



  • gutenacht-steph schrieb:

    Wenn man es wie im Code oben so stehen lässt, heißt es doch eigtl. dass pNext auf den nächsten Block, *pListe zeigt, in der nächsten Zeile kriegt jedoch *pListe wieder die Adresse von pBlock zugewiesen.

    ich glaube, das ist so richtig. oder funzt es nicht? der next-pointer des neuen blocks soll auf den bisherigen anfang der liste zeigen: pBlock->pNext = *pListe; und dann wird der pointer, der auf den listenafang zeigen soll, auf den neuen block gesetzt: *pListe = pBlock; . vielleicht verwirrt dich, dass P_BLOCK ja schon ein pointer-typ ist, d.h. pListe ist eigentlich ein doppel-pointer.
    🙂


Anmelden zum Antworten