2016-08-30 19 views
0

Ich habe Probleme beim Sortieren eines Stapels in absteigender Reihenfolge, die Sortierung funktioniert mit Hilfe eines anderen Stapels.Sortieren eines Stapels in absteigender Reihenfolge

hier ist der Sortiercode:

void* sort(stack_type* stack, stack_type* auxiliary) { 
    int* element = NULL; 
    while(!is_empty(stack)) { 
    element = pop(stack); 
    while(!is_empty(auxiliary) && head(auxiliary) > element) { 
     push(pop(auxiliary), stack); 
    } 
    push(element, auxiliary); 
    } 
} 

der Ausgang ist somit:

| -4 | 
| -45 | 
| 356 | 
| 87 | 
| 76 | 
| 54 | 
| 34 | 
| 22 | 
| 8 | 
| 2 | 

aber ich mag so:

| 356 | 
| 87 | 
| 76 | 
| 54 | 
| 34 | 
| 22 | 
| 8 | 
| 2 | 
| -4 | 
| -45 | 

hier ist der Kern mit vollständigem Code: https://gist.github.com/avoxy/380e96a87cb3c6cc1f4a62c02fb6428d

thx jungs

+0

Was ein bisschen Ärger *? –

+0

Implementieren Sie Ihren eigenen Stack? Anstatt eine einfach verkettete Liste zu verwenden (was die gebräuchlichste Art ist, einen Stapel zu implementieren), verwenden Sie eine doppelt verkettete Liste und behalten Sie einen Zeiger auf den Kopf und den Schwanz. Dann können Sie beliebig über den "Stack" iterieren. Ich würde es aber nicht mehr als "richtigen" Stapel bezeichnen. –

+3

Welche Art von Sortieralgorithmus soll das sein? –

Antwort

0

Sie sortieren nach den Zeigern, nicht nach den angegebenen Werten. Tatsächlich haben Sie in diesem Fall keine spitzen Werte, was Anlass zu der Frage gibt, warum überhaupt Zeiger verwendet werden sollten. Wie auch immer, das ist das problematische Stück Code:

push((int*) -45, stack); 

Zeiger werden meist nicht negativ sein. Diese Umwandlung bewirkt einen Unterlauf und führt je nach Compiler zu einem großen positiven Zeiger. Daher ist dieser Zeiger größer als jeder der anderen von Ihnen verwendeten Zeiger (mit Ausnahme der -4).

Zusammenfassen: Sortieren Sie nicht nach Zeigern (es sei denn, Sie wissen wirklich, was Sie tun). Verwenden Sie keine Zeiger, um einfache ganze Zahlen darzustellen.

+0

ein anderes Problem, was ich sehe, bevor Ihre Hilfe in der Kopf-Funktion ist, entfernte ich den Zeiger von Kopf-Funktion und der Code arbeiten, thx. –

+0

In diesem Fall (unter der Annahme eines 32-Bit-Modus) ist das Umwandeln in Zeiger effektiv das Gleiche wie das Umwandeln in vorzeichenlose Ganzzahlen. So werden negative Ganzzahlen in 2^32 - Wert geändert, -45 wird in 4294967251 und -4 in 4294967292 geändert, was sie zu den zwei größten Werten macht. – rcgldr

0

Ihre element Variable wird als Typ int * deklariert. Angenommen, das ist angemessen, in Ihrer Art vergleichen Sie Zeiger, aber Sie scheinen stattdessen die Werte zu vergleichen, die sie zeigen zu stattdessen.

Verwandte Themen