Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Denkfehler in simplem Program... (https://www.delphipraxis.net/45135-denkfehler-simplem-program.html)

El Cattivo 30. Apr 2005 11:20


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:
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;
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.
Über Hilfe wäre ich sehr dankbar! Ich kann bei Bedarf auch weitere Quelltextauszüge geben bzw. das ganze Projekt online stellen.

DP-Maintenance 30. Apr 2005 19:00

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