Forum: PC-Programmierung Sortieren mit Bubblesort in C


von Simon (Gast)


Lesenswert?

Hallo, ich habe in C eine Funktion geschrieben, mit welcher ich Einträge 
einer Liste aufsteigend nach deren ID (data_.identifier_) sortieren 
soll. Die ID ist ein unsigned int.

Mein Problem ist, dass, nachdem ich das erste Mal die Einträge 
vertauscht habe, dass ich dann in die zweite if springe, was ich aber 
nicht will.
Weiß jemand, was ich hier für einen Denkfehler habe.

hier mein Code
1
List *BubbleSort(List *list)
2
{  
3
  List *present = NULL;
4
  List *next = NULL;
5
  List *temporary= NULL;
6
  
7
  for(present = list; present->next_ != NULL; present = present->next_)
8
  {
9
    for(next = present->next_; next->next_ != NULL; next = next->next_)
10
    {    
11
      if(present->data_.identifier_ > next->data_.identifier_)
12
      {
13
        temporary = present;
14
        present = next;
15
        next = temporary;
16
      }
17
18
      if(present->data_.identifier_ == next->data_.identifier_)
19
      {
20
        list = present;
21
        return list;
22
      }
23
    }
24
  }
25
  list = present;
26
  return list;
27
}

von STK500-Besitzer (Gast)


Lesenswert?

Wozu brauchst du die 2. If-Abfrage?

von STK500-Besitzer (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Wozu brauchst du die 2. If-Abfrage?

Die brauchst du eigentlich nur, wenn in deiner Liste die IDs nur einfach 
vorhanden sein dürfen.
Die Abfrage solltest du in den else-Zweig der ersten Abfrage packen.

von Simon (Gast)


Lesenswert?

Ja genau deswegen hab ich diese Abfrage, um auf Fehler zu überprüfen, 
denn laut meiner Spezifikation des Programmes sind gleiche IDs ein 
Fehler.

Nur ich habe das Problem, dass ich nach einem Durchlauf der 1. if die 
zweite if erfülle und somit in *next und *present dasselbe steht.

von Simon (Gast)


Lesenswert?

Ich habe jetzt einmal die beiden Ifs vertauscht (die auf Gleichheit habe 
ich unter die 1. angeordnet). Nun bin ich draufgekommen, dass das 
Austauschen im 1. Schleifendurchlauf funktioniert, sobald ich aber in 
der for-Schleife einmal durch bin, steht in present und next dasselbe.

von Karl H. (kbuchegg)


Lesenswert?

Simon schrieb:

>        temporary = present;
>        present = next;
>        next = temporary;

Du kannst diese Variablen vertauschen soviel du willst, deswegen vändern 
sich aber die Verpointerungen nicht, die die Liste aufbauen.

Du musst schon die Liste selbst modifizieren, damit sie in eine 
sortierte Reihenfolge kommt.

Hinweis: ANstelle das man die Verpointerug ändert, ist es manchmal (so 
wie hier bei dir) einfacher, wenn man die Verlinkung selbst gleich 
lässt, und dafür die Daten in den Listenknoten vertauscht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.