Einfach verkettete Listen nach der Kundennummer sortieren?
Wie sortiert man einfach verkettete Listen nach der Kundennummer? Also als Beispiel hat man den Namen, Vornamen, und die Kundennummer. Beispiel main-funktion code:
root = createCustomer(1, "Hans", "Maurer");
addCustomer(root, createCustomer(3, "Tatjana", "Roth"));
addCustomer(root, createCustomer(2, "Anna-Maria", "Schmidt"));
Dann soll als erstes Hans Maurer, als zweites Anna-Maria Schmidt und als letztes Tatjana Roth kommen.
2 Antworten
Es gibt verschiedenste Sortieralgorithmen:
https://de.wikipedia.org/wiki/Sortierverfahren
Wenn du die Liste nachträglich sortieren möchtest, würde ich Merge-Sort verwenden, da sich das auf Listen einfach realisieren lässt.
Wenn du die Liste beim Hinzufügen neuer Elemente sortieren möchtest, würde sich Insertion-Sort anbieten.
Eigentlich ist das extremst einfach:
Du gehst durch alle Elemente deiner Liste der Reihe nach durch.
Hast du den passenden Platz für das Element gefunden, fügst du es dort ein.
Einzige Schwierigkeit besteht darin, sich beim Durchhangeln und EInfügen nicht zu vertun mit den Pointern.
Merge-Sort ist by-the-way nicht einfacher, sondren schwerer hier.
Also muss ich erstmal alle Elemente der Liste eingelesen haben?
Bei mir ist das Problem das ich nicht weiß wie man ein bestimmtes Element dann verschiebt. Also als Beispiel eins nach hinten oder vorne
Ne, musst du nicht. Du sortierst das Element beim Einlesen ein.
Du greifst dir quasi immer ein Element und vregleichst das mit deinem neuem. Wenn das größer/kleiner ist, dann gehst du weiter zum nächstem Element, wenn nicht, dann sortierst du es entsprechend ein.
Das "Verschieben" funktioniert so, wie das Einfügen auch, das habe ich dir unter einer anderen Frage erklärt. (Wenn da noch Rückfragen offen sind, würde ich dich bitten, diese dort zu stellen.)
Ok die Logik hab ich jetzt mehr oder weniger verstanden. Das jetzt umzusetzen wird aber schwer. :D
Aber muss den Insert-Sort in eine neue Funktion schreiben bzw. kann ich das auch in diese Funktion schreiben?
customer* createCustomer(int zahl, char* vorname, char* name)
{
customer * neu = (customer*)malloc(sizeof(customer));
if(neu==NULL)
{
exit(-1);
}
strcpy(neu->vorname, vorname);
strcpy(neu->name, name);
neu->kundennummer = zahl;
neu->next = anker;
anker = neu;
return anker;
}
Ok gut zu wissen. Die Sache ist ich benutze stetig meinen eigenen Anker den ich global definiert habe, weil ich nicht genau weiß wie ich root benutzen kann (hab ich bei der Frage ganz oben stehen), deswegen steht in der addCustomer-Funktion eigentlich gar nichts ^^
Hmm ja wie würde man das aber machen? Weil ich benutz ja root auch für die addCustomer-Funktion.
Schreib mir doch mal unter der Antwort auf die andere Frage die Methoden-Signatur.
https://www.gutefrage.net/frage/einfach-verkettete-liste-c
Vielleicht lässt sich damit das Problem bereits lösen. (wenn das nämlich eigentlich ein Doppel-Pointer ist, dann braucht es kein Dummy).
ich schreib dir da mal einfach den ganzen code :D
Am einfachsten sind Sortierverfahren, bei denen Du eien neue Liste aufbaust/aufbauen kannst und bei denen Du keinen Indexzugriff brauchst.
Wenig effiziente Varianten wären Beispielsweise Minsort, Maxsort, Insertionsort.
Eine effiziente Variante mit relativ leichter Umsetzung ist ein abgewandelter Mergesort, bei dem Du direkt mit den Mergeschritten beginnst.
Ich hab mir schonmal Insertion-Sort angeguckt, aber das ist irgendwie extrem kompliziert für mich. Werde es trotzdem nochmal versuchen, wenns dann nicht klappt mach ich einfach Merge-Sort. Vielen Dank für deine Hilfe.