Advertisement
Sanlover

Untitled

Oct 6th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.12 KB | None | 0 0
  1. void
  2. myQueue::setNegativeAfterPositive()
  3. {
  4.  
  5. cell* start = _first; // Временный указатель на элемент, с которого каждый раз будет начинаться поиск первого положительного
  6.  
  7. while(true) // Бесконечный цикл из которого возможно выйти только break'om
  8. {
  9. cell* it = start; // После каждого прохода по очереди, наш it будет меняться, поэтому его нужно опять ставить на начальную позицию
  10. cell* firstNextPositive = nullptr; // Указатель на элемент, идущий перед первым положительным ( чтобы удалять положительный)
  11. bool isFound = false; // Флаг, позволяющий понять, нашёлся ли в очереди положительный элемент
  12.  
  13. while(it->next != nullptr) // Смотрим в следующий элемент (Если он существует, то ...)
  14. {
  15.  
  16. if(it->next->value > 0) // Смотрим в значение следующего (Если оно положительное,то ...)
  17. {
  18. isFound = true; // Отмечаем, что встретили положительный
  19. break; // Заканчиваем пробежку по очереди ( выходим из текущего WHILE)
  20. }
  21. it= it->next; // Переходим к следующему элементу
  22. }
  23. if(isFound) // После пробежки по очереди, если нашлось положительно, то ...
  24. {
  25. int value = it->next->value; // Сохраняем число следующего(положительного)
  26. cell* toDelete = it->next; // И указатель на сам положительный
  27.  
  28. it->next = it->next->next; // Переставляем указатель на следующий следующего ( Есть 3 4 6, нам нужно удалить 4, делаем так, чтобы 3 указывал на 6)
  29. delete toDelete; // Удаляем положительный
  30.  
  31. cell* newCell = new cell; // Создаём новую ячейку
  32. newCell->value = value; // Даём ей значение положительного
  33.  
  34. if(start->value <= 0) // Если у нас в начале очереди НЕ стоит положительный, то ...
  35. {
  36. newCell->next = _first; // Вставляем перед первым
  37. start = newCell; // Указаваем, что теперь начинаем с него
  38. _first = newCell; // Не забываем про указатель _first
  39. }
  40. else // Иначе (Если в начле всё-таки положительный)
  41. {
  42. newCell->next = start->next;// Нужно вставить между первым и вторым, поэтому наша ячейка указывает на "второй"
  43. start->next = newCell; // Следующий после первого теперь наша ячейка
  44. start = newCell; // Следующую пробежку начнём с этой ячейки(т.к. смысла проверять положительные нет)
  45. }
  46. }
  47. else // Если не нашёлся положительный ( нет положительных в очереди)
  48. {
  49. break; // Выходим из бесконечного цикла
  50. }
  51. }
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement