Как отсортировать указатели массива структуры по имени? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь отсортировать структуру по полю 'name', но это не работает: / Можете ли вы показать или объяснить мне проблему, которую я не видел?

struct clients {
int id;
char name[27];
};

int comparator(const void* p, const void* q){
return strcmp(((struct list_node*)p)->name,
              ((struct list_node*)q)->name);
}

void sort_by_name(struct list_node *node){

const int length = count_list(node);
struct list_node *arr[length];
int i=0;
while (node)
{
    arr[i]=node;
    node = node->next;
    i++;
}

printf("Before sort:\n");
for (i = 0; i < length; i++) {
    printf("Id = %d, Name = %s\n",
           arr[i]->id, arr[i]->name);
}

qsort(arr, length, sizeof(struct list_node), comparator);

printf("After sort:\n");
for (i = 0; i < length; i++) {
    printf("Id = %d, Name = %s\n",
           arr[i]->id, arr[i]->name);
}

}

Результат:

 Before sort:
 Id = 11, Name = adam
 Id = 20, Name = mati
 Id = 25, Name = zenek
 Id = 28, Name = mat

Process finished with exit code -1073741819 (0xC0000005).

Я использую функцию в главном меню - пользователь должен решить, распечатать или не отсортировать список

1 Ответ

0 голосов
/ 27 мая 2019

Ваша проблема:

qsort(arr, length, sizeof(struct list_node), comparator);

Вы говорите qsort, что в массиве есть узлы списка, но в массиве есть только указатели для списка узлов, поэтому:

qsort(arr, length, sizeof(struct list_node *), comparator);
...