Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - einfach verkettete liste


Bblackhawk - Mi 11.03.09 17:18
Titel: einfach verkettete liste
hi...

kann mir bitte wer eine einfach verkettete liste posten, die für ihre kettenelemente ziffern von 0-9 annehmen kann ??

vielen dank im vorraus :)

MfG
Bblackhawk


Gausi - Mi 11.03.09 17:21

Wie sieht denn dein Ansatz aus? Was hast du probiert, woran hapert es? Fertige Quelltexte werden hier oft nur ungern gepostet, und etwas Eigeninitiative solltest du schon zeigen, wenn du dir eine eigene BigInt-Klasse schreiben willst.


Bblackhawk - Mi 11.03.09 17:30

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Wie sieht denn dein Ansatz aus? Was hast du probiert, woran hapert es? Fertige Quelltexte werden hier oft nur ungern gepostet, und etwas Eigeninitiative solltest du schon zeigen, wenn du dir eine eigene BigInt-Klasse schreiben willst.


so hier der quelltext:


Delphi-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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
unit TList;

interface

type

TNode = class
         private
           kContent:TObject;
           kNext:TNode;
         public
           constructor create(pContent:TObject; pNext:TNode);
           procedure setContent (pContent:TObject);
           function content:TObject;
           procedure setNext(pNext:TNode);
           function next:TNode;
       end;

List = class
           private
             hHead, kCurrent,kTail :TNode;
           public
             constructor create;
             function isEmpty:boolean;
             procedure next;
             function getItem:TObject;
             private
          end;

implementation

  constructor  TNode.create(pContent:TObject; pNext:TNode);
  begin
    kContent := pContent;
    kNext := pNext;
  end;

  procedure TNode.setContent (pContent:TObject);
  begin
    kContent := pContent;
  end;

  function TNode.content:TObject;
  begin
    result:=kContent;
  end;

  procedure TNode.setNext(pNext:TNode);
  begin
    kNext:=pNext;
  end;

  function TNode.next:TNode;
  begin
    result:=kNext;
  end;

   constructor List.create;
   begin
     hHead:=TNode.create(nil,nil);
     kCurrent:=hHead;
   end;

   function List.isEmpty:boolean;
   begin
     result:=hHead.next= kTail;
   end;


   function List.getItem:TObject;
   begin
     result:=kCurrent.content;
   end;

end.


Fehlerneldung: [DCC Fehler] TList.pas(25): E2065 Ungenügende Forward- oder External-Deklaration: 'List.next'


Marc. - Mi 11.03.09 17:34

user profile iconBblackhawk hat folgendes geschrieben Zum zitierten Posting springen:
Fehlerneldung: [DCC Fehler] TList.pas(25): E2065 Ungenügende Forward- oder External-Deklaration: 'List.next'

Du hast die Methode Next auch nirgendswo definiert bzw. implementiert und mit der Klasse verknüpft. ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  implementation
  ...
  procedure List.Next;
  begin
     ...
  end;

Übrigens, schreibe am besten vor jegliche Arten von Typen den Präfix "T", um diese als solche zu kennzeichnen. Das verhindert hinterher Verwechselung und steigert die Übersicht. ;)


elundril - Mi 11.03.09 17:34

ganz klar. du hast oben bei List eine procedure next deklariert aber dann unten im quelltext nicht implementiert. dadurch meckert der compiler.

lg elundril


Bblackhawk - Mi 11.03.09 17:37

dann müsste doch eigentlich eine einfach verkettete liste erstellt sein...
oder sehe ich das falsch ?


elundril - Mi 11.03.09 17:39

wenn du noch die methode next einbaust hast du die klasse einer einfach verketteten liste erstellt. aber davor noch das List.next einbauen und ausprogrammieren.


Bblackhawk - Mi 11.03.09 17:40

und genau da sitzt das problem, ich weiß nicht genau, wie ich die bastele... ^^


elundril - Mi 11.03.09 17:42

naja, überleg mal. was soll das List.Next machen?

List.next soll ja zum nächsten knoten springen, oder?


Marc. - Mi 11.03.09 17:49

