
Mir kam gerade so ein Einfall, wie man denn eine Liste sortieren könnte, und zwar nach unterschiedlichen Eigenschaften. Ich weiß nicht ob es das Konzept schon gibt, aber ich leg mal meine Überlegungen dar^^
Als Beispiel:
Unsere Mitgliederliste kann man ja nach Name, Beiträge, Angemeldet seit, etc sortieren.
Ich weiß jetzt nicht, wie das im Falle unserer Mitgliederliste nun genau gemacht wird, aber ich würde das so machen:
Alle Elemente (=Mitglieder) in eine verkettete Liste packen. Da in dem Beispiel jetzt Mitglieder erst in diese Liste eingereiht werden, wenn sie sich auch anmelden (logisch...), ist die Liste praktisch schon nach einer Eigenschaft sortiert:
Angemeldet seit.
Um das Ganze nicht zu abstrakt zu halten, hier mal ein bisschen Beispielcode in C++:
Code: Alles auswählen
struct Element {
string Name;
struct Datum Anmeldedatum;
unsigned int Beiträge;
}
Code: Alles auswählen
struct Element {
string Name;
struct Datum Anmeldedatum;
unsigned int Beiträge;
struct Element *Danach_Angemeldet;
struct Element *Davor_Angemeldet;
}
Jetzt wollen wir natürlich noch nach dem Namen sortieren können:
Code: Alles auswählen
struct Element {
string Name;
struct Datum Anmeldedatum;
unsigned int Beiträge;
struct Element *Danach_Angemeldet;
struct Element *Davor_Angemeldet;
struct Element *Name_weiter_unten_im_ABC;
struct Element *Name_weiter_oben_im_ABC;
}
Jetzt noch die Anzahl der Beiträge:
Code: Alles auswählen
struct Element {
string Name;
struct Datum Anmeldedatum;
unsigned int Beiträge;
struct Element *Danach_Angemeldet;
struct Element *Davor_Angemeldet;
struct Element *Name_weiter_unten_im_ABC;
struct Element *Name_weiter_oben_im_ABC;
struct Element *Mehr_Beitraege;
struct Element *Weniger_Beitraege;
}
Wobei man diese Pointer eigentlich nicht brauchen würde, so geht es aber schneller, da man nicht jedesmal den Anfangs/Endpunkt suchen muss.
Code: Alles auswählen
struct Element *Anmeldungsdatum_Start;
struct Element *Anmeldungsdatum_Ende;
struct Element *ABC_Start;
struct Element *ABC_Ende;
struct Element *Beitragsanzahl_Start;
struct Element *Beitragsanzahl_Ende;
Zuerst einmal hängt man das Element ganz hinten an die Liste Anmeldungsdatum. Das Element ist ja das, das als letztes hinzugefügt wurde.
Man nimmt also das Element Anmeldungsdatum_Ende und trägt bei Danach_Angemeldet das neue Element ein.
Beim neuen Element trägt man bei Davor_Angemeldet das Element Anmeldungsdatum_Ende ein.
Jetzt setzt man Anmeldungsdatum_Ende auf das neue Element.
So ähnlich funktioniert das auch mit den anderen Elementen:
Nur muss man hier darauf achten, die Elemente gleich sortiert einzufügen.
Ein Beispiel:
Das neue Element (der neue Benutzer) hat 5 Beiträge (ist jetzt unlogisch, aber egal).
Dann sucht man in der Liste Beitragsanzahl solange, bis man das erste Element mit 5 Beiträgen gefunden hat.
Vor dieses setzt man dann das neue Element in die Liste ein.
Wie das geht dürfte eigentlich klar sein.
Einfach wieder die Zeiger in den Elementen davor und dahinter und im neuen Element anpassen.
Diesesmal muss man aber (logischerweise) die Zeiger der Liste Beitragsanzahl hernehmen.
So.

Ich hoffe das hilft irgendwem vielleicht.
Achja: Gibt es das schon?
Hättet ihr Verbesserungen vorzuschlagen?
MfG
Daniel