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

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

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

Доброго времени! =) имеется структура, ссылающаяся на саму себя и определения собственных типов данных:
Листинг программы
  1. struct iDiscipline{
  2. char name[10];//имя
  3. int num_course;//№ курса
  4. int num_term;//№ семестра
  5. int am_lec;//кол-во часов лекций
  6. int am_pr;//практик
  7. int am_lab;//лабы
  8. int am_one;//сам.раб
  9. int am_ALL;//всего часов
  10. struct iDiscipline *next; //указатель на следующий элемент списка
  11. };
  12. typedef struct iDiscipline LIST;
  13. typedef LIST *LISTDIS;
со вставкой, удалением, выводом, сохраниением/загрузкой в/из файла в связанном списке разобрался.

НО НИКАК НЕПОЛУЧАЕТСЯ ОСУЩЕСТВИТЬ СОРТИРОВКУ.

вот мой код:
Листинг программы
  1. int sort(LISTDIS *headDIS)
  2. {
  3. if (*headDIS == NULL)
  4. return 0;//в списке пусто
  5. else {
  6. LISTDIS currentDIS, nextDIS, prevDIS, buffer;
  7. currentDIS = *headDIS;
  8. prevDIS = NULL;
  9. if (currentDIS->next != NULL)//проверяем, не 1 ли в списке элемент
  10. nextDIS = currentDIS->next;
  11. else
  12. return -1;//в списке 1 элемент
  13. for (;currentDIS != NULL;currentDIS=currentDIS->next) {
  14. for (;nextDIS != NULL;nextDIS=nextDIS->next) {
  15. //по семестру
  16. if (currentDIS->num_term > nextDIS->num_term) {
  17. buffer = currentDIS;
  18. buffer->next = nextDIS->next;
  19. currentDIS = nextDIS;
  20. currentDIS->next = buffer;
  21. }
  22. }
  23. }
  24. }
  25. return 1;
  26. }
и на словах: если находится элемент, у которого номер семестра больше чем у след. эл-та, то необходимо его скопировать в буфер, затем на место этого элемента вставляем след. элемент, и модифицируем указатели у них - у элемента, который находится в буфере *next присваеваем *next того элемента, который был следующим, а *next у элемента который был следующий, присваеваем указатель на буфер. вот моя идея, но она не работает...=( помогите с алгоритмом, пожалуйста

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

textual
Листинг программы
  1. int sort(LISTDIS *headDIS)
  2. {
  3.     if (*headDIS == NULL)
  4.         return 0;//в списке пусто
  5.     else {
  6.         LIST headNode;
  7.  
  8.         headNode.next = 0;
  9.         for ( LISTDIS t = *headDIS, u, p; t; t = u )
  10.         {
  11.             u = t->next;
  12.             for ( p = &headNode; p->next && t->num_term > p->next->num_term; p = p->next );
  13.             t->next = p->next;
  14.             p->next = t;
  15.         }
  16.         *headDIS = headNode.next;
  17.     }
  18.     return 1;
  19. }

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

Объяснение порядка выполнения кода:

  1. Функция sort принимает указатель на голову связанного списка headDIS в качестве аргумента.
  2. Если список пуст, функция возвращает 0.
  3. В противном случае, инициализируется новый узел headNode с пустым значением next.
  4. Начинается цикл, который проходит по всем элементам списка, начиная с t.
  5. Для каждого элемента t ищется следующий элемент u и сохраняется в переменной u.
  6. Затем, для каждого элемента t, ищется предыдущий элемент p в отсортированной части списка.
  7. Если p равно NULL, это означает, что текущий элемент t является первым элементом в отсортированной части списка, поэтому он добавляется в конец отсортированной части списка.
  8. Если p не равно NULL, то t сравнивается с p->next. Если t->num_term больше, чем p->next->num_term, то t становится новым next для p.
  9. Если t больше, чем p->next, то t добавляется перед p->next в отсортированную часть списка.
  10. По завершении цикла, headDIS обновляется, чтобы указывать на первый элемент в отсортированной части списка.
  11. Функция возвращает 1, чтобы указать, что список был успешно отсортирован.

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


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

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

7   голосов , оценка 3.429 из 5

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

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

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