Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi lineare liste mit pointer (https://www.delphipraxis.net/70397-lineare-liste-mit-pointer.html)

bonanza 29. Mai 2006 19:01


lineare liste mit pointer
 
Hi,

ich versuche mich gerade an einer Linearen liste mit pointern...

dafür habe ich mir DIESES Tutorial angeschaut....


und dementsprechend habe ich es so veruscht:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
     TDaten    = integer;
     TToElement = ^TElement;
     TElement  = record
                    Daten : TDaten;
                    ToNext: TToElement;
                  end;


  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  wurzel, ll:Ttoelement;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); {push}
var Element: TToElement;
begin
  New (Element);
  Element^.Daten := random(20)+1;
  Element^.ToNext:= ll;
  ll        := Element;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ll := nil;
end;

procedure TForm1.Button2Click(Sender: TObject);

var Element: TToElement;
begin
    pop   := ll^.Daten; //<-------- *1
    Element:= ll;
    ll := ll^.ToNext;
    Dispose (Element);
end;

end.
da ich das selbe wort wie im tutorial "pop" (markierte Zeile *1) benutzt habe funktioniert es natürlich nicht, aber meine frage ist, was ist diese Pop ? ist es die "wurzel" , die auf das 1. element zeigt oder was ?
Und was müsste ich dementsprechend abändern ?

danke schomal im voraus !

mkinzler 29. Mai 2006 19:07

Re: lineare liste mit pointer
 
Pop ist das entfernte erste Element der Liste, Das 2.Element wird dann erstes. Es scheint sich hier um eine Queue zu handeln.
Die variable Pop ist aber nicht deklariert, deshalb wird hier ein Fehler kommen. Außerdem machst du ja nichts damit, dann könntest du dir das Abspiechern des Elementes auch sparen.

bonanza 29. Mai 2006 19:12

Re: lineare liste mit pointer
 
erstmal danke für die schnelle antwort !

also meine aufgabe ist es ansich eine lineare liste zu erstellen, wo man bei bedarf neue elemente hinzufügen kann...
und am ende sollen diese dann alle ausgegeben werden...

wie kann dies realisieren ?

Hador 29. Mai 2006 19:25

Re: lineare liste mit pointer
 
Evtl. hilft dir dies ja:
http://larskiesow.de/delphi_objlist.html

Ich habe das ganze allerdings mit einem Internen dynamischen array gelöst.
Alternativ könnte ich dir noch eine Implementierung anbieten, die auf zwei Stacks aufbaut (mussten wir mal in Informatik machen)
Ist allerdings nicht mit Pointern.

bonanza 29. Mai 2006 19:33

Re: lineare liste mit pointer
 
danke, aber ich bräuchte eine lösung mit pointern....

mkinzler 29. Mai 2006 19:35

Re: lineare liste mit pointer
 
Dein Programm implementiert einen Art Stack (Keller). Was verstehst du unter einer "Linearen Liste", eine einfach verkettete Liste?

bonanza 29. Mai 2006 19:46

Re: lineare liste mit pointer
 
ja genau eine verkette liste von Records mit pointern.

TheAn00bis 29. Mai 2006 19:48

Re: lineare liste mit pointer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Schau dir mal die Liste bei mir im Anhang an, die haben wir im Unterricht verwendet. Ist etwas merkwürdig programmiert, aber sollte das sein, was du suchst.

Ich würde empfehlen nur das Prinzip abzuschauen und das Ding nochmal zu programmieren, denn einiges ist unschön gelöst und diesen Englisch-Deutsch-Mischmasch kann ich gar nicht ab. :D

Edit: Records? Diese speichert alles was von TObject kommt... Aber Records wohl weniger?

bonanza 29. Mai 2006 19:51

Re: lineare liste mit pointer
 
danke für die datei, aber irgendwie verstehe ich nicht, wie du es gelöst hast...

ja muss ja kein record sein, sonder egal was für ein datentyp...

mkinzler 29. Mai 2006 19:53

Re: lineare liste mit pointer
 
Wenn du eine einfach verkette Liste willst, dann mußt du nur die Funktion zum Anhängen ändern. Jetzt hängst du ja an den Anfang an.

