Сортировка односвязного списка - C (СИ) (78410)

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

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

Всем доброго времени суток! Пишу курсавик по программированию, всё написал, осталась только одна функция уже голову всю сломал, никак не придумаю как же её реализовать , может вы чем сможите мне помочь, буду очень благодарен! Нужно всего лишь отсортировать односвязный список:
Листинг программы
  1. struct account
  2. {
  3. int visual;
  4. int number;
  5. char name[9];
  6. char surname[12];
  7. char nickname[9];
  8. char hometown[11];
  9. char residence[12];
  10. int birthday;
  11. int month;
  12. int year;
  13. char phone[12];
  14. struct account *nextPtr;
  15. }
Правда необходимо выполнить две сортировки: 1) По фамилии и имени(можно просто по фамилии) в алфавитном порядке. 2) По дате рождения. Записей около 45...

Решение задачи: «Сортировка односвязного списка»

textual
Листинг программы
  1. void swap(struct account** plist, int pos_a, int pos_b) {
  2.  
  3.         int  tmp;
  4.         struct account* first = *plist;
  5.         struct account* last  = *plist;
  6.  
  7.         while( pos_a-- )
  8.             first = first->nextPtr;
  9.  
  10.         if(first == NULL)
  11.             return;
  12.  
  13.         while( pos_b-- )
  14.             last  = last->nextPtr;
  15.  
  16.         if(last == NULL)
  17.             return;
  18.  
  19.         tmp           = first->visual;
  20.         first->visual = last->visual;
  21.         last->visual  = tmp;
  22.  
  23.         // здесь перестановку делай также как в сортировке
  24.         // для каждого элемента структуры
  25.         // дело в том что указатель это адрес а память физически выделяется для того чтобы
  26.         // сменить данные под этот указатель нужно данные переместить в тот указатель с копировать
  27.         // без манипуляции стека не обойтись
  28.  
  29.  }
  30.  
  31.  int  length(const struct account* plist) {
  32.       int len = 0;
  33.       for(; plist != NULL ;len++, plist = plist->nextPtr);
  34.       return len;
  35.  }
  36.  
  37.  
  38. void  main(void) {
  39.  
  40.      size = length(list);  // получить размер списка
  41.      // обменять последнее значение с серединным
  42.      swap(&list, size - 1, size >> 1);
  43.  
  44. }

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

  1. void swap(struct account** plist, int pos_a, int pos_b) - функция для обмена элементов в односвязном списке.
  2. int length(const struct account* plist) - функция для определения длины списка.
  3. void main(void) - точка входа в программу. Вычисляется размер списка, и выполняется обмен элементов в списке.

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


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

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

12   голосов , оценка 4.167 из 5

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

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

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