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.