Mir ist gerade eingefallen, dass ich vor gut drei Jahren, bei meinen Anfängen, ein mehr oder minder gutes Tutorial (oder eine Art Kommentar) zu verketten Listen hier im Forum veröffentlicht habe.
Siehe hier [http://www.delphi-forum.de/viewtopic.php?p=393196#393196].
Kannst ja mal schaun, wie ich das damals gemacht habe und versuchen nachzuvollziehen.


Grüße,
Marc

PS: Bitte setz deinen Code künftig in Delphi-Tags. [delphi] Code [/delphi]


Bblackhawk - Mi 11.03.09 17:52

will ja das nächste... also in meinem fall das vorherige element haben... da ich ja mit zahlen arbeite...

also...

Delphi-Quelltext
1:
2:
3:
4:
   procedure List.next;
   begin
    kCurrent:=kCurrent.next;
   end;


dann müsste es doch klappen oder ?


sry wegen tags... dachte das sei hier auch [CODE]...


elundril - Mi 11.03.09 18:00

eigentlich müsste es jetzt dann klappen.

lg elundril

P.S.: vorher, nachher, is eigentlich vollkommen egal, es kommt ja eigentlich nur drauf an ob mans von links nach rechts zeichnet oder rechts nach links. ;-)


Bblackhawk - Mi 11.03.09 18:00

alles klar...

Dankeschön :)

MfG
Bblackhawk


Bblackhawk - Mi 11.03.09 18:07

so, jetz möchte ich eine zahl in meine Liste einfügen...

dann muss ich doch folgendes tun...

ich muss die liste createn... einen node createn und dann ein element einfügen ???

--> dass heißt...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm2.BAdditionClick(Sender: TObject);
var i : integer ;
begin
  zahl.create;
  zahl2.create;
  // Die eingegebenen Zahlen werden in die Listen geschrieben
  for i := length (ENumber1.Text) to i = 0 do
  begin
    zahl.content := length (ENumber1.Text)-i ;
    i := i-1;
  end;


jaenicke - Mi 11.03.09 18:19

user profile iconBblackhawk hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  zahl.create;
  zahl2.create;
  // Die eingegebenen Zahlen werden in die Listen geschrieben
  for i := length (ENumber1.Text) to i = 0 do
  begin
    zahl.content := length (ENumber1.Text)-i ;
    i := i-1;
  end;
Überleg einmal was du machst...Bei dem Quelltext frage ich mich wie du die Listenimplementierung oben hinbekommen haben willst, denn da machst du teilweise das selbe richtig...

Mal eine kleine Korrektur:

Delphi-Quelltext
1:
2:
3:
4:
zahl := TIrgendwas.Create; // So erzeugst du ein Objekt

for i := ... downto 0 do
...
Du solltest dir dringend erst einmal die Grundlagen anschauen. Wie du bei deinen Kenntnissen (deinem Quelltext nach zu urteilen) auf die Idee mit der selbst gebastelten Multiplikation in verketteten Listen kommst, das ist mir allerdings schleierhaft...

Einen sehr guten Crashkurs findest du hier:
http://crashkurs.christian-stelzmann.de
und die neue Version speziell ab Turbo Delphi:
http://www.christian-stelzmann.de/index_tutorials_crashkurs_reloaded.html


elundril - Mi 11.03.09 18:22

bin mir nicht sicher ob es stimmt aber kann es sein das kContent vom Typ integer sein sollte und nicht von Typ TObject?

lg elundril


jaenicke - Mi 11.03.09 18:34

Das kommt noch dazu, aber davon abgesehen ist ohnehin bei dem letzten Quelltext so viel falsch... Ich glaube sowas habe ich noch nie gesehen.
@user profile iconBblackhawk: Die Listenimplementierung ist nicht von dir, oder?


Bblackhawk - Mi 11.03.09 18:51

also....

hier das komplette...

in der unit:

Delphi-Quelltext
1:
2:
    zahl : list;
    zahl2 : list;


im bei create der unit:

Delphi-Quelltext
1:
2:
  zahl := list.create;
  zahl2 := list.create;


in der procedure:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm2.BAdditionClick(Sender: TObject);
var i : integer ;
var help1 : integer;
begin
  // Die eingegebenen Zahlen werden in die Listen geschrieben
  for i := length (ENumber1.Text) to i = 0 do
  begin
    zahl.content := length (ENumber1.Text)-i ;
    zahl.next;
    i := i-1;
  end;
