Сортировка телефонного списка по алфавиту с использованием структур - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct person_t {
  5. char * name;
  6. int phone;
  7. } person_t;
  8. int namecmp(const void* a, const void* b);
  9. int phonecmp(const void* a, const void* b);
  10. int main(void)
  11. {
  12. char name[1000];
  13. person_t *base;
  14. int n, i, phone;
  15. scanf("%d", &n);
  16. base = malloc(n * sizeof(person_t));
  17. /* Считываем телефонную базу */
  18. for(i = 0 ; i < n ; i++)
  19. {
  20. scanf("%s%d", name, &phone);
  21. /* Выделяем память под массив base[i].name,
  22. учитывая символ конца строки */
  23. base[i].name = malloc((strlen(name)+1) * sizeof(char));
  24. strcpy(base[i].name, name);
  25. base[i].phone = phone;
  26. }
  27. qsort(base, n, sizeof(person_t), namecmp);
  28. /* Напечатаем в алфавитном порядке */
  29. for(i = 0 ; i < n ; i++)
  30. {
  31. printf("%20s %d\n", base[i].name, base[i].phone);
  32. }
  33.  
  34. qsort(base, n, sizeof(person_t), phonecmp);
  35. /* Напечатаем в порядке возрастания номеров*/
  36. for(i = 0 ; i < n ; i++)
  37. {
  38. printf("%20s %d\n", base[i].name, base[i].phone);
  39. }
  40. /* Освобождаем выделенную память */
  41.  
  42. for(i = 0 ; i < n ; i++)
  43. {
  44. free(base[i].name);
  45. }
  46. free(base);
  47. return 0;
  48. }
  49. int namecmp(const void* a, const void* b)
  50. {
  51. person_t *pa = a;
  52. person_t *pb = b;
  53. return strcmp(pa->name, pb->name);
  54. }
  55. int phonecmp(const void* a, const void* b)
  56. {
  57. person_t *pa = a;
  58. person_t *pb = b;
  59. return pa->phone - pb->phone;
  60. }
В начале проблемы с выделением динамической памяти для base В чем ошибка?
Да, программа сортировки телефонного списка по алфавиту с использованием структур

Решение задачи: «Сортировка телефонного списка по алфавиту с использованием структур»

textual
Листинг программы
  1. #include <stdio.h>
  2.  #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  typedef struct person_t {
  6.     char * name;
  7.     int phone;
  8.  } person_t;
  9.  
  10.  int namecmp(const void* a, const void* b);
  11.  int phonecmp(const void* a, const void* b);
  12.  
  13.  int main(void)
  14.  {
  15.     char name[1000];
  16.     person_t *base;
  17.     int n, i, phone;
  18.     scanf("%d", &n);
  19.     base = malloc(n * sizeof(person_t));
  20.  
  21.     /* Считываем телефонную базу */
  22.     for(i = 0 ; i < n ; i++)
  23.     {
  24.         scanf("%s%d", name, &phone);
  25.         /* Выделяем память под массив base[i].name,
  26.                       учитывая символ конца строки */
  27.         base[i].name = malloc((strlen(name)+1) * sizeof(char));
  28.         strcpy(base[i].name, name);
  29.         base[i].phone = phone;
  30.     }
  31.  
  32.     qsort(base, n, sizeof(person_t), namecmp);
  33.     /* Напечатаем в алфавитном порядке */
  34.     for(i = 0 ; i < n ; i++)
  35.     {
  36.         printf("%20s %d\n", base[i].name, base[i].phone);
  37.     }
  38.  
  39.  
  40.     qsort(base, n, sizeof(person_t), phonecmp);
  41.     /* Напечатаем в порядке возрастания номеров*/
  42.     for(i = 0 ; i < n ; i++)
  43.     {
  44.         printf("%20s %d\n", base[i].name, base[i].phone);
  45.     }
  46.  
  47.     /* Освобождаем выделенную память */
  48.  
  49.  
  50.     for(i = 0 ; i < n ; i++)
  51.     {
  52.         free(base[i].name);
  53.     }
  54.     // free(base);
  55.  
  56.     return 0;
  57.  
  58.  }
  59.  
  60.  int namecmp(const void* a, const void* b)
  61.  {
  62.      person_t *pa = (person_t*)a;
  63.      person_t *pb = (person_t*)b;
  64.      return strcmp(pa->name, pb->name);
  65.  }
  66.  int phonecmp(const void* a, const void* b)
  67.  {
  68.      person_t *pa = (person_t*)a;
  69.      person_t *pb = (person_t*)b;
  70.      return pa->phone - pb->phone;
  71.  }

Объяснение кода листинга программы

В этом коде используется язык программирования C для сортировки телефонного списка по алфавиту и номеру телефона. Список переменных и их значения:

  1. n - переменная для хранения количества элементов в списке телефонных номеров.
  2. i, j - индексы для прохода по списку.
  3. name - массив для хранения имени.
  4. phone - переменная для хранения номера телефона.
  5. base - динамический массив для хранения структуры person_t.
  6. person_t - структура для хранения имени и номера телефона.
  7. namecmp, phonecmp - функции сравнения для сортировки по имени и номеру телефона соответственно. Код выполняет следующие действия:
  8. Запрашивает у пользователя количество элементов в списке.
  9. Выделяет память под список структур person_t.
  10. Считывает данные о имени и номере телефона для каждого элемента списка.
  11. Сортирует список по имени с помощью функции qsort и функции сравнения namecmp.
  12. Выводит отсортированный список на экран.
  13. Сортирует список по номеру телефона с помощью функции qsort и функции сравнения phonecmp.
  14. Выводит отсортированный список на экран.
  15. Освобождает выделенную память. Пользователь может добавить, изменить или удалить элементы списка, используя функции malloc и free для динамического выделения памяти.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы