Язык Си в примерах/Сортировка на основе qsort

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX

Пример использования функции qsort из stdlib[править]

Вход: В первой строчке дано N, а затем следует N строчек вида ИМЯ ТЕЛЕФОН

Выход: Выведите телефонный справочник в алфавитном порядке и в порядке возрастания телефонных номеров.

 #include <stdio.h>
 #include <stdlib.h>
  
 typedef struct person_t {
    char * name;
    int phone;
 } person_t;
  
 int namecmp(const void* a, const void* b);
 int phonecmp(const void* a, const void* b);
  
 int main(void)
 {
    char name[1000];
    person_t *base;
    int n, i, phone;
    scanf("%d", &n);
    base = malloc(n * sizeof(person_t));
 
    /* Считываем телефонную базу */
    for(i = 0 ; i < n ; i++)
    {
        scanf("%s%d", name, &phone);
        /* Выделяем память под массив base[i].name,
                      учитывая символ конца строки */
        base[i].name = malloc((strlen(name)+1) * sizeof(char));
        strcpy(base[i].name, name);
        base[i].phone = phone;
    }
 
    qsort(base, n, sizeof(person_t), namecmp);
    /* Напечатаем в алфавитном порядке */
    for(i = 0 ; i < n ; i++)
    {
        printf("%20s %d\n", base[i].name, base[i].phone);
    }
    
 
    qsort(base, n, sizeof(person_t), phonecmp);
    /* Напечатаем в порядке возрастания номеров*/
    for(i = 0 ; i < n ; i++)
    {
        printf("%20s %d\n", base[i].name, base[i].phone);
    }
 
    /* Освобождаем выделенную память */
 
 
    for(i = 0 ; i < n ; i++)
    {
        free(base[i].name);
    }
    free(base);
 
    return 0;
 
 }
 
 int namecmp(const void* a, const void* b)
 {
     person_t *pa = a;
     person_t *pb = b;
     return strcmp(pa->name, pb->name);
 }
 int phonecmp(const void* a, const void* b)
 {
     person_t *pa = a;
     person_t *pb = b;
     return pa->phone - pb->phone;
 }