сортировать массив указателей на структуры qsort - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь отсортировать массив указателей на структуры, где ключ для сравнения является одним из свойств структуры.

Я думаю, что, вероятно, это метод сравнения.пример кода.

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

1 Ответ

9 голосов
/ 10 декабря 2011

Полагаю, это должно быть проще ..

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

Я думаютретий аргумент должен быть размером структуры, и вы точно можете быть уверены, что это что-то похожее на приведенное выше.

...