avr39-ripe

listTemplate

Feb 4th, 2020
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.90 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. class List
  5. {
  6.     class Node
  7.     {
  8.     public:
  9.         T data;
  10.         Node* next;
  11.         Node* prev;
  12.         Node(const T& data_, Node* next_ = nullptr, Node* prev_ = nullptr) : data{ data_ }, next{ next_ }, prev{ prev_ } {};
  13.     };
  14.  
  15.     Node* head;
  16.     Node* tail;
  17.     size_t size;
  18.     Node* getNode(size_t idx);
  19. public:
  20.     List() : head{ nullptr }, tail{ nullptr }, size{ 0 } {};
  21.     void push_back(const T& data);
  22.     void push_front(const T& data);
  23.     const size_t getSize()const { return size; };
  24.     T& front() { return head->data; };
  25.     T& back() { return tail->data; };
  26.     void pop_front();
  27.     void pop_back();
  28.     void clear();
  29.     T& operator[](size_t idx);
  30.     void insertAt(size_t idx, const T& data);
  31.     void deleteAt(size_t idx);
  32.     ~List();
  33. };
  34.  
  35. template<typename T>
  36. void List<T>::push_back(const T& data)
  37. {
  38.     if (!head)
  39.     {
  40.         head = new Node{ data };
  41.         tail = head;
  42.     }
  43.     else
  44.     {
  45.         tail->next = new Node{ data, nullptr, tail };
  46.         tail = tail->next;
  47.     }
  48.     ++size;
  49. }
  50.  
  51. template<typename T>
  52. void List<T>::push_front(const T& data)
  53. {
  54.     Node* tmp{ head };
  55.     head = new Node{ data, head, nullptr };
  56.     if (tmp)
  57.     {
  58.         tmp->prev = head;
  59.     }
  60.     ++size;
  61.  
  62.     if (!tail)
  63.     {
  64.         tail = head;
  65.     }
  66. }
  67.  
  68. template<typename T>
  69. void List<T>::pop_front()
  70. {
  71.     if (head)
  72.     {
  73.         Node* tmp = head;
  74.         head = head->next;
  75.         delete tmp;
  76.         --size;
  77.     }
  78. }
  79.  
  80. template<typename T>
  81. void List<T>::pop_back()
  82. {
  83.     if (tail)
  84.     {
  85.         Node* tmp = tail;
  86.         tail = tail->prev;
  87.         delete tmp;
  88.         --size;
  89.     }
  90. }
  91.  
  92. template<typename T>
  93. void List<T>::clear()
  94. {
  95.     while (tail)
  96.     {
  97.         std::cout << "Clear " << back() << '\n';
  98.         pop_back();
  99.     }
  100.     head = nullptr;
  101. }
  102.  
  103. template<typename T>
  104. T& List<T>::operator [](size_t idx)
  105. {
  106.     return getNode(idx)->data;
  107. };
  108.  
  109. template<typename T>
  110. typename List<T>::Node* List<T>::getNode(size_t idx)
  111. {
  112.     Node* curr;
  113.     size_t cnt;
  114.  
  115.     if (idx > (size / 2))
  116.     {
  117.         for(curr=tail, cnt=size-1; cnt>idx; curr=curr->prev, --cnt);
  118.     }
  119.     else
  120.     {
  121.         for(curr=head, cnt=0; cnt<idx; curr=curr->next, ++cnt);
  122.     }
  123.     return curr;
  124. }
  125.  
  126. template<typename T>
  127. void List<T>::insertAt(size_t idx, const T &data)
  128. {
  129.     Node* curr = getNode(idx);
  130.     if (!curr or curr == tail ) { push_back(data); return;};
  131.  
  132.     Node* newNode = new Node{data, curr->next, curr};
  133.     curr->next = newNode;
  134.     newNode->next->prev = newNode;
  135.     ++size;
  136. }
  137.  
  138. template<typename T>
  139. void List<T>::deleteAt(size_t idx)
  140. {
  141.     Node* curr = getNode(idx);
  142.  
  143.     if (curr->prev) {curr->prev->next = curr->next;} else { head = curr->next;}
  144.     if (curr->next) {curr->next->prev = curr->prev;} else { tail = curr->prev;}
  145.  
  146.     --size;
  147.  
  148.     if (curr == head and curr == tail) {head = tail = nullptr; size = 0; }
  149.  
  150.     delete curr;
  151. }
  152.  
  153. template<typename T>
  154. List<T>::~List()
  155. {
  156.     while (head)
  157.     {
  158.         std::cout << "Destruct " << front() << '\n';
  159.         pop_front();
  160.     }
  161. }
  162.  
  163. int main()
  164. {
  165.     List<int> l;
  166.  
  167.     std::cout << "Size: " << l.getSize() << '\n';
  168.     l.push_back(26);
  169.     l.push_back(42);
  170.     std::cout << "Size: " << l.getSize() << '\n';
  171.     std::cout << "Front: " << l.front() << '\n';
  172.     l.pop_front();
  173.     std::cout << "Front: " << l.front() << '\n';
  174.     l.pop_front();
  175.  
  176.     l.push_back(1);
  177.     l.push_back(2);
  178.     l.push_back(3);
  179.     l.push_back(4);
  180.  
  181.     std::cout << "####" << '\n';
  182.     std::cout << "Front: " << l.front() << '\n';
  183.     std::cout << "Back: " << l.back() << '\n';
  184.     std::cout << "####" << '\n';
  185.  
  186.     l.clear();
  187.  
  188.     std::cout << "Size: " << l.getSize() << '\n';
  189.  
  190.     l.push_back(1);
  191.     l.push_back(2);
  192.     l.push_back(3);
  193.     l.push_back(4);
  194.     std::cout << "####" << '\n';
  195.     std::cout << "Front: " << l.front() << '\n';
  196.     std::cout << "Back: " << l.back() << '\n';
  197.     l.pop_back();
  198.     std::cout << "Back: " << l.back() << '\n';
  199.     std::cout << "####" << '\n';
  200.  
  201.     l.clear();
  202.     std::cout << "Size: " << l.getSize() << '\n';
  203.  
  204.     l.push_front(22);
  205.     l.push_front(23);
  206.     l.push_front(24);
  207.     std::cout << "####" << '\n';
  208.     std::cout << "Front: " << l.front() << '\n';
  209.     std::cout << "Back: " << l.back() << '\n';
  210.  
  211.     l.clear();
  212.  
  213.     for (int i{ 0 }; i < 10; ++i)
  214.     {
  215.         l.push_front(i);
  216.     }
  217.     std::cout << "Size: " << l.getSize() << '\n';
  218.     std::cout << "[][][][][][]\n";
  219.     for (int i{ 0 }; i < l.getSize(); ++i)
  220.     {
  221.         std::cout << l[i] << '\n';
  222.     }
  223.     std::cout << "[][][][][][]\n";
  224.  
  225.     l.clear();
  226.  
  227.  
  228.     l.push_back(333);
  229.     std::cout << "Front: " << l.front() << '\n';
  230.     l.deleteAt(0);
  231.  
  232.     l.push_front(444);
  233.     std::cout << "Back: " << l.back() << '\n';
  234.     l.deleteAt(0);
  235.  
  236.  
  237.     for (int i{ 0 }; i < 10; ++i)
  238.     {
  239.         l.push_front(i);
  240.     }
  241.  
  242.     l.deleteAt(9);
  243.     l.deleteAt(5);
  244.     l.deleteAt(0);
  245.  
  246.     std::cout << "Size: " << l.getSize() << '\n';
  247.     std::cout << "[][][][][][]\n";
  248.     for (int i{ 0 }; i < l.getSize(); ++i)
  249.     {
  250.         std::cout << l[i] << '\n';
  251.     }
  252.     std::cout << "[][][][][][]\n";
  253.  
  254.     l.clear();
  255.  
  256.     l.insertAt(0, 1);
  257.     l.insertAt(0, 2);
  258.     l.insertAt(0, 3);
  259.     l.insertAt(0, 4);
  260.     l.insertAt(0, 5);
  261.     l.insertAt(2, 333);
  262.     l.deleteAt(3);
  263.     l.insertAt(4, 444);
  264.     std::cout << "Front: " << l.front() << '\n';
  265.     std::cout << "Back: " << l.back() << '\n';
  266.  
  267.     return 0;
  268. }
Add Comment
Please, Sign In to add comment