Сортировка и фильтрация по полю структуры в Си
Есть следующие структуры:
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 шт):
создаёте функции сравнения 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 ; }