![]() |
Denkfehler in simplem Program...
:!: edit :!:
Es hat sich erledigt. Das Program geht jetzt. Das hier kann geschlossen / gelöscht werden... Ich hoffe, ich bin hier im Richtigen Bereich. Wenn nicht, dann bitte verschieben. Also ich schreibe gerade ein Program und ich hänge an einem Problem, was ich einfach nicht lösen kann. Ich habe eine Liste von Einträgen, die ich von klein nach groß sortieren möchte. Das ist ja eigentlich nicht schwer, weshalb es mich um so mehr aufregt, das ich es nicht schaffe. Die Einträge der Liste stehen in einer Pointerkette. Neue Einträge werden "hinten angehängt". Sie sieht also etwa so aus: [Wuzel(Zeiger)] = [lauf(Zeiger)] -> [Eintrag1 / lauf.rechts] -> [Eintrag2 / lauf.rechts.rechts] -> [...] -> [Eintrag.n / lauf.rechts. ... . rechts]:=NIL; Nun will ich wie gesagt diese Einträg sortieren. Dafür habe ich folgende Procedur geschrieben:
Delphi-Quellcode:
Für den Fall, das nur zwei Einträge existieren, funktioniert das Program. Auch die Ausgabe funktioniert. Nur beim restlichen Sortieren muss es Fehler geben! Ich bin das alles schon etliche Male durchgegangen und habe skizzen gemacht und konnte den Fehler nicht finden. Ich habe den EInduck, dass es eine endlosschleife ist. Ich wüsste allerdings nicht wieso das der Fall sein sollte.
procedure TForm1.Button9Click(Sender: TObject);
begin lauf:=wurzel; {wurzel ist der Zeiger, der immer auf den ersten Eintrag zeigt} if lauf.rechts.rechts=NIL then {der Fall, dass nur zwei Einträge existieren} begin if lauf.NC>lauf.rechts.NC then {Wenn sortiert werden muss dann...:} begin help:=lauf; wurzel:=lauf.rechts; lauf:=lauf.rechts; lauf.rechts:=help; lauf.rechts.rechts:=NIL; end; end; repeat if lauf.NC>lauf.rechts.NC then {wenn es mehr als zwei Einträge sind...:} begin if lauf=wurzel then {Wenn die ersten beiden sortiert werden müssen. (Das ist ein Sonderfall, da Wuzel dann verändert werden muss.)} begin help:=lauf; help.rechts:=lauf.rechts.rechts; wurzel:=lauf.rechts; lauf:=lauf.rechts; lauf.rechts:=help; lauf.rechts.rechts:=help.rechts; lauf:=lauf.rechts; end else {Wenn es nicht die ersten beiden Einträge sind...:} begin help:=lauf; lauf:=wurzel; while lauf.rechts<>help do {lauf wird eine Position zurückgestellt um sortieren zu können} lauf:=lauf.rechts; help.rechts:=lauf.rechts.rechts; help.rechts.rechts:=lauf.rechts.rechts.rechts; lauf.rechts:=help.rechts; lauf.rechts.rechts:=help; lauf.rechts.rechts.rechts:=help.rechts.rechts; lauf:=lauf.rechts; end; end else lauf:=lauf.rechts; {Wenn nicht sortiert werden muss, dann lauft er ein Eintrag weiter.} until lauf.rechts.rechts=NIL; {Ende der Sortierprocedure} memo1.clear; {die 4 Einträge (Vorname, Nachname, Alter und NC) werden in 4 memos ausgegeben} memo2.clear; memo3.clear; memo4.clear; lauf:=wurzel; while lauf^.rechts<>NIL do begin memo1.lines.add(lauf^.Vorname); memo2.lines.add(lauf^.Nachname); memo3.lines.add(inttostr(lauf^.Alter)); memo4.lines.add(floattostr(lauf^.NC)); lauf:=lauf^.rechts; end; memo1.lines.add(lauf^.Vorname); memo2.lines.add(lauf^.Nachname); memo3.lines.add(inttostr(lauf^.Alter)); memo4.lines.add(floattostr(lauf^.NC)); end; Über Hilfe wäre ich sehr dankbar! Ich kann bei Bedarf auch weitere Quelltextauszüge geben bzw. das ganze Projekt online stellen. |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Projekte" nach "Sonstige Fragen zu Delphi" verschoben.
Es handelt sich nicht um ein Projekt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz