2016-07-09 18 views
0

Ich möchte diese Situation wissen.qsort in C (dynamische Zuordnung)

wenn ich definieren diesen Satz

struct soccer team[100] ; 

I qsort tun können;

qsort(team, MAX , sizeof(team[0]) , compare) ; 
int compare(const void *a, const void *b) 
{ 
    SOC *A1 = (SOC*)a ; 
    SOC *B1 = (SOC*)b ; 

    if(A1->score > B1->score) 
     return -1 ; 
    else if (A1->score == B1->score) 
     return 0 ; 
    else 
     return 1 ; 
} 

Wenn ich die dynamische Zuordnung tun

struct soccer*team[MAX] ; 
team[Index] = (SOC*)malloc(sizeof(SOC)) ; 

Fehler vorlag. (Qsort und vergleichen Sie ist gleich)

Ich möchte wissen, wie es verwenden (qsort für die dynamische Zuordnung struct)

bitte!

Beispiel (wenn ich erste Weg benutzen)

Man 3 1 1 16 
Che 2 2 2 8 
Asn 0 6 0 6 
hot 6 0 0 18 
City 0 0 6 0 
Bar 1 5 0 8 

umgewandelt

hot 6 0 0 18 
Man 3 1 1 16 
Che 2 2 2 8 
Bar 1 5 0 8 
Asn 0 6 0 6 
City 0 0 6 0 
+0

„qsort und vergleichen Sie ist das gleiche“ es schlecht ist, weil die gleiche Vergleichsfunktion nicht für verschiedenen Elementtyp verwendet werden soll. – MikeCAT

+0

[Bitte lesen Sie diese Diskussion darüber, warum nicht der Rückgabewert von 'malloc()' und Familie in 'C' umgewandelt werden soll. (Http://stackoverflow.com/q/605845/2173917). –

+0

mein Fehler! Originalcode: typedef struct Fußball SOC; –

Antwort

1

Die erste Version

struct soccer team[100] ; 

und die zweite

struct soccer*team[MAX] ; 
team[Index] = (SOC*)malloc(sizeof(SOC)) ; 

sind nicht gleich. Der erste ist ein Array von struct soccer und der zweite ist ein Array von struct soccer *. Sie sind nicht gleich.

Wenn Sie die neuere Version (einschließlich Zeiger) verwenden mögen, und bekommen das gleiche Verhalten wie oben, können Sie so etwas wie

struct soccer * team; 
team = malloc(sizeof *team * SIZE) ; // SIZE is the number of elements  
+0

ja, ich weiß. Ich möchte wissen, mit Weg, wenn ich qsort (dynamische Zuordnung) verwenden –

+0

@CherubimAnand nein, es ist 'sizeof * team', überprüfen Sie den Datentyp. –

+0

@CherubimAnand richtig, aber nichts hindert Sie daran, 'a = malloc (sizeof * a * SIZE)) zu schreiben;' und das ist wahrscheinlich besser. –

0

Die gleiche Vergleichsfunktion tun kann nicht für verschiedene Elementtypen verwendet werden. Verwenden Sie Funktion richtig Vergleich RS (Zeiger auf Elemente, die Zeiger sind, wird gegeben, so dereferenzieren sie die Zeiger zu erhalten, Structs):

int compare2(const void *a, const void *b) 
{ 
    SOC *A1 = *(SOC**)a ; 
    SOC *B1 = *(SOC**)b ; 

    if(A1->score > B1->score) 
     return -1 ; 
    else if (A1->score == B1->score) 
     return 0 ; 
    else 
     return 1 ; 
} 

Hinweis: Sie sagen, you shouldn't cast the result of malloc() in C.

+0

Wenn ich Ihren Code einfüge, hat mein Programm noch einen Fehler. –

+0

@ 박기현 Bitte posten Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve), damit wir es beheben können. – MikeCAT

0

Hier ist ein Demonstrationsprogramm, das zeigt, wie ein ähnliches Array sortiert werden kann.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define MAX 10 

typedef struct soccer 
{ 
    unsigned int score; 
} SOC; 

int cmp(const void *a, const void *b) 
{ 
    const SOC *lhs = *(const SOC **)a; 
    const SOC *rhs = *(const SOC **)b; 

    return (lhs->score > rhs->score) - (rhs->score > lhs->score); 
} 

int main(void) 
{ 
    SOC * team[MAX]; 

    srand((unsigned int)time(NULL)); 

    for (int i = 0; i < MAX; i++) 
    { 
     team[i] = malloc(sizeof(SOC)); 
     team[i]->score = rand() % MAX; 
    }  

    for (int i = 0; i < MAX; i++) 
    { 
     printf("%u ", team[i]->score); 
    } 
    printf("\n"); 

    qsort(team, MAX, sizeof(SOC *), cmp); 

    for (int i = 0; i < MAX; i++) 
    { 
     printf("%u ", team[i]->score); 
    } 
    printf("\n"); 

    for (int i = 0; i < MAX; i++) free(team[i]); 

    return 0; 
} 

Die Programmausgabe ist

2 7 2 5 1 6 1 5 0 4 
0 1 1 2 2 4 5 5 6 7 
+0

Team [i] = malloc (Größe von (SOC)); -> ist dieser Typfehler? –

+0

@ 박기현 Hast du das Programm probiert? Was ist falsch an dieser Aussage? –

+0

Fehler: Ein Wert vom Typ "void *" kann keiner Entität vom Typ "SOC *" zugewiesen werden. –