bonanza 29. Mai 2006 19:56

Re: lineare liste mit pointer
 
ja das wäre mir ja egal, ob er das vorne oder hinten anhängt.

in wieweit muss ich denn die funktion abändern ?

mkinzler 29. Mai 2006 20:03

Re: lineare liste mit pointer
 
Das kommt darauf an, was du mit der Liste erreichen willst. Soll die Liste geordnet sein, brauchst du eine Anhängen-(Append) und eine Einfügeb-(Insert) Funktion.

TheAn00bis 29. Mai 2006 20:11

Re: lineare liste mit pointer
 
Das ist eine ziemlich einfach aufgebaute lineare Liste:

Jedes Objekt kennt seinen Vorgänger und seinen Nachfolger und natürlich seinen Inhalt, der irgendwas sein muss, dass von TObject abgeleitet wurde. Dies erkennt man unschwer an den Attributen der Klasse "Listenelement":

Delphi-Quellcode:
   Listenelement = Class
                     inhalt : TObject;
                     vor, nach : Listenelement;
Die eigentliche Liste ist aber die Klasse "List". Beim Erstellen wird ein Anfangs- und ein End-Listenelement erstellt, diese beiden werden verknüpft, in dem die Attribute "vor" und "nach" dementstrechend gesetzt werden:

Delphi-Quellcode:
constructor List.init;
var vorne, hinten : Listenelement;
begin
   create;

   vorne:= Listenelement.init;
   hinten:=listenelement.init;

   vorne.nach := hinten;
   hinten.vor := vorne;

   erstes:= vorne;
   letztes:= hinten;
   aktuelles := vorne;
end;
Zusätzlich muss die Liste wissen, wo der Anfang und wo das Ende und welches das aktuelle Element ist, auch diese werden hier festgelegt und sind die vorher initalisieren Elemente. Das aktuelle Element ist nach dem Initialisieren das erste. Diese beiden ersten Objekte bekommen aber nie Inhalt, sie sind nur da, um den Anfang und das Ende festzulegen.
Um Elemente einzufügen gibt es die Methoden "insert before" und "insert behind", das "before" und "behind" geht dabei immer vom aktuellen Listenelement aus (Attribut "aktuelles", der Klasse "List").
Ich gehe jetzt mal auf "inser before" ein, analog dazu funktioniert auch "insert behind" ;):
Um das Element dort einzufügen, muss ein neues Element erstellt werden, dass als Attribut "vor" das Element vor dem aktuellen speichert, im Attribut "nach" das aktuelle selber. Außerdem muss dem aktuellen Element noch mitgeteilt werden, dass sich sein Vorgänger geändert hat, also enthält sein Attribut "vor" einen Pointer auf das neu erstellte Element. Und das Element, dass vor dem neuen steht muss auch seinen neuen Nachfolger kennen, also erhält sein Attribut "nach" ebenfalls einen Pointer auf das neue.
Außerdem wird natürlich der Inhalt des neuen Elements noch gesetzt, dieser msus als Parameter übergeben werden.

Hier nochmal die komplette Methode, um das besser nachvollziehen zu können:

Delphi-Quellcode:
procedure List.insertBefore (pInhalt: TObject);
var neues : Listenelement;
begin
  neues:=Listenelement.init;
  neues.inhalt := pInhalt;
  neues.vor:= aktuelles.vor;
  neues.nach := aktuelles;
  aktuelles.vor.nach:=neues;
  aktuelles.vor:=neues;
end;
Die anderen Methoden sind alle sehr einfach. "Next" und "Previous" ändern das aktuelle Element, dazu muss einfach nur der Nachfolger oder Vorgänger des aktuellen Elements abgefragt werden. Mit "toFirst" und "toLast" gelangt man jeder Zeit um ersten und letzten Element, dies ist ganz einfach, da die Pointer hierdrauf bereits am Anfang gespeichert wurden.
"Delete" löscht das aktuelle Element, dazu müssen einfach die Attribute "vor" und "nach" des Vorgängers und Nachfolgers entsprechend geändert werden.

Hoffe das hilft dir. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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