Bräuchte Hilfe zu einem einfachen Programm bezüglich verketteten Listen



  • Hallo,
    ich wollte mal in die Runde fragen, ob mir jemand beim verstehen des folgenden Quellcodes helfen könnte. Wie bereits in einem anderen Post beschrieben (bei dem ihr mir auch hervorragen geholfen habt) ist es Projekt meines Informatik Unterrichts, in dem wir uns das Thema eigentsändig, mit Hilfe den Mitteln, die wir zu Verfügung haben, (Internet und Bücher) das Thema beizubringen, da es dadurch einen größeren Lerneffekt gibt (geben soll). Nun ja, ich kann ja mal schildern, wie ich das Programm so verstanden habe (und ihr könnt mich dann vielleicht in falschen annahmen korrigieren):

    Also mit Hilfe von *liste z wird ein Zeiger auf ein Neues Listenelement deklariert. *liste wurzel = NULL soll dabei den Anfang bilden, und auf den erst möglichen freiehen Speicherplatz zeigen. char antw ist klar, genau so wie string such. So nun kommt die do-while-SChleife, die den Speicher mit Inhalt füllt. Dabei wird mit z = new liste an der Speicherstelle z eine neue Liste erstellt, also Vorname, Nachname, Telefon Nr. und ein Zeiger namens next. Dann wird die Eingabe zu den Nachfragen in die Inahltsvariablen der Liste gespeichert, soweit auch klar (denke ich, korrigiert mich ruhig).
    Nun kommt der Kern, den ich nicht recht verstehe: dem zeiger next wird die adresse von Wurzel zugewiesen, die ja den erst möglichen freien Platz im Speicher sein sollte (beim ersten Druchlauf). Dem entsprechend, wird wurzel die Zeigeradresse von z zugewiesen, damit beim nächsten Durchgang auch in z->next, die Adresse des vorherigen (Listen)Elements steht. Anschließend wird nach einem weiteren durchlauf gefragt, und je nach Antwort die SChleife wiederholt.
    Dann kommt die Ausgabe, die Rückwärts geschieht (also das zu letzt eingegeben Element zu erst), da er ja noch den letzten Wert von z im Speicher hat. Er gibt das letzte Element aus, und weist z die Zeigeradresse zu, die beim lezten Durchgang in z->next gespeichert wurde und auf das vorherige Element zeigt. Das wiederholt sich nun so lange, bis er wieder beim ersten Element angekommen ist, bei dem die Zeigeradresse NULL war.
    Der Suchalgorytmus ist soweit auch klar, nur das break; in der if-Anweisung nicht, wieso wiederholt er denn immerwieder die Ausgabe des Suchergebnisses?

    Wäre echt super, wenn ihr mir auf die Sprünge helfen könntet. Und erst recht, wenn ich einigermaßen richtig liege in meinem Verständnis. Hier dann also der Quelltext:

    class liste 
    { 
     public: 
      string nachname;
      string vorname;
      int telefon;
    
      liste *next;
    }; 
    
    int main(int argc, char* argv[])
    { 
        liste *z; 
        liste *wurzel = NULL; 
        char antw;
        string such;
    
        do
        { 
         z = new liste;
    
         cout<<"\n\n\tVorname: "; cin>>z->vorname;
         cout<<"\n\tNachname: "; cin>>z->nachname; 
         cout<<"\n\tTelefon Nr.: "; cin>>z->telefon; 
    
         z->next = wurzel;
         wurzel = z;
    
         cout<<"\n\n\tWeiteren Datensatz ? "; 
         cin>>antw;
        } 
        while(antw != 'n'); 
    
        clrscr();
        cout<<"\n\n Eingegebenen Daten \n";
    
        do
        { 
         cout<<"\n\t"<<z->vorname <<"\t\t"<<z->nachname<<"\t\tTelefon Nr.: "<<z->telefon;
         z = z->next; 
        } 
        while(z != NULL);
    
        if ( antw == 'n' ) 
        { 
          cout<<"\n\n Suche nach Datensatz\n";
          cout<<"\n\tNach welchem Datensatz möchtest du die Liste nocheinmal duchsuchen?\n\tVor- bzw. Nachname: ";
          cin>>such;
    
                clrscr();
                cout<<"\n\n Suchergebnis\n";
    
                z = wurzel;
                do
                { 
                    if (such == z->vorname || such == z->nachname)
                    { 
                        cout<<"\n\t"<<z->vorname <<"\t"<<z->nachname<<"\t\tTelefon Nr.: "<<z->telefon;
                        break;
                    }
                    else 
                    { 
                        z = z->next;
                    }
                } 
                while(z != NULL);
    
                if (z == NULL)
                    cout<<"Name "<<such <<"wurde nicht gefunden!"<<endl;
        } 
    
        getch();
    
        return 0;
    }
    

    MfG Daniel

    P.S.: Ich hoffe ich habe euch nicht zuviel zugemutet 😕 !



  • In der do-while-Schleife rennt er von der Wurzel an durch die ganze Liste. Ist bei einem Element Vor- oder Nachname == such, gibt er den Datensatz aus und bricht die Suche ab (das macht break).

    Übrigens finde "liste" als Namen der Klasse etwas unglücklich, weil sie nur ein Listenelement darstellt.



  • Liege ich denn mit meinen anderen "Interpretationen" richtig?



  • Die Elseanweisung in der letzten Schleife ist überflüssig, kann eigentlich weg.


Anmelden zum Antworten