Advertisement
avr39ripe

PV913ListClass

Jul 14th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template <typename ElemT>
  4. class List
  5. {
  6.     class Node
  7.     {
  8.     public:
  9.         ElemT data;
  10.         Node* next;
  11.         Node* prev;
  12.         Node(const ElemT& dataP, Node* nextP = nullptr, Node* prevP = nullptr)
  13.             :data{ dataP }, next{ nextP }, prev{prevP} {};
  14.     };
  15.  
  16.     Node* head;
  17.     Node* tail;
  18.     size_t size;
  19.     Node* getNode(size_t idx);
  20. public:
  21.     List() : head{ nullptr }, tail{ nullptr }, size{ 0 } {}
  22.     ElemT& front() { return head->data; };
  23.     const ElemT& front()const { return head->data; };
  24.     ElemT& back() { return tail->data; };
  25.     const ElemT& back()const { return tail->data; };
  26.     const size_t getSize() const { return size; };
  27.     bool empty() const { return size == 0; };
  28.     void push_back(const ElemT& data);
  29.     void push_front(const ElemT& data);
  30.     bool pop_back();
  31.     bool pop_front();
  32.     void clear();
  33.     ElemT& operator[](size_t idx);
  34.     void insertAt(size_t idx, const ElemT& data);
  35.     void deleteAt(size_t idx);
  36.     ~List();
  37. };
  38.  
  39. template <typename ElemT>
  40. void List<ElemT>::push_back(const ElemT& data)
  41. {
  42.     Node* tmp{ tail };
  43.     tail = new Node{ data, nullptr, tail };
  44.     if (tmp)
  45.     {
  46.         tmp->next = tail;
  47.     }
  48.     ++size;
  49.  
  50.     if (!head)
  51.     {
  52.         head = tail;
  53.     }
  54.     //if (!head)
  55.     //{
  56.     //  head = new Node{ data };
  57.     //  tail = head;
  58.     //}
  59.     //else
  60.     //{
  61.     //  tail->next = new Node{ data, nullptr, tail };
  62.     //  tail = tail->next;
  63.     //}
  64.     //++size;
  65. }
  66.  
  67. template <typename ElemT>
  68. void List<ElemT>::push_front(const ElemT& data)
  69. {
  70.     Node* tmp{ head };
  71.     head = new Node{ data, head, nullptr };
  72.     if (tmp)
  73.     {
  74.         tmp->prev = head;
  75.     }
  76.     ++size;
  77.  
  78.     if (!tail)
  79.     {
  80.         tail = head;
  81.     }
  82. }
  83.  
  84. template <typename ElemT>
  85. bool List<ElemT>::pop_front()
  86. {
  87.     if (head)
  88.     {
  89.         if (tail == head)
  90.         {
  91.             delete tail;
  92.             size = 0;
  93.             tail = nullptr;
  94.             head = nullptr;
  95.             return true;
  96.         }
  97.  
  98.         Node* tmp{ head };
  99.         head = head->next;
  100.         head->prev = nullptr;
  101.         delete tmp;
  102.         --size;
  103.         return true;
  104.     }
  105.     return false;
  106. }
  107. template <typename ElemT>
  108. bool List<ElemT>::pop_back()
  109. {
  110.     if (tail)
  111.     {
  112.         if (tail == head)
  113.         {
  114.             delete tail;
  115.             size = 0;
  116.             tail = nullptr;
  117.             head = nullptr;
  118.             return true;
  119.         }
  120.  
  121.         Node* tmp{ tail };
  122.         tail = tail->prev;
  123.         tail->next = nullptr;
  124.         delete tmp;
  125.         --size;
  126.         return true;
  127.     }
  128.     return false;
  129. }
  130.  
  131. template <typename ElemT>
  132. void List<ElemT>::clear()
  133. {
  134.     while (tail)
  135.     {
  136.         std::cout << "Clear for: " << back() << '\n';
  137.         pop_back();
  138.     }
  139. }
  140.  
  141. template <typename ElemT>
  142. List<ElemT>::~List()
  143. {
  144.     while (head)
  145.     {
  146.         std::cout << "Destruct for: " << front() << '\n';
  147.         pop_front();
  148.     }
  149. }
  150.  
  151. template<typename ElemT>
  152. typename List<ElemT>::Node* List<ElemT>::getNode(size_t idx)
  153. {
  154.     Node* curr{ nullptr };
  155.     int cnt;
  156.    
  157.     if (idx >= 0 and idx < size)
  158.     {
  159.         if (idx > (size / 2))
  160.         {
  161.             for (curr = tail, cnt = size - 1; cnt > idx; curr = curr->prev, --cnt);
  162.         }
  163.         else
  164.         {
  165.             for (curr = head, cnt = 0; cnt < idx; curr = curr->next, ++cnt);
  166.         }
  167.     }
  168.     return curr;
  169. }
  170.  
  171. template <typename ElemT>
  172. ElemT& List<ElemT>::operator [](size_t idx)
  173. {
  174.     return getNode(idx)->data;
  175. };
  176.  
  177. template<typename ElemT>
  178. void List<ElemT>::insertAt(size_t idx, const ElemT& data)
  179. {
  180.     Node* curr = getNode(idx);
  181.     if (!curr or curr == tail) { push_back(data); return; };
  182.  
  183.     Node* newNode = new Node{ data, curr->next, curr };
  184.     curr->next = newNode;
  185.     newNode->next->prev = newNode;
  186.     ++size;
  187. }
  188.  
  189. template<typename ElemT>
  190. void List<ElemT>::deleteAt(size_t idx)
  191. {
  192.     Node* curr = getNode(idx);
  193.     if (curr)
  194.     {
  195.         if (curr->prev) { curr->prev->next = curr->next; }
  196.         else { head = curr->next; }
  197.         if (curr->next) { curr->next->prev = curr->prev; }
  198.         else { tail = curr->prev; }
  199.  
  200.         --size;
  201.  
  202.         if (curr == head and curr == tail)
  203.         {
  204.             head = nullptr;
  205.             tail = nullptr;
  206.             size = 0;
  207.         }
  208.  
  209.         delete curr;
  210.     }
  211.  
  212. }
  213.  
  214. int main()
  215. {
  216.     {
  217.         List<int> l;
  218.         l.push_back(1);
  219.         l.push_front(2);
  220.         l.pop_front();
  221.         l.pop_back();
  222.         std::cout << "Size: " << l.getSize() << '\n';
  223.     }
  224.  
  225.     {
  226.         List<int> l;
  227.         l.push_front(2);
  228.         l.push_back(1);
  229.         l.pop_back();
  230.         l.pop_front();
  231.         std::cout << "Size: " << l.getSize() << '\n';
  232.     }
  233.  
  234.     {
  235.         List<int> l;
  236.         //l.insertAt(5, 33);
  237.         l.deleteAt(5);
  238.         //std::cout << "Front: " << l.front() << '\n';
  239.         //std::cout << "Back: " << l.back() << '\n';
  240.         std::cout << "Size: " << l.getSize() << '\n';
  241.     }
  242.     List<int> l;
  243.  
  244.     std::cout << "Size: " << l.getSize() << '\n';
  245.     l.push_back(26);
  246.     l.push_back(42);
  247.     std::cout << "Size: " << l.getSize() << '\n';
  248.     std::cout << "Front: " << l.front() << '\n';
  249.     l.pop_front();
  250.     std::cout << "Front: " << l.front() << '\n';
  251.     l.pop_front();
  252.  
  253.     l.push_back(1);
  254.     l.push_back(2);
  255.     l.push_back(3);
  256.     l.push_back(4);
  257.  
  258.     std::cout << "####" << '\n';
  259.     std::cout << "Front: " << l.front() << '\n';
  260.     std::cout << "Back: " << l.back() << '\n';
  261.     std::cout << "####" << '\n';
  262.  
  263.     l.clear();
  264.  
  265.     std::cout << "Size: " << l.getSize() << '\n';
  266.  
  267.     l.push_back(1);
  268.     l.push_back(2);
  269.     l.push_back(3);
  270.     l.push_back(4);
  271.     std::cout << "####" << '\n';
  272.     std::cout << "Front: " << l.front() << '\n';
  273.     std::cout << "Back: " << l.back() << '\n';
  274.     l.pop_back();
  275.     std::cout << "Back: " << l.back() << '\n';
  276.     std::cout << "####" << '\n';
  277.  
  278.     l.clear();
  279.     std::cout << "Size: " << l.getSize() << '\n';
  280.  
  281.     l.push_front(22);
  282.     l.push_front(23);
  283.     l.push_front(24);
  284.     std::cout << "####" << '\n';
  285.     std::cout << "Front: " << l.front() << '\n';
  286.     std::cout << "Back: " << l.back() << '\n';
  287.  
  288.     l.clear();
  289.  
  290.     for (int i{ 0 }; i < 10; ++i)
  291.     {
  292.         l.push_front(i);
  293.     }
  294.     std::cout << "Size: " << l.getSize() << '\n';
  295.     std::cout << "[][][][][][]\n";
  296.     for (int i{ 0 }; i < l.getSize(); ++i)
  297.     {
  298.         std::cout << l[i] << '\n';
  299.     }
  300.     std::cout << "[][][][][][]\n";
  301.  
  302.     l.clear();
  303.  
  304.  
  305.     l.push_back(333);
  306.     std::cout << "Front: " << l.front() << '\n';
  307.     l.deleteAt(0);
  308.  
  309.     l.push_front(444);
  310.     std::cout << "Back: " << l.back() << '\n';
  311.     l.deleteAt(0);
  312.  
  313.  
  314.     for (int i{ 0 }; i < 10; ++i)
  315.     {
  316.         l.push_front(i);
  317.     }
  318.  
  319.     l.deleteAt(9);
  320.     l.deleteAt(5);
  321.     l.deleteAt(0);
  322.  
  323.     std::cout << "Size: " << l.getSize() << '\n';
  324.     std::cout << "[][][][][][]\n";
  325.     for (int i{ 0 }; i < l.getSize(); ++i)
  326.     {
  327.         std::cout << l[i] << '\n';
  328.     }
  329.     std::cout << "[][][][][][]\n";
  330.  
  331.     l.clear();
  332.  
  333.     l.insertAt(0, 1);
  334.     l.insertAt(0, 2);
  335.     l.insertAt(0, 3);
  336.     l.insertAt(0, 4);
  337.     l.insertAt(0, 5);
  338.     std::cout << "======\n";
  339.     for (int i{ 0 }; i < l.getSize(); ++i)
  340.     {
  341.         std::cout << l[i] << '\n';
  342.     }
  343.     std::cout << "======\n";
  344.     l.insertAt(2, 333);
  345.     l.deleteAt(3);
  346.     l.insertAt(4, 444);
  347.     std::cout << "Front: " << l.front() << '\n';
  348.     std::cout << "Back: " << l.back() << '\n';
  349.  
  350.     return 0;
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement