Advertisement
semenrbt

29/04

Mar 13th, 2021
759
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. struct point {
  6.  int x;
  7.  int y;
  8.  struct point *next;
  9. };
  10. void SortList(struct point **list)
  11. {
  12. if (*list) //Проверяем, если список не пуст, существует хотя бы один элемент, то выполняем
  13. //сортировку
  14. {//Сортировать мы будем методом вставки. Так как он очень удобен для реализации на списках.
  15. //Основная идея, сортировки заключается в том, мы будем строить новый список из существующих
  16. //элементов, следующим образом. Из текущего списка, каждый раз будем брать элемент (берем из
  17. //головы так, как это самая простая операция).
  18. //Разрываем связь между выбранным элементом, тем самым исключая его из текущего списка.
  19. //Обязательно, все поля, отвечающие за хранения адресов (это общий случай), с помощью
  20. //которых устанавливалась связь между элементами очищается. Теперь элемент становится
  21. //самостоятельным.
  22. //Этот элемент нужно добавить в новый список, не нарушая порядка в нем.
  23. //Далее, этот элемент вставляется в новый список. С этой целью нужно найти нужную позицию в
  24. //новом списке, и вставить этот элемент. Т.е.
  25. //В этой задаче, воспользуемся операцией - добавление элемента после заданного (только без
  26. //создания нового элемента).
  27. //Т.е. в новом упорядоченном списке, нужно будет найти позицию, после которой добавим
  28. //элемент, не нарушая порядка в нем.
  29. //Рассмотрим случаи, которые могут возникнуть.
  30. //1. Список может быть пустым - в этом случае инициализируем newList
  31. //2. Значение элемента меньше, чем значение в голове списка, следовательно, в этом случае добавляем
  32. //элемент в голову.
  33. //3. Общая ситуация, в которой ищем нужную позицию.
  34. //Запишем код.
  35. struct point *newList = NULL, *elem = NULL;
  36. // Берем первый элемент и добавляем его в пустой список
  37. elem = *list;//Устанавлиывем указатель на головной элемент списка.
  38. *list = (*list)->next;// Переходим на следующий элемент.
  39. elem->next = NULL; // Сообщаем элементу, что у него нет последующего. Другими словами, разрушили
  40. //связь, сделали его самостоятельным.
  41. // Добавляем в новый список. Так как эта операция выполняется только один раз, следовательно мы ее
  42. //выполняем вне цикла.
  43. newList = elem;
  44. //Организуем общий цикл, в котором будем брать очередной элемент из текущего списка
  45. //Андреева Валентина Валерьевна, ИПМКН, 2020
  46. // и добавлять этот элемент в новый список не нарушая порядка.
  47. while (*list)
  48. {
  49. elem = *list;//Устанавливем указатель на головной элемент списка.
  50. *list = (*list)->next;// Переходим на следующий элемент.
  51. elem->next = NULL;// Сообщаем элементу, что у него нет последующего.
  52. //Проверяем, может элемент нужно добавлять в голову нового списка.
  53. if (elem->x < newList->x)
  54. { //Добавляем элемент в голову.
  55. elem->next = newList;
  56. newList = elem;
  57. }
  58. else
  59. {
  60. struct point *ptrIx = newList;
  61. // В этом цикле указатель остановим на элементе, после которого добавим элемент
  62. //(Проверьте, все ли верно?)
  63. for (; ptrIx->next && ptrIx->next->x < elem->x; ptrIx = ptrIx->next);
  64. //Добавляем элемент
  65. elem->next = ptrIx->next;
  66. ptrIx->next = elem;
  67. }
  68. }
  69. *list = newList;
  70. }
  71. }
  72.  
  73.  
  74.    
  75.   void Sort( struct point **List )
  76. {
  77.     struct point *newList = NULL;
  78.     struct point *Con = *List;
  79.     while (Con)
  80.     {
  81.         struct point *elem = NULL;
  82.         elem=Con;
  83.         Con = Con->next;
  84.  
  85.         if ( newList == NULL || elem->x < newList->x )
  86.         {
  87.             elem->next = newList;
  88.             newList = elem;
  89.         }
  90.         else
  91.         {
  92.             struct point *PtrIx = newList;
  93.             while ( PtrIx->next != NULL && !( elem->x < PtrIx->next->x) )
  94.             {                  
  95.                   PtrIx = PtrIx->next;
  96.             }                
  97.  
  98.             elem->next = PtrIx->next;
  99.             PtrIx->next = elem;
  100.         }
  101.     }
  102. }  
  103.    
  104.    
  105.    
  106.    
  107.  
  108. struct point * addToHead(struct point **list, int x,int y)
  109. {
  110. struct point *PtrIx = (struct point*) malloc(sizeof(struct point));
  111. if (PtrIx)
  112. {
  113. PtrIx->x = x;
  114. PtrIx->y = y;
  115. PtrIx->next = NULL;
  116. if (*list == NULL)
  117. *list = PtrIx;
  118. else
  119. {
  120. PtrIx->next = *list;
  121. *list = PtrIx;
  122. }
  123. return PtrIx;
  124. }
  125. return NULL;
  126. }
  127.  
  128.  
  129.  
  130.  
  131. int main()
  132. {
  133.     struct point *head = NULL;// Переменная для хранения головы списка
  134.     struct point *ptrIx = NULL;//Объявили рабочую переменную
  135.     addToHead(&head, 4, 1);
  136.     addToHead(&head, 3, 5);
  137.     addToHead(&head, 1, 3);
  138.     addToHead(&head, 9, 4);
  139.     addToHead(&head, 7, 8);
  140.     addToHead(&head, 0, 6);
  141.     addToHead(&head, -1, 2);
  142.     //SortList(&head);
  143.     Sort(&head);
  144.     ptrIx = head;
  145.     while (ptrIx) {
  146.         printf("point(%d,%d)\n", ptrIx->x, ptrIx->y);
  147.         ptrIx = ptrIx->next;
  148.     }
  149. }
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement