Advertisement
SoKnight

lw65 - original

Jan 24th, 2023
1,089
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #include "pt4.h"
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. struct TList {
  6.     PNode Current;
  7. };
  8.  
  9. typedef TList* PList;
  10.  
  11. PNode GetCurrent(PList list);
  12.  
  13. void SetCurrent(PList list, PNode current);
  14.  
  15. PNode MoveToFirst(PList list);
  16.  
  17. PNode MoveToLast(PList list);
  18.  
  19. bool IsStandalone(PNode current);
  20.  
  21. void DeleteCurrent(PList list);
  22.  
  23. void Solve()
  24. {
  25.     Task("ListWork65");
  26.  
  27.     PNode first;
  28.     pt >> first;
  29.  
  30.     string fileName;
  31.     pt >> fileName;
  32.  
  33.     ofstream file(fileName);
  34.  
  35.     PList list = new TList;
  36.     SetCurrent(list, first);
  37.  
  38.     PNode current;
  39.     bool goToLast = true;
  40.  
  41.     while (GetCurrent(list) != NULL) {
  42.         current = goToLast ? MoveToLast(list) : MoveToFirst(list);
  43.  
  44.         file << current->Data;
  45.         if (!IsStandalone(current))
  46.             file << ' ';
  47.  
  48.         DeleteCurrent(list);
  49.         goToLast = !goToLast;
  50.     }
  51.  
  52.     file.close();
  53. }
  54.  
  55. PNode GetCurrent(PList list) {
  56.     return list->Current;
  57. }
  58.  
  59. void SetCurrent(PList list, PNode current) {
  60.     list->Current = current;
  61. }
  62.  
  63. PNode MoveToFirst(PList list) {
  64.     PNode current = GetCurrent(list);
  65.     while (current->Prev != NULL)
  66.         current = current->Prev;
  67.  
  68.     SetCurrent(list, current);
  69.     return current;
  70. }
  71.  
  72. PNode MoveToLast(PList list) {
  73.     PNode current = GetCurrent(list);
  74.     while (current->Next != NULL)
  75.         current = current->Next;
  76.  
  77.     SetCurrent(list, current);
  78.     return current;
  79. }
  80.  
  81. bool IsStandalone(PNode current) {
  82.     return current->Next == NULL && current->Prev == NULL;
  83. }
  84.  
  85. void DeleteCurrent(PList list) {
  86.     PNode current = list->Current;
  87.     if (current == NULL)
  88.         return;
  89.  
  90.     PNode prev = current->Prev;
  91.     PNode next = current->Next;
  92.  
  93.     if (prev != NULL)
  94.         prev->Next = next;
  95.  
  96.     if (next != NULL)
  97.         next->Prev = prev;
  98.  
  99.     delete current;
  100.  
  101.     SetCurrent(list, prev != NULL ? prev : next);
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement