2016-07-09 59 views
0

我想知道這種情況。qsort in C(動態分配)

,當我確定了這句話

struct soccer team[100] ; 

我可以做快速排序;

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 ; 
} 

當我做動態分配存在

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

錯誤。 (快速排序和比較相同)

我想知道如何使用它(快速排序動態分配結構)

請!

例子(當我使用第一種方式)

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 

轉換

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和比較是相同的」是不好的,因爲相同的比較函數不應當被用於不同的元素類型。 – MikeCAT

+0

[請參閱此討論,爲什麼不在'C'中爲'malloc()'和family生成返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+0

我的迷惘! 原始碼:typedef struct soccer SOC; –

回答

1

第一版

struct soccer team[100] ; 

,第二個

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

不一樣。第一個是struct soccer的數組,第二個是struct soccer *的數組。他們不只是一樣。

如果要使用更高版本(包括指針),並獲得相同的行爲上面,你可以這樣做

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

是的,我知道了。我想知道當我使用qsort(動態分配)時使用的方式 –

+0

@CherubimAnand不,它是'sizeof * team',檢查數據類型。 –

+0

@CherubimAnand正確,但沒有任何東西阻止你寫'a = malloc(sizeof * a * SIZE));'這可能更好。 –

0

同樣的對比功能不能用於不同的元素類型。使用正確的比較函數,像這樣的(指向元素,這些元素的指針,將給予,所以取消引用他們獲得指針結構):

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 ; 
} 

注:他們說you shouldn't cast the result of malloc() in C

+0

當我插入你的代碼時,我的程序還有錯誤。 –

+0

@박기현請發佈一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)讓我們修復它。 – MikeCAT

0

這是一個演示程序,顯示瞭如何對一個相似的數組進行排序。

#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; 
} 

程序輸出是

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

team [i] = malloc(sizeof(SOC)); - >是這種類型的錯誤? –

+0

@박기현你嘗試過這個程序嗎?這個聲明有什麼問題? –

+0

錯誤:無法將類型「void *」的值分配給類型爲「SOC *」的實體 –