Сортировка элементов массива структуры

Учитывая массив структуры (в C), я пытаюсь распечатать результаты в группах полов и в подзадаче по порядку. Например:

struct employee{
char gender[13]
char name[13];
int id;
};

Скажем, я определяю массив структуры следующим образом:

struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

Как я могу напечатать результаты, например

1234 Matt
1235 Josh


2345 Jessica

Ответ 1

Вам нужно будет реализовать функцию сортировки, которая сравнивает структуры, которые вам нужны

int compare(const void *s1, const void *s2)
{
  struct employee *e1 = (struct employee *)s1;
  struct employee *e2 = (struct employee *)s2;
  int gendercompare = strcmp(e1->gender, e2->gender);
  if (gendercompare == 0)  /* same gender so sort by id */
    return e1->id - e2->id;
  else
    return -gendercompare;  /* the minus puts "male" first as in the question */
}

И затем используйте qsort из стандартной библиотеки.

qsort(data, count, sizeof(struct employee), compare);

Внутри функции сравнения вы можете проверить, что идентификатор равен, то вы можете сортировать по имени (также используя strcmp()), как вам нравится.

Кен

Изменить: просто скомпилировал и исправил это. Вот небольшая тестовая программа

    #include <stdio.h>
    #include <stdlib.h>

    struct employee{
      char gender[13];
      char name[13];
      int id;
    };

    int compare(const void *s1, const void *s2)
    {
      struct employee *e1 = (struct employee *)s1;
      struct employee *e2 = (struct employee *)s2;
      int gendercompare = strcmp(e1->gender, e2->gender);
      if (gendercompare == 0)  /* same gender so sort by id */
        return e1->id - e2->id;
      else
        return -gendercompare;
    }

    main()
    {
      int i;
      struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);

      qsort(info, 3, sizeof(struct employee), compare);

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
    }

С выходом:

$ ./a.exe
1234    male    Matt
2345    female  Jessica
1235    male    Josh
1234    male    Matt
1235    male    Josh
2345    female  Jessica

Ответ 2

Используйте свой любимый алгоритм сортировки в массиве struct. Сравнивая два элемента массива, чтобы определить, что является "большим", сравните их полы; если гендерные группы совпадают, сравните их числа. (Вы можете определить отдельную функцию для этого сравнения, чтобы сделать все более понятным.) Затем распечатайте отсортированный массив в порядке, используя желаемое форматирование. Следите за тем, когда пол переключается с мужчины на самку, поэтому вы можете добавить еще три строки новой строки, как в вашем примере.

Изменить: за бесстыдно заимствовать у kallikak, вы можете просто передать свою функцию сравнения в qsort, но пусть она вернет 1, если одна структура "больше", -1, если она "меньше" и (если необходимо) 0, если она (с использованием процедуры, описанной выше). Взгляните на Как написать функцию сравнения для qsort из stdlib? для помощи при написании пользовательской функции сравнения.

Ответ 3

Подумайте, что это легче понять, поскольку я слабый в указателе, надеюсь, что это поможет............

#include<bits/stdc++.h>

using namespace std;


struct employee{
  char gender[13];
  char name[13];
  int id;
};

bool compare(employee s1,employee s2)
{
  return s1.id<s2.id;
}

main()
{
  int i;
  struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};
  sort(info,info+3,compare);
  for (i = 0; i < 3; i++)
  printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name);
}