Einfach verkettete Listen nach der Kundennummer sortieren?

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.

RopickHD 
Fragesteller
 11.06.2022, 12:46

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.

1
Destranix  11.06.2022, 12:47
@RopickHD

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.

1
RopickHD 
Fragesteller
 11.06.2022, 12:56
@Destranix

Also muss ich erstmal alle Elemente der Liste eingelesen haben?

1
RopickHD 
Fragesteller
 11.06.2022, 12:58
@Destranix

Bei mir ist das Problem das ich nicht weiß wie man ein bestimmtes Element dann verschiebt. Also als Beispiel eins nach hinten oder vorne

0
Destranix  11.06.2022, 13:02
@RopickHD

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.)

1
RopickHD 
Fragesteller
 11.06.2022, 13:10
@Destranix

Ok die Logik hab ich jetzt mehr oder weniger verstanden. Das jetzt umzusetzen wird aber schwer. :D

1
RopickHD 
Fragesteller
 11.06.2022, 13:16
@Destranix

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;

}

0
Destranix  11.06.2022, 13:17
@RopickHD

Ich würde das bei der "addCustomer"-Funktion dazuimplementieren.

1
RopickHD 
Fragesteller
 11.06.2022, 13:21
@Destranix

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 ^^

1
Destranix  11.06.2022, 13:23
@RopickHD

Das wäre eine Frage, die man unter der anderen Frage klären sollte.

Ich vermute entweder ist die Methodensignatur falsch oder man möchte von dir, dass das Root-Element ein Dummy-Element ist, also kein eigenes Element, sondern nur ein verweis auf die Liste.

1
RopickHD 
Fragesteller
 11.06.2022, 13:24
@Destranix

Hmm ja wie würde man das aber machen? Weil ich benutz ja root auch für die addCustomer-Funktion.

0
RopickHD 
Fragesteller
 11.06.2022, 13:28
@Destranix

ich schreib dir da mal einfach den ganzen code :D

0
Destranix  11.06.2022, 13:29
@RopickHD
ich schreib dir da mal einfach den ganzen code

Eher die Aufgabenstellung.

0

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.