Сортировка массива структур по одному полю - C (СИ)
Формулировка задачи:
как сортировку по выбранному полю реализовать на си, покажите на каком -нибудь примере? пжлста)
Решение задачи: «Сортировка массива структур по одному полю»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PERSON {
char * name;
int height;
double weight;
}person_t;
int name_cmp(const void * a, const void *b){
return strcmp(((person_t*)a)->name, ((person_t*)b)->name);
}
int height_cmp(const void * a, const void *b){
return ((person_t*)a)->height - ((person_t*)b)->height;
}
int weight_cmp(const void * a, const void *b){
double d = ((person_t*)a)->weight - ((person_t*)b)->weight;
return ( d < 0.0 ) ? -1 : ( d > 0.0 ) ? 1 : 0;
}
#define NUM_PERSONS 3
int main(void){
person_t persons[NUM_PERSONS] = {
{ .name = "Sidorov", .height = 173, .weight = 80.2 },
{ .name = "Petrov", .height = 182, .weight = 75.5 },
{ .name = "Ivanov", .height = 180, .weight = 99.9 }
};
int i;
printf("\nUnsorted:\n");
for ( i = 0; i < NUM_PERSONS; ++i )
printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
qsort(persons, NUM_PERSONS, sizeof(person_t), name_cmp);
printf("\nSorted by name:\n");
for ( i = 0; i < NUM_PERSONS; ++i )
printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
qsort(persons, NUM_PERSONS, sizeof(person_t), height_cmp);
printf("\nSorted by height:\n");
for ( i = 0; i < NUM_PERSONS; ++i )
printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
qsort(persons, NUM_PERSONS, sizeof(person_t), weight_cmp);
printf("\nSorted by weight:\n");
for ( i = 0; i < NUM_PERSONS; ++i )
printf("%s\t%d\t%.1f\n", persons[i].name, persons[i].height, persons[i].weight);
exit(0);
}
Объяснение кода листинга программы
В данном коде:
- Создается структура
person_t, которая содержит поляname,heightиweight. - Определяются функции сравнения
name_cmp,height_cmpиweight_cmp, которые сравнивают поля структурыperson_tдля сортировки массива. - Объявляется массив
personsтипаperson_tс тремя элементами, инициализированными значениями полейname,heightиweight. - Выводится список несортированных данных.
- Массив
personsсортируется по полюnameс помощью функцииqsortи выводится отсортированный список. - Массив
personsсортируется по полюheightс помощью функцииqsortи выводится отсортированный список. - Массив
personsсортируется по полюweightс помощью функцииqsortи выводится отсортированный список. - Программа завершается с помощью функции
exit.