![]() |
Zeiger überführen
Hi,
Ich benötige eine Baumstruktur die aber Verschiedene Elemente enthält Ich habe zwei verschiedene Elementtypen Die Knoten des Baums sollen bei mir entweder wiederrum auf Knoten zeigen können, oder aber auch auf die Blätter Da beide aber unterschiedliche Elemente sind hab ich momentan keine Idee wie ich dies Realisieren kann ich habe bisher einen Zeiger auf eine Klasse gemacht habe, von der auch beide Elemente des Baums abstammen. Problematisch wird es wenn ich nun ein neues Element hinzufüge Wenn ich weiß, dass es sich um ein Knoten handeln und ich es auch als solch einen definiere kommt natürlich ein Fehler, wenn ich diesen an den Baum angliedern will hier ma Quelltext dazu:
Delphi-Quellcode:
Zu den Problemen(in den einzelnen Prozeduren weiß ich ob es sich um Knoten oder Blätter handelt):
pTreeElement = ^TreeElement; //Zeiger auf die Klasse
TreeElement = class .... Parent : pTreeElement; end; pTreeNode = ^TreeNode; //Zeiger direkt auf die Knoten-Elemente TreeNode = class(TreeElement) public ... Child : Array of pTreeElement; //Zeiger sollen wie oben gesagt sowohl auf TreeNode als auch //TreeLeave zeigen können end; TreeLeave = class(TreeElement) public ... end;
Delphi-Quellcode:
Hoffe ihr versteht mein problem
//aus der Prozedur zum Hinzufügen eines Knotens
Var p : pTreeNode; .... anTree^.Child[...] := p; //<-----------Fehler Inkompatible Typen //anTree is der Knoten an den angegliedert wird Einzige Möglichkeit die mir einfällt wäre jedem Knoten eine extra Liste/Feld zuzuweißen für die Blätter(wäre aber denke nich grad die schönste Mgöglichkeit) danke schonmal für alle antworten |
Re: Zeiger überführen
Objektvariablen sind in Delphi automatisch Zeiger. Es ist also unnötig, eine weitere Indirektion einzuführen.
Überlegen wir mal, was du überhaupt machen willst: So wie ich das verstanden habe, willst du eine einfache Baumstruktur, bei der jeder Knoten auf beliebig viele weitere Knoten verweisen kann. Dann bietet sich eine einfache Struktur an:
Delphi-Quellcode:
Mehr brauchst du nicht. Du kannst leicht ein Knoten von einem Blatt unterscheiden, indem du überprüfst, ob weitere Knoten vorhanden sind. Falls nein, hast du ein Blatt und kannst auf die Daten des Blatts zugreifen.
TNode = class
public Parent: TNode; Children: array of TNode; Data: ... end; Jetzt kannst du auch sehr einfach neue Knoten oder Blätter hinzufügen:
Delphi-Quellcode:
TNode = class
public Parent: TNode; Children: array of TNode; Data: ... procedure AddNode(Node: TNode); end; implementation procedure TNode.AddNode(Node: TNode); begin SetLength(Children, High(Children)+1); Children[High(Children)] := Node; end; |
Re: Zeiger überführen
hi,
Danke für deine Antwort Die Sache ist halt die, dass ich bei den Blättern Daten hab, die ich bei den Knoten gar nicht brauche Deswegen wollte ich versuchen diese Daten entsprechend bei den Knoten wegzulassen Aber dann werd ich es wohl so machen Danke |
Re: Zeiger überführen
Verwende doch einen Zeiger auf deine Daten-Struktur, dann kannst du diesen in den Knoten auf nil setzen, und so signalisieren, dass dort keine Daten vorhanden sind.
Um das Beispiel von oben nochmal zu erweitern:
Delphi-Quellcode:
Oder, um auch hier die Zeiger wieder wegzulassen, kannst du deine Daten-Struktur auch durch eine Klasse abbilden.
PCoolData = ^TCoolData;
TCoolData = record Wow: Integer; Cool: Single; Hey: string; end; TNode = class public Parent: TNode; Children: array of TNode; Data: PCoolData; procedure AddNode(Node: TNode); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz