2011-12-09 113 views
1

我想排序結構的指針數組,其中比較鍵是結構的屬性之一。排序結構指針陣列qsort

我認爲這可能是比較方法。

下面是一個示例代碼。

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

struct BINARY_ARRAY_RECORD { 
    char *name; 
}; 

int compare(const void *node1, const void *node2) { 
    return strcmp(
     ((struct BINARY_ARRAY_RECORD *) node1)->name, 
     ((struct BINARY_ARRAY_RECORD *) node2)->name 
    ); 
} 

int main() 
{ 
    struct BINARY_ARRAY_RECORD **records; 

    records = malloc(sizeof(struct BINARY_ARRAY_RECORD *) * 2); 

    records[0] = malloc(sizeof(struct BINARY_ARRAY_RECORD)); 
    records[1] = malloc(sizeof(struct BINARY_ARRAY_RECORD)); 

    records[0]->name = malloc(sizeof(char) * (strlen("string2") + 1)); 
    records[1]->name = malloc(sizeof(char) * (strlen("string1") + 1)); 

    strcpy(records[0]->name, "string2"); 
    strcpy(records[1]->name, "string1"); 

    qsort(records, 2, sizeof(records[0]), compare); 

    printf("%s\n", records[0]->name); 
    printf("%s\n", records[1]->name); 

    return 0; 
} 
+4

你的問題在哪裏? – AlexTheo

回答

10

我想這應該是簡單..

int compare(const void *node1, const void *node2) { 
     BINARY_ARRAY_RECORD *ptr1 = *(BINARY_ARRAY_RECORD * const *)node1; 
     BINARY_ARRAY_RECORD *ptr2 = *(BINARY_ARRAY_RECORD * const *)node2; 
     return strcmp(ptr1->name, ptr2->name); 
    } 

而且也是我認爲qsort函數調用可能是絕對正確的,如果它是這樣的事情,

qsort(records, 2, sizeof(BINARY_ARRAY_RECORD*), compare); 

我想第三個參數必須是結構的大小,你可以肯定地確定它是否像上面那樣..

+0

struct BINARY_ARRAY_RECORD **記錄 因此記錄[0]與struct BINARY_ARRAY_RECORD * – tomas

+0

相同我認爲這是第一個答案,但是當我嘗試使用超過2個指針時,數組失敗。正確的答案是給了我Ajai。我編輯一點以擺脫變量。 INT比較(常量無效*節點1,常量無效*節點2){ \t返回STRCMP( \t \t(*(結構BINARY_ARRAY_RECORD * const的*)節點1) - >名稱, \t \t(*(結構BINARY_ARRAY_RECORD * const的* )node2) - >名稱 \t); } – tomas

+0

爲什麼?下標運算符從struct BINARY_ARRAY_RECORD **到結構BINARY_ARRAY_RECORD * – tomas