Verkettete Listen



  • Hi!

    ich versuche mich gerade in Structs mit verketteten Listen. Zunächst mal der Code:

    #include <iostream>
    
    using namespace std;
    
    struct Struktur {
        int daten;
        Struktur* next;
    };
    
    Struktur* add(int& data);
    
    Struktur* start = 0;
    
    int main(void) {
        int val;
        char mode;
        Struktur* strukt;
        cout << "\t\tProgramm fuer dynamischen Speicherplatz" << endl << endl;
        cout << "Sie haben folgende Auswahl:\n========================\n1: Daten hinzufuegen\n2: Strukturen ausgeben\n3: Daten loeschen\n4: Beenden\n";
        do {
            cout << endl << " > ";
            cin >> mode;
            switch(mode) {
                case '1':
                    {
                        cout << "\tGeben Sie die Daten ein: ";
                        cin >> val;
                        strukt = add(val);
                        break;
                    }
                case '4':
                    {
                        break;
                    }
                default:
                    {
                        cerr << "\tFehlerhafte Eingabe!\n";
                    }
            }
        } while(mode != '4');
        delete strukt;
        delete start;
        return 0;
    }
    
    Struktur* add(int& val) {
        if(start == 0) {
            Struktur* neu = new Struktur;
            neu->daten = val;
            neu->next = 0;
            start->next = neu;
            return start;
        }
    }
    

    Erst mal ein kleiner Anfang einer Liste. Ich habe es aus C++ von A bis Z. Meine Fragen: Wieso soll ich am Anfang, also den Anker der Liste als Zeiger auf eine Struktur 0 zuweisen? Das ist doch eine ungültige Speicheradresse, oder? Im Beispiel steht es so... Bei mir kommt bis zur Eingabe der Daten im Modus 1 eine Fehlermeldung "bla.exe hat ein Problem festgestellt und muss beendet werden".

    Ich wette wegen dieser komischen Zuweisung. Den Struct-Zeiger in einem IF nach 0 abzufragen ist doch nicht richtig, oder?

    Und der Code würde doch rein theoretisch Speicherlecks hinterlassen. Wenn ich das Programm beende, müsste ich doch von ganz hinten der Liste anfangen, die Structs zu löschen, oder? Also mit Schleife.
    Und wie mache ich das mit dem "Next"? Eine Adresse da rein zu tun ist okay, aber beim letzten Element? Im Beispiel kommt da wieder einfach nur eine Null, wären Dummy-Structs nicht besser geeignet?

    Bin etwas verwirrt...



  • hallo,

    hab auch das buch und muss sagen das kapitel kannst du völlig vergessen.
    benutze am besten die container der STL und kümmer dich nicht weiter um sowas 🙂
    Hab ich auch gemacht und bis jetzt noch keine probleme bekommen.



  • Okay danke... weil das widerspricht so gut wie allem, was mir Stroustrup schon in 400 Seiten den Kopf gehämmert hat: globale Variablen, ungültige Adressen und Speicherlecks. *g*



  • Das der Anker auf NULL zeigt ist schon richtig so, zumindest am Anfang. Und next soll auf das nächste Objekt zeigen, aber bei dem letzten Objekt, kann next nur auf NULL zeigen, weil es kein nächstes Objekt gibt, also auch richtig. Natürlich musst du einen Dtor coden, der die ganzen Objekte löscht und Objekt für Objekt durch die Kette durchgeht und alles löscht. Für das Verständnis, würde ich trotzdem versuchen es zu coden.
    Schau dir doch mal das hier an:
    http://www.willemer.de/informatik/cpp/dynamic.htm
    http://84.113.22.230:7980/books/C%2B%2B in 21 Tagen/kap12.html



  • daersc schrieb:

    hallo,

    hab auch das buch und muss sagen das kapitel kannst du völlig vergessen.
    benutze am besten die container der STL und kümmer dich nicht weiter um sowas 🙂
    Hab ich auch gemacht und bis jetzt noch keine probleme bekommen.

    Natürlich benutzt man später die STL-Container. Trotzdem ist es ein schönes Beispiel für OOP und sehr gut geeignet, um einige grundlegende Konzepte aufzuzeigen, bzw. zu erlernen.
    @TE: Arbeite das ruhig durch und versuche zu verstehen, was da passiert; meiner Meinung nach lohnt es sich. Verständnisfragen kannst Du sicher hier klären. Es sind übrigens tatsächlich eine ganze Menge Beispiele in dem Buch (und auf der beiliegenden CD), die den einen oder anderen kleineren Fehler haben. Diese Fehler zu finden, zu erkennen und zu beseitigen ist auch ein lehrreiches Unterfangen.


Anmelden zum Antworten