Сортировка и фильтрация по полю структуры в Си

Есть следующие структуры:

typedef struct car
{
    char* model;
    char* manufacturer;
    int price;
    float consumption;
    char* modification;
} car_t;

typedef struct CarList
{
    int NumberOfCars;
    car_t* c_array;
} CarList_t;

я создаю экземпляр CarList и заполняю c_array экземплярами car_t. Как можно отсортировать элементы в c_array по любому полю car_t (поле выбирает пользователь)?


Ответы (1 шт):

Автор решения: AlexGlebe

создаёте функции сравнения int CarCompModel(void const*,void const*) , int CarCompManufact(void const*,void const*), .. возвращающие < 0 или == 0 или > 0. И потом уже вызываете qsort с аргументом нужной функции

примерно так :

int CarCompPrice ( void const * a , void const * b ) {
  car_t const * ca = a ;
  car_t const * cb = b ;
  return ca -> price - cb -> price ; }

# include <stdlib.h> // qsort

...

CarList_t array ;
qsort ( array . c_array , array . NumberOfCars ,
  sizeof ( car_t ) , & CarCompPrice ) ;

Так как функция сравнения должна возвращать целое число, просто вычитание дробных чисел не подойдёт. Так как разница 0.3 например будет преобразована на целочисленный тип int. И она станет нулю, то-есть типа числа равны, а это неправильно. Тогда это сравнение нужно делать вручную и возвращать -1 , 0 или +1

int CarCompConsumption ( void const * a , void const * b ) {
  car_t const * ca = a ;
  car_t const * cb = b ;
  if ( a -> consumption == b -> consumption )
    return 0 ;
  if ( a -> consumption < b -> consumption )
    return -1 ;
  return 1 ; }
→ Ссылка