Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Gibt es ein Modell für "Doppelt verkettete Listen&a

  Alt 23. Nov 2006, 16:06
Hi,
den einen Weg gibt es nicht. Das liegt aber einfach daran, dass du eine Liste implementieren kannst wie du möchtest. Arbeitest du auf Arrays (der übliche Weg), dann heißt das Vorwärtsbewegen etwas anderes, als wenn du hier Records oder Klassen mit Veweisen auf die Nachbarn hast. Der eine Weg ist dabei effizienter, der andere Platzsparender.

Aber wenn ich dich richtig verstanden habe, dann reicht es, wenn du mit einer abstrakten Klasse, einer konkreten Implementierung (oder auch beliebig vielen) und zu guter Letzt noch einen Wrapper für spezielle Datentypen arbeitest.

An sich kannst du eigentlich sogar den Datentyp TList von Delphi verwenden, verwendest du nur Objekte, dann natürlich auch TObjectList. Hier gibt es bereits Funktionen zum hinzufügen oder entfernen von Elementen. Allerdings speichert eine TList einfach nur Zeiger, ganz untypisiert. Das heißt, wenn du etwas reinpackst, musst du es beim rausnehmen wieder casten (sonst hast du nur einen normalen Zeiger). Dazu kannst du dann für jede der Klassen einen Wrapper schreiben. Noch komfortabler geht das ganze mit Generics, die werden aber von Delphi nicht wirklich unterstützt (gab da glaube ich einen Weg, der aber auch nicht so richtig elegant ist).

Jedenfalls kannst du einfach eine Klasse von TList ableiten und in dieser Klasse dann deine eigenen Funktionen einfügen (add, remove, first, last,..). Bei Hinzufügen lässt du dann ebend nur typisierte Zeiger zu. Den Parameter speicherst du dann einfach in der TList, beim rausnehmen gehst du analog vor und castest das entfernte Element einfach in diesen typisierten Zeiger.

Alternativ kannst du auch sowas verwenden:

Delphi-Quellcode:
type
  TClassType = TObject;

  TMyList = class(TObject)
    private
      FList : TObjectList;
    public
      procedure add(const Element : TClassType);
      function getFirst : TClassType;
      function getLast : TClassType;
      function remove(const index : Integer) : TClassType;
  end;
Ist nicht schön, aber du kannst einfach für jede Liste die komplette Unit kopieren und dann halt TClassType immer entsprechend anpassen. Das Speichern kann weiterhin eine TObjectList (oder irgendwas anderes) übernehmen, das was du rausholst castet du dann einfach in den Typ TClassType (der immer dem Typ der Liste entspricht).

Gruß Der Unwissende
  Mit Zitat antworten Zitat