Использование qsort для сортировки структур (сортировка по полю фамилии)

Для начала у меня есть эта часть (я буду использовать ее для создания структур сотрудников):

    typedef struct 
    { 
       char first_name[20], last_name[20]; 
       int birthdate, temporary; 
       //date of birth YEAR/MONTH/DAY
       //temporary employees: 1, else 0

    }factory;

Я буду читать данные, используя следующую функцию:

    void reading(factory *employee,int *nr) 
    { 
      ++(*nr); 
      printf("First name:\n");
      fflush(stdin); 
      gets((employee+*nr)->first_name);

      printf("Last name:\n");
      fflush(stdin); 
      gets((employee+*nr)->last_name);

      printf("Birthdate:\n");
      fflush(stdin);
      scanf ("%d" , &((employee + *nr)->birthdate));

      printf("Temporary employee? 1 for YES, 0 for NO");
      fflush(stdin);
      scanf("%d", &((employee + *nr)->temporary));

    }

И функция сравнения (я не думаю, что она написана правильно, любые предложения о том, как ее изменить, были бы замечательными - должна ли она быть "сотрудником фабрики *ia" вместо структуры?):

int struct_cmp_by_name(const void *a, const void *b)
{
struct employee *ia = (struct employee *)a;
struct employee *ib = (struct employee *)b;
return strcmp(ia->last_name, ib->last_name);

}

У меня также есть простая функция отображения, прототип которой я скопирую ниже:

void display(factory *employee, int nr) 

Другие части кода были опущены для экономии места. Как бы я реализовал функцию qsort в этом случае? У меня есть функция сравнения, но я не знаю, каким должен быть базовый массив или как найти два других параметра размера. Предполагаемая благодарность за любую оказанную помощь.


person user112926    schedule 09.02.2014    source источник
comment
Просто примечание: вызов fflush(stdin) — это поведение undefined. Возможно, вы захотите найти другой способ сделать это. Кроме того, выбросьте gets() и используйте вместо него fgets(). И где фактический вызов qsort() ? Это может показаться несколько важным для решения вашей проблемы. Предполагая, что ваш sort-bed является действительным массивом factory, ваш компаратор выглядит правильно (за исключением очевидного неправильного отсутствия const для этих указателей).   -  person WhozCraig    schedule 10.02.2014
comment
использовать стандартную библиотеку qsort , ++(*nr); : ,(*nr) это начало -1?   -  person BLUEPIXY    schedule 10.02.2014


Ответы (1)


Так должно быть

фабрика *ia = (фабрика *)a;

или вы можете пропустить задания и просто разыграть

... ((фабрика *)a)->last_name ...

Я предполагаю, что где-то в вашем коде вы выделяете или объявляете пространство для массива factory?

Для быстрой сортировки вы можете либо поменять местами структуры, либо создать массив указателей на структуры и поменять местами указатели.

person rcgldr    schedule 09.02.2014