Advertisement
Ser1ousSAM

List

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