daten.h =========================================================================================================== #include using namespace std; #ifndef DATEN_H_ #define DATEN_H_ class Daten { private: int iwert; public: Daten (int iVal): iwert(iVal) { cout << "Objekt [Daten] erzeugt\n"; } ~Daten(){} int vergleichen(const Daten&); // Referenz void anzeigen() const; }; class Knoten { public: Knoten(){} virtual ~Knoten(){} virtual Knoten* einfuegen(Daten* d) = 0; virtual void anzeigen() = 0; }; class EndKnoten : public Knoten { public: EndKnoten() { cout << "Objekt [EndKnoten] erzeugt\n"; } ~EndKnoten(){} Knoten* einfuegen(Daten* d); void anzeigen(){}; }; class AnfangsKnoten : public Knoten { private: Knoten* next; public: AnfangsKnoten() { next = new EndKnoten; cout << "Objekt [AnfangsKnoten] erzeugt\n"; } ~AnfangsKnoten(){} Knoten* einfuegen(Daten* d); void anzeigen(); }; class AllgemeinerKnoten : public Knoten { private: Daten* daten; Knoten* next; public: AllgemeinerKnoten(Daten* d, Knoten* n): daten(d), next(n) { cout << "Objekt [AllgemeinerKnoten] erzeugt\n"; } ~AllgemeinerKnoten() { delete next; delete daten; } Knoten* einfuegen(Daten* d); void anzeigen(); }; class Liste { private: AnfangsKnoten *anfang; public: Liste() { anfang = new AnfangsKnoten; } ~Liste() { delete anfang; } void einfuegen(Daten* d) { anfang->einfuegen(d); } void alles_anzeigen() { anfang->anzeigen(); } }; int Daten::vergleichen(const Daten& d) { if(iwert > d.iwert) { return 1; } if(iwert < d.iwert) { return -1; } return 0; } void Daten::anzeigen() const { cout << iwert << '\n'; } void AnfangsKnoten::anzeigen() { next->anzeigen(); } void AllgemeinerKnoten::anzeigen() { daten->anzeigen(); next->anzeigen(); } Knoten* AnfangsKnoten::einfuegen(Daten* d) { next = next->einfuegen(d); return this; } Knoten* EndKnoten::einfuegen(Daten *d) { AllgemeinerKnoten* daten = new AllgemeinerKnoten(d, this); return daten; } Knoten* AllgemeinerKnoten::einfuegen(Daten* d) { int ret = daten->vergleichen(*d); switch(ret) { case 1: { AllgemeinerKnoten* dKnoten = new AllgemeinerKnoten(d, this); return dKnoten; } case -1: { next = next->einfuegen(d); return this; } } return this; } #endif daten.h ENDE ==================================================================================================== daten.cpp ======================================================================================================= #include "daten.h" int main(void) { Liste elemente; Daten* daten; int iwert; for(;;) { cout << "Wert eingeben (0=Ende): "; if((!(cin >> iwert)) || iwert == 0) { break; } daten = new Daten(iwert); elemente.einfuegen(daten); } elemente.alles_anzeigen(); return 0; } daten.cpp ENDE ==================================================================================================