end;


so sieht der rest des quelltextes aus...


jaenicke - Mi 11.03.09 18:55

Die meisten Fehler hast du aber nicht behoben...
user profile iconBblackhawk hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm2.BAdditionClick(Sender: TObject);
var i : integer ;
var help1 : integer;
begin
  // Die eingegebenen Zahlen werden in die Listen geschrieben
  for i := length (ENumber1.Text) to i = 0 do
  begin
    zahl.content := length (ENumber1.Text)-i ;
    zahl.next;
    i := i-1;
  end;
end;
Du benutzt doch feste Werte abhängig von der Länge des eigegebenen Textes, welche eingegebenen Werte?
Und die anderen 5 Fehler hatte ich ja bereits genannt...


Bblackhawk - Mi 11.03.09 19:00


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  for i := length (ENumber1.Text) downto 0 do
  begin
    zahl.setcontent := length (ENumber1.Text)-i ;
    zahl.next;
    i := i-1;
  end;


also...
einmal habe ich denke ich nun das to mit downto ersetzt...
da muss so weit ich das gerallt hab ne 0 hin, weil ich ja von der letzten zahl ausgehe -> i hoch
und nun wird durch i := i-1 immer eine abgezogen, wodurch das i zu 0 wird -> ende der schleife...
zahl.setcontent habe ich nun auch behoben.... wie setzte ich denn nun die richige zahl da ein ??

achso... die eingegebenen sachen sind zahlen... die in einem edit stehen... (ENumber1.Text)


elundril - Mi 11.03.09 19:04


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  for i := length (ENumber1.Text) downto 0 do
  begin
    zahl.setcontent(length (ENumber1.Text)-i); //setcontent braucht einen parameter und keine zuweisungweil methode. 
    zahl.next;
    i := i-1;  //das gehört raus! zugriffe auf die laufvariable bei einer vorschleife sind nicht erlaubt!
  end;


lg


Bblackhawk - Mi 11.03.09 19:22

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

@user profile iconBblackhawk: Die Listenimplementierung ist nicht von dir, oder?



die ist von mir...


Bblackhawk - Mi 11.03.09 19:29

ich habe das problem, dass der mir sagt, wenn ich:

Delphi-Quelltext
1:
    zahl.setcontent (length (ENumber1.Text)-i);                    


setze...

[DCC Fehler] Unit2.pas(53): E2003 Undefinierter Bezeichner: 'setcontent'


was muss ich denn genau in: zahl.setcontent (length (ENumber1.Text)-i); einfügen (anstelle vonlength (ENumber1.Text)-i), damit der die ziffern von hinten nach vorn in die liste kopiert ??


jaenicke - Mi 11.03.09 20:25

Zahl ist vom Typ List, nicht TNode, du müsstest also damit arbeiten.


Bblackhawk - Mi 11.03.09 20:32

ok, dann müsste ich also

Delphi-Quelltext
1:
TNode.setcontent := length (ENumber1.Text)-i                    

machen ?


oder ist generell im 2. teil auch was falsch ??


elundril - Do 12.03.09 15:21

user profile iconBblackhawk hat folgendes geschrieben Zum zitierten Posting springen:
ok, dann müsste ich also

Delphi-Quelltext
1:
TNode.setcontent := length (ENumber1.Text)-i                    

machen ?


oder ist generell im 2. teil auch was falsch ??


Ne, TNode ist ja nur eine Klasse, kein objekt.


Delphi-Quelltext
1:
2:
3:
4:
var Zahl: TNode;
begin
  Zahl := TNode.Create(length(ENumber1.Text)-i, nil);
end;


das erzeugt ein Objekt mit dem Namen Zahl vom Typ TNode. Und mit dem Objekt kannste jetzt arbeiten.

Wozu beim Create eigentlich schon das next angeben? wenn ich einen Knoten erzeug weiß ich ja das nächste noch nicht deswegen wird das eigentlich immer nil sein oder??

lg elundril


Bblackhawk - Do 12.03.09 17:19

ah, okay, danke :)

ich probiers ma su ;) :)