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
Gausi hat folgendes geschrieben : |
| 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
Bblackhawk hat folgendes geschrieben : |
| 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; 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
Bblackhawk hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| zahl.create; zahl2.create; 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...
- zahl ist nicht initialisiert, du rufst aber create auf. Das geht schonmal nicht.
- Danach weist du zahl.content mehrfach neue Werte zu, die ersten werden also einfach wieder überschrieben.
- Was du da berechnest verstehe ich nicht.
- content ist eine Funktion, kann also nichts zugewiesen bekommen.
- Deine for-Schleife hat keine richtige Syntax.
- Du versuchst in der for-Schleife der Schleifenvariable einen Wert zuzuweisen, das geht nicht.
- 0 ist bei einem String der falsche Endwert, der erste Buchstabe hat den Index 1. Andernfalls müsste die Schleife auch bis ... - 1 laufen.
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; 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.
@
Bblackhawk: 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 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...
Bblackhawk hat folgendes geschrieben : |
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 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); zahl.next; i := i-1; end; |
lg
Bblackhawk - Mi 11.03.09 19:22
jaenicke hat folgendes geschrieben : |
@ Bblackhawk: 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
Bblackhawk hat folgendes geschrieben : |
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 ;) :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!