Как отсортировать массив структур в C?

У меня есть массив из следующих структур

typedef struct _my_data_ { unsigned int id; double latitude; double longitude; unsigned int content_len; char* name_dyn; char* descr_dyn; } mydata; 

и хотел бы сортировать его по возрастанию по идентификатору . Я читал, что можно сортировать массивы с помощью функции qsort, но я не уверен, как правильно ее использовать при сортировке структур.

Любая помощь будет оценена по достоинству.

Вам нужна функция компаратора структуры, которая соответствует прототипу функции, ожидаемой qsort() , а именно:

 int md_comparator(const void *v1, const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; if (p1->id < p2->id) return -1; else if (p1->id > p2->id) return +1; else return 0; } 

Если вы когда-либо попадаете в более сложный критерий сортировки, это все равно хорошая основа, потому что вы можете добавить вторичные критерии, используя один и тот же скелет:

 int md_comparator(const void *v1, const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; if (p1->latitude < p2->latitude) return -1; else if (p1->latitude > p2->latitude) return +1; else if (p1->longitude < p2->longitude) return -1; else if (p1->longitude > p2->longitude) return +1; else return 0; } 

Понятно, что это повторяет столько критериев, сколько вам нужно. Если вам нужно вызвать функцию ( strcmp() ?) Для сравнения значений, вызовите ее один раз, но назначьте возврат к локальной переменной и используйте ее дважды:

 int md_comparator(const void *v1, const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; int rc; if (p1->latitude < p2->latitude) return -1; else if (p1->latitude > p2->latitude) return +1; else if (p1->longitude < p2->longitude) return -1; else if (p1->longitude > p2->longitude) return +1; else if ((rc = strcmp(p1->name_dyn, p2->name_dyn)) < 0) return -1; else if (rc > 0) return +1; else return 0; } 

Кроме того, этот шаблон работает, когда члены данных являются целыми без знака, и он избегает проблем с переполнением при сравнении целых чисел со знаком. Обратите внимание, что короткое сокращение, которое вы могли бы иногда видеть, а именно варианты:

 int md_comparator(const void *v1, const void *v2) /* BAD */ { /* BAD */ const mydata *p1 = (mydata *)v1; /* BAD */ const mydata *p2 = (mydata *)v2; /* BAD */ return(p1->id - p2->id); /* BAD */ } /* BAD */ 

плохой, если id без знака (разница двух целых без знака никогда не отрицательна) и подвержена переполнению, если целые числа подписаны и имеют большую величину и противоположные знаки.

  • Что означает void * и как его использовать?
  • C - инициализация указателей, позиция звездочки
  • Как установить условную точку останова в Xcode на основе свойства объекта?
  • C # Cast Весь массив?
  • Как массив хранится в памяти?
  • Целочисленное переполнение и неопределенное поведение
  • Где используется ключевое слово C auto?
  • Где найти реализации функций stdio.h?
  • Безопасно ли удалить указатель NULL?
  • Почему деление приводит к нулю вместо десятичного?
  • Функция, возвращающая адрес локальной переменной ошибки в C
  • Interesting Posts

    OSX: ssh: Не удалось разрешить имя хоста: nodename или servname предоставлено или неизвестно

    Как я могу получить нумерацию страниц Word для начала на третьей странице, чтобы она отображалась в TOC как страница 1

    Swift 4 Decodable с ключами, не известными до времени декодирования

    Android, перемещение растрового изображения по пути?

    Сохранять общий запрос в виде столбца?

    Прокладка и упаковка структуры

    Создание списка воспроизведения URL-адресов в VLC

    Альтернатива google finance api

    Сделать обратный прокси nginx 302 перенаправлять в подпапку URI вместо root

    Блокировать доступ к веб-сайту в определенные моменты времени, на уровне компьютера, без доступа к маршрутизатору

    Как проверить конфигурацию моей RAM (Windows 7)?

    Как использовать VPN-соединение в гостевой VMWare VM с хостом

    Как использовать nawk, как печатать все имена, содержащие четыре символа?

    API Карт Google V3: странные сбои отображения пользовательского интерфейса (со снимком экрана)

    Увеличьте скорость указателя мыши

    Давайте будем гением компьютера.