Entwickler-Ecke

Sonstiges (Delphi) - Double Linked List


McC - Mi 12.03.03 14:26
Titel: Double Linked List
Hi Leute,

ich hab jetzt ein paar Einträge aus Google weiterverfolgt, die sich mit der Implementation einer Double Linked List beschäftigen, die waren aber alle mist.

Hat einer von Euch vielleicht ne Idee wie man sowas sauber implementiert? Unter Java is das sooo einfach, mit Delphi kanns dann doch nicht so verflixt kompliziert sein......

Das Problem, das ich bei den meisten Sachen hatte, die ich probiert hab, war folgendes:

Die Liste wurde definiert als Klasse, etwa wie folgt:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TDoubleLinkedList = class;
    [variablen etc]
    constructor create;
    [sonstiger kram halt]
  end;

[blabla]

implementation

constructor TDoubleLinkedList.create;
begin
  inherited create;
  [initialisierungen]
end;

[...]

Sobald ich aber das .create aufrufe, gibt's einen Speicherzugriffsfehler in der Zeile mit dem "inherited". Weiss jemand woran das liegen kann??

Danke schon mal für eure Antworten

Moderiert von user profile iconTino: Code-Tags hinzugefügt.


Luncustaf - Mi 12.03.03 14:35
Titel: Re: Double Linked List
McC hat folgendes geschrieben:


Die Liste wurde definiert als Klasse, etwa wie folgt:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TDoubleLinkedList = class;
    [variablen etc]
    constructor create;
    [sonstiger kram halt]
  end;

[blabla]

implementation

constructor TDoubleLinkedList.create;
begin
  inherited.create;
  [initialisierungen]
end;

[...]



punkt zwischen inherited und create ?


gr€€tz


CenBells - Mi 12.03.03 14:59

definitv ohne punkt zwischen inherited und create. der fehler muss woanders liegen. poste doch nochmal mehr code


Keldorn - Mi 12.03.03 15:23

CenBells hat folgendes geschrieben:
definitv ohne punkt zwischen inherited und create. der fehler muss woanders liegen. poste doch nochmal mehr code

stimme ich zu.
ist die liste von einer anderen Liste abgeleitet?
muß es aber auch nicht

Quelltext
1:
2:
3:
type 
TDoubleLinkedList = class; 
constructor create;  override; <<<----

heißen ?

Mfg Frank


McC - Mi 12.03.03 19:59

override geht nicht, "can not override a stattic method" oder sowas.

Der code sieht genau wie folgt aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
[...]

type
 Pnode = ^Tnode;
 Tnode = record
   next, prev: pnode;
   value: integer;
 end;

 PLinkedList = ^TLinkedList;
 TLinkedList = class
   first, last: pnode;
   count: integer;
   constructor create;
 end;

implementation

uses Sysutils;

Constructor TLinkedList.Create;
begin
inherited create;
end;

[...]


Moderiert von user profile iconTino: Code-Tags hinzugefügt.


Keldorn - Mi 12.03.03 22:15

ok und wie sieht dein restlicher Code aus, dort wo du die liste erzeugst und wie fügst du die nodes hinzu?

Warum willst so eine Liste eigentlich? hast du dir schon mal die normale TList oder Tobjektlist von Delphi angeschaut?

Mfg Frank


McC - Mi 12.03.03 22:41

Hm, wenns nach mir ginge würde ich ein Array verwenden, aber die Aufgabenstellung erfordert ausdrücklich ne Double Linked List. :roll:

Der Teil zum Erstellen einer neuen Instanz von TDoubleLinkedList sieht so aus:

Quelltext
1:
2:
3:
var Messwerte: TDoubleLinkedList;
begin
  Messwerte.Create;


Moderiert von user profile iconTino: Code-Tags hinzugefügt.


CenBells - Mi 12.03.03 22:57

poste dochmal genau den code deiner gesamten implemetierung der tdoublelinked list.
Auf einmal bist du nun bei zeigern auf deine liste.

also grundsätlzich, brauchst du du plinkedlist wohl nicht. und lass doch mal den aufruf inherited create in deinem code weg, dann kann es schon laufen. du initialisierst in deinem constructor
first und last aber mit nil, und count mmit 0, oder?

Gruß
Ken


Keldorn - Do 13.03.03 09:22

McC hat folgendes geschrieben:

Der Teil zum Erstellen einer neuen Instanz von TDoubleLinkedList sieht so aus:

...
var Messwerte: TDoubleLinkedList;
begin
Messwerte.Create;
...

dir ist aber klar , daß es

Quelltext
1:
messwerte:=TDoublelinkedlist.create                    
lauten muß?

tip mal Konstruktoren in der Oh ein und lies dir mal durch, was dort steht.

und Codetags in deinen Beiträgen können auch nicht schaden :wink:

Mfg Frank


McC - Do 13.03.03 11:23

Zitat:

dir ist aber klar , daß es

Quelltext
1:
messwerte:=TDoublelinkedlist.create                    

lauten muß?
Mfg Frank


*Hüstel* ehm, naja, also eigentlich ja schon aber wie das halt immer so ist, nich wahr?? :roll:
DANKE jedenfalls, genau das war's...


maximus - Do 13.03.03 12:01

McC hat folgendes geschrieben:
Hm, wenns nach mir ginge würde ich ein Array verwenden, aber die Aufgabenstellung erfordert ausdrücklich ne Double Linked List. :roll: ...

Du kannst es zwar nicht mit einem array machen, aber warum machst du die double linked list nicht mit records? Wenn ich das richtig sehe, dann ist eine linked list nur verkettete records (oder was auch immer), in denen ein pointer jeweils auf das nächste record zeigt. Bei einer bouble linked list zeig dann einfach ein weiterer pointer auf das vorhergehende record. Oder seh ich das falsch?

Mit objekten kann man natürlich die service routinen direkt in der liste implementieren, dafür ist der overhead aber recht gross.

mfg maximus.


McC - Do 13.03.03 15:00

du brauchst ja einen first und ein last pointer, und eben die Methoden zum Einfügen, suchen, löschen etc, da macht ne Klasse auf jeden Fall Sinn


maximus - Do 13.03.03 18:15

Da ich OOP verfechter bin, schliesse ich mich dir an...ich fühlte mich nur an alte zeiten erinnert (das zeitalter des extended-modes), da haben wir das mit records gemacht...hat prima funktioniert.


McC - Fr 14.03.03 00:10

Ich kann mich auch an Zeiten erinnern, da ich mit Basic nicht-enden-wollende Spaghetti codes geschrieben habe, die nur durch das limit von 64 kb oder wieviel das war Quellcodelimit beendet wurden; und die tolle Notlösung, einen Teil des Codes aus einer Textdatei in eine neue Quellcodedatei zu kopieren und diese aus dem Hauptprogramm aufzurufen - hach, das waren noch Zeiten :wink:


HeLe - So 16.03.03 20:52

Zitat:
PLinkedList = ^TLinkedList;

ist übrigens unnötig, da in Delphi genau wie in Java Objektvariablen grundsätzlich Referenzen sind.
Ich kann in deinem Code aber beim besten Willen keinen Fehler finden, poste mal noch mehr!