2011-12-09 90 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