Verkettete Liste



  • Gibts da schon Klassen, die man benutzen kann oder muss man sich alles selbst schreiben ?

    Kann man TList dafür benutzen ?



  • Hallo

    du kannst TList nehmen.
    Allerdings hast du dann nur void * Elemente, was sehr unpraktisch ist.
    Nimm lieber std::list, dort kannst du einen speziellen Elementtyp angeben (und das hat auch wesentlich mehr Funktionen und ist C++ Standard).

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-107265.html
    der Verweis auf BCB-Klassen war zwar nett gemeint, aber in diesem Fall ungünstig.

    bis bald
    akari



  • eben hab ich auch noch gesehen, dass ich auch ruhig TStringList nehmen kann.........

    Wäre auch noch eine ordentliche Lösung



  • Hallo

    TStringList ist zwar eine praktische Klasse, kann aber nicht unbedingt als verkette Liste bezeichnet werden. Wenn das also nicht Bedingung ist, kannst du TStringList nehmen.

    bis bald
    akari



  • TStringList wie auch TList kapseln intern normale Arrays, sind also keine verketteten Listen (std::list ist eine).



  • hmmmm....... also kann man gar nicht einfach einen Zeiger auf die nächste Stringliste machen, wie bei der verketteten Liste oder kann man StringList und das Prinzip der verkettete Liste irgendwe kombinieren ?



  • Verrate uns doch einfach mal was du machen willst. Vielleicht kann dir dann jemand eine geeignete Klasse empfehlen.



  • also.... 😉

    Ich möchte aus einer Datei Zeile für Zeile auslesen. Jede Zeile enthält die Daten für eine Person. Damit muss also nach jeder Zeile eine neue Instanz der Klasse Person angelegt werden. Nun muss ich aber die ganzen Daten auch während der Programmlaufzeit verfügbar halten und damit irgendwo speichern. Dies kann ich wunderbar eigentlich in einer verketteten Liste machen.

    Programmfunktionen:
    - Datei auslesen
    - Zeile für Zeile auslesen
    - Personeninstanzen anlegen
    - Wenn Datei richtig eingelesen ist, dann wahlweise Sortierung nach Vornamen, Nachnamen oder Alter ermöglichen
    - Sortierte Liste ausgeben

    PS: Die Speicherung soll dynamisch verlaufen und es soll keine bestimmten Speichergrenzen haben.



  • Hallo

    dafür kansst du sowohl Arrays (vector) als auch Listen (list) nehmen, eventuell sogar map.
    Wenn du wahlfreien Zugriff auf die Datensätze haben willst, nimm vector.
    Wenn du viel durch die Datesätze iterieren und viel innerhalb bestehender Datensätze einfügen willst, nimm list.
    Wenn du gleich einen Index über z.B. den Namen der Personen haben willst, nimm map.

    bis bald
    akari



  • Für kleiner Datenmengen ist TStringList hier sicherlich ausreichend. Bei sehr großen Datenmengen dann evtl std::liststd::string. Wobei man hier überlegen sollte ob es wirklich notwendig ist alle Daten immer im Speicher zu halten.
    Dann bietet sich evtl. auch eine Datenbank an.



  • Dann hab ich mal eine Frage... 😉

    Ich hab dann meine Klasse "Person" und in der Klasse werden dann immer wieder Instanzen gemacht für jede neue Person, die ich auslese und dann müsste ich doch innerhalb der Klasse dann immer wieder neue Stringlisten machen oder kann ich alles in eine einzige reinschreiben ?

    und wie sieht das dann so BTW aus ?



  • Du solltest wohl besser eine Liste auf deine Klasse "Person" machen und die dann verwalten.



  • aha.... wie würde das denn dann aussehen ?



  • Zeig doch mal die Deklaration deiner Klasse.



  • Ich hab noch nicht so genau eine Ahnung, wie ich das bauen werde...

    Ich weiß nur, dass ich wegen der dynamischen Speicherung Wert auf den Copy-Ctor legen muss.

    Ich hab ja erst angefangen mit C++ und arbeite mich erst hier rein. Der Chef fängt halt immer gleich mit guten Aufgaben an *g*



  • Wenn du Containerklassen verwendest benötigt deine Klasse default Konstruktor, Copy-Konstruktor und Zuweisungsoperator. Wenn du aber in deiner Klasse aber keinen Speicher allozieren musst, reichen in der Regel auch die defaultmässig erzeugten Funktionen. Deswegen sagte ich ja, du sollst mir mal deine Deklaration zeigen.



  • Also die Klasse Liste hatte ich mir so gedacht:

    class Liste
    {
      private:
      ListElement *erstes;
      ListElement *letztes;
      int anzahl;
      Liste();
      ertes(0), letztes(0), anzahl(0){}
      virtual ~Liste();
      bool empty() const
      {return (anzahl==0);}
      int size() const
      {return anzahl;}
      void push_back(const string& schluessel, const string& wert);
      void pop_front();
      ListElement* front()
      {return erstes;}
    };
    

    Für Anregungen und Kritik bin ich immer offen..... 😉
    Ich will ja auch was lernen *g*



  • Das hier ist doch deine Liste, die du ja evtl. durch eine Standardlösung ersetzen wolltest. Ich meinte eigentlich die Klasse, die du in deiner Liste speichern wolltest ("Person").



  • class TPerson
    {
      private:
      char *vorname;
      char *nachname;
      int alter;
    
      TPerson *p = new TPerson; // müsste die Instanz der Person erzeugen
      public:
      ... // hier müssten ja dann Funktionen und andere Bedingungen noch hin
    };
    

    So stell ich mir die Klasse vor, aber ich hab noch keinen Ansatz für eine Klasse, die ich zum Speichern verwende ! 😕



  • Ersetze einfach deine char* durch std::string oder AnsiString und schon brauchst du keinen eigenen Copy-Konstruktor etc. mehr.
    Wenn du diese Klasse so wie sie ist verwenden willst, musst du zwingend Konstruktor, Destruktor, Copy-Konstruktor und Zuweisungsoperator erzeugen.
    Tu dir einen Gefallen und schmeiss rohe Pointer raus.


Anmelden zum Antworten