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

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

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

Есть структура:
Листинг программы
  1. struct stud{
  2. char num[20];
  3. char tel[15];
  4. char name[20];
  5. int byear;
  6. int bday;
  7. int bmonth;
  8. int year;
  9. int yrs;
  10. int del;
  11. struct stud *next;
  12. struct stud *prev;
  13. };
Есть нормально забитый двусвязный список. Надо отсортировать его по году рождения (byear). Где я неправ, что получается какой-то бред на выходе?
Листинг программы
  1. for (i = 0; i < amount; i++)
  2. while (ptr2->next != NULL)
  3. {
  4. if (ptr1->byear > ptr2->byear)
  5. {
  6. ptr2->prev = ptr1->prev;
  7. ptr1->prev = ptr2;
  8. ptr1->next = ptr2->next;
  9. ptr2->next = ptr1;
  10. if (ptr1->next != NULL)
  11. ptr1->next->prev = ptr1;
  12. if (ptr2->prev != NULL)
  13. ptr2->prev->next = ptr2;
  14. }
  15. ptr2 = ptr2->next->next;
  16. ptr2 = ptr2->next;
  17. ptr1 = ptr1->next;
  18. }
amount - переменная, обозначающая количество элементов. ptr1 - элемент 1, 2, 3..., ptr2 - элемент 2, 3, 4... соответственно. Заранее спасибо за помощь.

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct ELEM_
  5. {
  6.     struct ELEM_ *next;
  7.     int value;
  8. }ELEM;
  9.  
  10. typedef struct
  11. {
  12.     ELEM *cur, *head;
  13. }LIST;
  14.  
  15. typedef int (*Pfun)( const void *, const void *);
  16.  
  17. int cmp( const void *a, const void *b )
  18. {
  19.    
  20.     return *( (int * )a ) - *( ( int * )b );
  21. }
  22.  
  23.  void Exchange( LIST *list )
  24.  {
  25.     ELEM *prev = list->head, *temp;
  26.  
  27.     if( list->cur != list->head )
  28.  
  29.          while( prev->next != list->cur )
  30.                         prev = prev->next;
  31.  
  32.  
  33.     temp = list->cur->next;
  34.     list->cur->next = temp->next;
  35.  
  36.         temp->next = list->cur;
  37.     if( list->cur == list->head )
  38.         list->head = temp;
  39.     else
  40.         prev->next = temp;
  41.  
  42.  
  43.  }
  44. void BubbleSortList( LIST *list, Pfun fun )
  45. {
  46.     int flag = 1;
  47.     if( !list->head )
  48.             return;
  49.     while ( flag )
  50.         {
  51.            flag = 0;
  52.            list->cur = list->head;
  53.            while( list->cur->next )
  54.                if( fun( &list->cur->value, &list->cur->next->value) > 0)
  55.                 {
  56.  
  57.  
  58.                     Exchange( list );
  59.                     flag = 1;
  60.  
  61.                 }
  62.                 else
  63.                     list->cur = list->cur->next;
  64.  
  65.            }
  66.  
  67.  
  68. list->cur = list->head;
  69. }
  70. int Push( LIST *list, int value )
  71.     {
  72.         ELEM *temp = (ELEM*)malloc( sizeof(ELEM) );
  73.         if( !temp ) return 1;
  74.         temp->value = value;
  75.         if( !list->head )
  76.  
  77.             list->head = temp;
  78.  
  79.         else
  80.         {
  81.             list->cur = list->head;
  82.             while( list->cur->next )
  83.                     list->cur = list->cur->next;
  84.  
  85.             list->cur->next = temp;
  86.         }
  87.  
  88.         temp->next = NULL;
  89.         return 0;
  90.     }
  91. int Pop( LIST *list )
  92. {
  93.     list->cur = list->head;
  94.     list->head = list->cur->next;
  95.     int value = list->cur->value;
  96.     free( list->cur );
  97.     return value;
  98. }
  99. int main()
  100. {
  101.  
  102.     LIST head;
  103.     head.cur = head.head = NULL;
  104.  
  105.     int mass[] = { 5, -1, 4, 7, 2 , 2,-12,423,12,43, 0,3,1,45,-12,-123
  106.     };
  107.     for( int i = 0; i < sizeof(mass)/sizeof(mass[0] ); i++ )
  108.         Push( &head, mass[i] );
  109.     BubbleSortList( &head, cmp );
  110.     for( int i = 0; i < sizeof(mass)/sizeof(mass[0] ); i++ )
  111.             printf( "%d ", Pop( &head) );
  112.     return 0;
  113. }

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

В данном коде реализуется сортировка двусвязного списка пузырьком. Список представляет собой связный список, состоящий из элементов типа ELEM. Каждый элемент списка содержит указатель на следующий элемент (next) и значение (value). Сортировка осуществляется с помощью функции BubbleSortList, которая принимает указатель на список и функцию сравнения. В данном случае используется функция cmp, которая сравнивает значения двух элементов и возвращает результат сравнения. В функции BubbleSortList используется цикл while, который продолжается до тех пор, пока в списке остаются элементы. На каждой итерации цикла выполняется проверка: если текущий элемент больше следующего, то они меняются местами с помощью функции Exchange. Флаг flag используется для контроля за каждой итерацией цикла. Если на какой-то итерации обмен не произошел, то это означает, что список уже отсортирован. Функция Push добавляет новый элемент в список. Если список пуст, то новый элемент становится головой списка. В противном случае новый элемент добавляется в конец списка. Функция Pop удаляет и возвращает последний элемент списка. После удаления элемента, указатель cur перемещается к предыдущему элементу списка. Если удаленный элемент был последним, то cur становится NULL. В функции main создается экземпляр списка head. Затем в список добавляются элементы из массива mass с помощью функции Push. После этого вызывается функция BubbleSortList для сортировки списка. Наконец, элементы списка последовательно удаляются с помощью функции Pop и выводятся на экран с помощью функции printf.

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


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

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

11   голосов , оценка 4.455 из 5

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

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

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