Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: problem beim sortieren einer verketteten liste

  Alt 5. Aug 2009, 00:55
bei dem Code selber seh icht grad nicht so durch, als daß ich jetzt och Fehler finde (ist aber auch schon spät)

für alle deine RadioButons (1-6) kannst du auch eine einzige OnClick-Prozedur nutzen (einfach allein zuweisen)

das lauf2=ende2 würde ich zuerst abfragen, bevor ich auf lauf2 für dür den/die Vergleich(e) zugreife

dann nutzt du in der Sortieren-Funktion durcheinander diese Booleans und die CheckBoxen.
wenn du schon diese Booleans hast, warum nutzt du dann nicht nur diese?

und das mit dem True wurde schon gesagt.

ich hoff mal ich hab's auf das Wichtigste reduziert (an der Funktionsweise sollte sich nicht viel geändert haben, abgesehn vom lauf2=ende2)
Delphi-Quellcode:
procedure TForm1.RadioButtonClick(Sender: TObject);
begin
   nachname := RadioButton1.Checked;
   vorname := RadioButton2.Checked;
   kategorie := RadioButton5.Checked;
   geburtstag := RadioButton6.Checked;
   richtung := RadioButton3.Checked;
   // RadioButton4 ist in der 3 enthalten, da ja wohl das Negative
   sortieren;
end;

procedure sortieren;
begin
   lauf:=TKnoten.Init;
   if (anfang.nachfolger<>ende)
   then begin
      anfang2:=TKnoten.Init;
      ende2:=TKnoten.Init;
      anfang2.nachfolger:=ende2;
      ende2.vorgaenger:=anfang2;

      lauf:=anfang;
      repeat
         lauf:=lauf.nachfolger;
         neu2:=TKnoten.Init;
         neu2.Daten:=lauf.Daten;
         lauf2:=anfang2;
         repeat
            lauf2:=lauf2.nachfolger;
         until (lauf2=ende2)
            or ( richtung and nachname and (lauf2.Daten.nachname > neu2.Daten.nachname))
            or (not richtung and nachname and (lauf2.Daten.nachname < neu2.Daten.nachname))
            or ( richtung and vorname and (lauf2.Daten.vorname > neu2.Daten.vorname))
            or (not richtung and vorname and (lauf2.Daten.vorname < neu2.Daten.vorname))
            or ( richtung and kategorie and (lauf2.Daten.kategorie > neu2.Daten.kategorie))
            or (not richtung and kategorie and (lauf2.Daten.kategorie < neu2.Daten.kategorie))
            or ( richtung and geburtstag and (lauf2.Daten.geburtstag > neu2.Daten.geburtstag))
            or (not richtung and geburtstag and (lauf2.Daten.geburtstag < neu2.Daten.geburtstag));
         lauf2.vorgaenger.nachfolger:=neu2;
         neu2.vorgaenger:=lauf2.vorgaenger;
         lauf2.vorgaenger:=neu2;
         neu2.nachfolger:=lauf2;
      until (lauf=ende.vorgaenger);
      anfang:=anfang2;
      ende:=ende2;
      knoteneinlesen;
   end;
end;
ich glaub so müßte man es noch kürzen können
Delphi-Quellcode:
repeat
   lauf2:=lauf2.nachfolger;
until (lauf2=ende2)
   or (nachname and ((lauf2.Daten.nachname < neu2.Daten.nachname) xor richtung))
   or (vorname and ((lauf2.Daten.vorname < neu2.Daten.vorname) xor richtung))
   or (kategorie and ((lauf2.Daten.kategorie < neu2.Daten.kategorie) xor richtung))
   or (geburtstag and ((lauf2.Daten.geburtstag < neu2.Daten.geburtstag) xor richtung));

nja, zumindestens isses jetzt etwas übersichtlicher und man findet womöglich den Fehler schneller,
außerdem nur ein Sortier-Code, statt 4 = 75% weniger Fehlerquellen



um wieviele Listenelemente handelt es sich denn?
ich hab es mir letztens einfach gemacht

- Elemente gezählt
- dynamisches Array für die Elemente angelegt
- Array gefüllt
- in dem Array sortiert
- und dann über das Array neu neu verkettet

so geht das sortieren sogar etwas schneller, da man direkt über den Arrayindex sortieren und agieren kann
und sich wärend des Sortierens sich nicht um die Verknüfungen kümmern muß


[add]
sind RadioButton 3 und 4 unabhängig von den Anderen?
Gruppe 1 = 1, 2, 5 & 6
Gruppe 2 = 3 & 4

denn wenn in auch nur einer der Gruppen kein Button gecheckt ist, dann macht deine Version nix
$2B or not $2B
  Mit Zitat antworten Zitat