Listen



  • Ich habe folgenden Codeabschnitt gefunden.
    Mich stören daran zwei Sachen.

    1)Direkt am Anfang wird ein Zeiger l deklariert.
    Dieser zeigt auf ein Element vom Typ ListElement und ändert digit und next.
    Das Problom ist l zeigt ja gar nicht auf ein konkretes Objekt.

    1. Warum wird am Ende l=lh gesetzt?
      Ist das nicht totaler Unsinn?
    struct ListElement
    {
    int digit;
    ListElement *next;
    };
    
    ListElement *l= new ListElement;
    l->digit = 5;
    l->next = NULL;
    ListElement*lh = new ListElement;
    lh->digit = 3;
    lh->next = l;
    l = lh;
    

  • Mod

    Das Problom ist l zeigt ja gar nicht auf ein konkretes Objekt.

    Doch. Auf das mit new erstellte Objekt auf dem Freispeicher.

    Warum wird am Ende l=lh gesetzt?

    Wie wäre es mit mehr Kontext? Hast du den Code einfach irgendwo rauskopiert?



  • zu 1) natürlich zeigt l auf eine Instanz, nämlich auf die mit "new" erzeugte.

    zu 2) warum sollte das totaler Unsinn sein? da lh->next = l gesetzt wird, ist ein Ring mit zwei Elementen entstanden. Warum genau anschließend l=lh gesetzt wird, ist nicht erkennbar, da es die letzte Anweisung ist.

    edit: damn, arcoth war schneller...



  • Alles ok, die Liste wird nur komisch verwendet.
    l soll immer auf den Listenanfang zeigen, darum wird l=lh geschrieben.

    So geht das:

    //SEHR untypische Liste für C++. Uraltes Lehrbuch. 
    //Man strickt normalerweise eine Klasse Liste drum für eine 
    //nettere Schnittstelle. 
    struct ListElement 
    {
    int digit;
    ListElement *next;
    };
    
    //Leere Liste anlegen
    ListElement *l=NULL;
    
    {//4 einfügen
    ListElement*lh = new ListElement;
    lh->digit = 4;
    lh->next = l;
    l = lh;
    }
    
    {//7 einfügen
    ListElement*lh = new ListElement;
    lh->digit = 7;
    lh->next = l;
    l = lh;
    }
    
    {//1 einfügen
    ListElement*lh = new ListElement;
    lh->digit = 1;
    lh->next = l;
    l = lh;
    }
    
    {//1 einfügen
    ListElement*lh = new ListElement;
    lh->digit = 1;
    lh->next = l;
    l = lh;
    }
    
    //Mal schauen, was vorne in der Liste steckt. 
    cout << l->digit <<'\n';//zwigt 1 an
    
    //Alles rausholen und anzeigen!
    //Zeigt 1 1 7 4 an. 
    while(l!=NULL){
       cout << l->digit <<'\n';
       ListeElement* toDie=l;
       l=l->next;
       delete toDie;
    }
    


  • Stimmt - eine SEHR untypische Liste, im Grunde gar keine C++-Like-Liste
    und wenn man nur einen kleinen Kontruktor hinzufügen würde, vereinfacht sich das ganze schon deutlich:

    //SEHR untypische Liste für C++. Uraltes Lehrbuch.
    //Man strickt normalerweise eine Klasse Liste drum für eine
    //nettere Schnittstelle.
    struct ListElement
    {
        ListElement( int d, ListElement* n )
            : digit( d )
            , next( n )
        {}
        int digit;
        ListElement *next;
    };
    
    //Leere Liste anlegen
    ListElement *l=NULL;
    
    l = new ListElement( 4, l ); //4 einfügen
    l = new ListElement( 7, l ); //7 einfügen
    l = new ListElement( 1, l ); //1 einfügen 
    l = new ListElement(1, l ); //1 einfügen
    
    //Mal schauen, was vorne in der Liste steckt.
    cout << l->digit <<'\n';//zeigt 1 an
    
    //Alles rausholen und anzeigen!
    //Zeigt 1 1 7 4 an.
    while(l!=NULL){
       cout << l->digit <<'\n';
       ListeElement* toDie=l;
       l=l->next;
       delete toDie;
    }
    

    sucht man in Google nach "struct ListElement C++" - so findet man schon auf der ersten Seite Hinweise auf den Verlag Galileo Computing 👎

    Gruß
    Werner


Anmelden zum Antworten