Advertisement
tttttt32

Untitled

Oct 8th, 2020
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.36 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5. struct list {
  6. char data;
  7. struct list *next, *prev;
  8. };
  9.  
  10. //функции работы с двунаправленным списком
  11. struct list *add(struct list *, char);//добавление нового элемента в начало списка
  12.  
  13. void print(struct list *);//вывод списка на экран
  14.  
  15. void swap(struct list *, struct list *);//мееняет местами два элемента списка
  16.  
  17. int main() {
  18. struct list *l = 0;
  19. //ввод начальных данных
  20. char data = 0;
  21. printf("%s", "Enter the sequence of balls [\'R\'ed/\'B\'lue/\'W\'hite]\nFor example: RWBBWRWB\n");
  22. while (data != '\n') {
  23. scanf("%c", &data);
  24. if ((data == 'R') || (data == 'B') || (data == 'W'))
  25. l = add(l, data);
  26. else if (data != '\n') //если введен символ, отличный от 'R', 'B' или 'W'
  27. printf("%s %c %s", "\n>Error: Invalid character [", data, "] will be ignored");
  28. }
  29. //вывод получившегося списка
  30. printf("%s", "\nList: ");
  31. print(l);
  32. //перестановка шаров
  33. int transpos = 0; //счетчик перестановок
  34. struct list *curr_el = l; //указатель на текущий элемент;
  35. struct list *first_2sw = l; //указатель на первый элемент с которым можно поменять текущий, при
  36. //необходимости
  37. struct list *temp;
  38. //сначала проходим список слева направо, переставляя в начало красные шары
  39.  
  40.  
  41.  
  42. while (curr_el) {
  43. if ((curr_el->data) == 'R')//если текущий красный
  44. {
  45. //если указатель на первый не красный ссылается на тот же элемент что и текущий
  46. if (curr_el == first_2sw) {
  47. //сдвигаем указатель на первый не красный шар вправо
  48. if (first_2sw->next)
  49. first_2sw = first_2sw->next;
  50. else break;
  51. } else {
  52. swap(curr_el, first_2sw);
  53. //если поменяли указатель на начало списка -- вернем на место ЧТОБЫ ЭТО ХЕРНЯ НЕ НАЧИНАЛА РАБОТАТЬ СНОВА С ТОГО ЧЛЕНА
  54. if (curr_el == l)
  55. l = first_2sw;
  56. else if (first_2sw == l)
  57. l = curr_el;
  58. temp = first_2sw;
  59. first_2sw = curr_el;
  60. curr_el = temp;
  61. first_2sw = first_2sw->next;
  62. transpos++;
  63. printf("%s %d %s", "\nList after", transpos, "transpositions:\t");
  64. print(l);
  65. }
  66. }
  67. curr_el = curr_el->next;
  68. }
  69.  
  70.  
  71.  
  72.  
  73. //теперь пройдем список справа налево, переставляя в конец синие шары
  74. curr_el = l;
  75. if (curr_el)
  76. while (curr_el->next) //найдем последний элемент
  77. curr_el = curr_el->next;
  78. first_2sw = curr_el;
  79. while ((curr_el)) {
  80. if ((curr_el->data) == 'B')//если текущий синий
  81. {
  82. //если указатель на первый не синий ссылается на тот же элемент что и текущий
  83. if (curr_el == first_2sw) {
  84. //сдвигаем указатель на первый не синий шар влево
  85. first_2sw = first_2sw->prev;
  86. } else {
  87. swap(curr_el, first_2sw);
  88. //если поменяли указатель на начало списка -- вернем на место
  89. if (curr_el == l)
  90. l = first_2sw;
  91. else if (first_2sw == l)
  92. l = curr_el;
  93. temp = first_2sw;
  94. first_2sw = curr_el;
  95. curr_el = temp;
  96. first_2sw = first_2sw->prev;
  97. transpos++;
  98. printf("%s %d %s", "\nList after", transpos, "transpositions:\t");
  99. print(l);
  100. }
  101. }
  102. curr_el = curr_el->prev;
  103. }
  104. printf("%s", "\nTo exit press Enter...");
  105. scanf("%c", &data);
  106. return 0;
  107. }
  108.  
  109. struct list *add(struct list *first, char data) {
  110. struct list *new_el, *last = first;
  111. new_el = (struct list *) malloc(sizeof(struct list)); //выделяем память под новый элемент
  112. new_el->data = data;//присваиваем значение новому элементу списка
  113. //если передан непустой указатель -- ищем последний элемент в списке
  114. if (first) {
  115. //ищем последний элемент
  116. while ((last->next))
  117. last = last->next;
  118. //вставляем новый элемент после последнего
  119. last->next = new_el;
  120. new_el->prev = last;
  121. } else {
  122. first = new_el;
  123. new_el->prev = 0;
  124. }
  125. new_el->next = 0;
  126. return first;//возвращаем указатель на начало списка
  127. }
  128.  
  129. void print(struct list *l) {
  130. struct list *ll = l;
  131. while (ll) {
  132. printf("%c", ll->data);
  133. ll = ll->next;
  134. }
  135. }
  136.  
  137. void swap(struct list *a, struct list *b) {
  138. struct list *temp;
  139. if (b->prev == a) {
  140. if (a->prev)
  141. a->prev->next = b;
  142. if (b->next)
  143. b->next->prev = a;
  144. b->prev = a->prev;
  145. a->prev = b;
  146. a->next = b->next;
  147. b->next = a;
  148. } else if (a->prev == b) {
  149. if (b->prev)
  150. b->prev->next = a;
  151. if (a->next)
  152. a->next->prev = b;
  153. a->prev = b->prev;
  154. b->prev = a;
  155. b->next = a->next;
  156. a->next = b;
  157. } else {
  158. if (b->prev)
  159. b->prev->next = a;
  160. if (b->next)
  161. b->next->prev = a;
  162. if (a->prev)
  163. a->prev->next = b;
  164. if (a->next)
  165. a->next->prev = b;
  166. temp = b->prev;
  167. b->prev = a->prev;
  168. a->prev = temp;
  169. temp = b->next;
  170. b->next = a->next;
  171. a->next = temp;
  172. }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement