AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zeiger überführen

Ein Thema von CodyConcrete · begonnen am 19. Okt 2007 · letzter Beitrag vom 19. Okt 2007
Antwort Antwort
CodyConcrete

Registriert seit: 18. Okt 2007
9 Beiträge
 
#1

Zeiger überführen

  Alt 19. Okt 2007, 00:45
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:
  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;
Zu den Problemen(in den einzelnen Prozeduren weiß ich ob es sich um Knoten oder Blätter handelt):
Delphi-Quellcode:
//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
Hoffe ihr versteht mein problem
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
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#2

Re: Zeiger überführen

  Alt 19. Okt 2007, 02:20
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:
TNode = class
public
  Parent: TNode;
  Children: array of TNode;
  Data: ...
end;
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.

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;
  Mit Zitat antworten Zitat
CodyConcrete

Registriert seit: 18. Okt 2007
9 Beiträge
 
#3

Re: Zeiger überführen

  Alt 19. Okt 2007, 04:00
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
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#4

Re: Zeiger überführen

  Alt 19. Okt 2007, 12:55
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:
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;
Oder, um auch hier die Zeiger wieder wegzulassen, kannst du deine Daten-Struktur auch durch eine Klasse abbilden.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz