Advertisement
jeanleopoldo

LinkedList

Apr 28th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.81 KB | None | 0 0
  1. // Copyright [2017 <Jean Leopoldo]
  2. #ifndef STRUCTURES_LINKED_LIST_H
  3. #define STRUCTURES_LINKED_LIST_H
  4.  
  5. #include <cstdint>
  6. #include <stdexcept>
  7.  
  8. namespace structures {
  9.  
  10. template<typename T>
  11. //! class LinkedList
  12. /*
  13. *  class LinkedList
  14. */
  15. class LinkedList {
  16.  public:
  17. //! constructor
  18. /*
  19. *  constructor
  20. */
  21.  
  22.     LinkedList() {
  23.         head = nullptr;
  24.         size_ = 0;
  25.     }
  26. //! destructor
  27. /*
  28. *  verifies if list is empty. if not, destruct list
  29. */
  30.     ~LinkedList() {
  31.         clear();
  32.     }
  33. //! clear
  34. /*
  35. *  verifies if list is empty. if not, destruct list
  36. */
  37.     void clear() {
  38.         while (!empty()) {
  39.             pop_front();
  40.         }
  41.         head = nullptr;
  42.         size_ = 0;
  43.     }
  44. //! destructor
  45. /*
  46. *  verifies if list is empty. if not, destruct list
  47. */
  48.     void push_back(const T& data) {
  49.         insert(data, size_);
  50.     }
  51. //! destructor
  52. /*
  53. *  verifies if list is empty. if not, destruct list
  54. */
  55.     void push_front(const T& data) {
  56.         Node *node = new Node(data);
  57.         if (node == nullptr)
  58.             throw std::out_of_range("full");
  59.         insert(data, 0);
  60.     }
  61. //! destructor
  62. /*
  63. *  verifies if list is empty. if not, destruct list
  64. */
  65.     void insert(const T& data, std::size_t index) {
  66.         if (indexOut(index))
  67.             throw std::out_of_range("invalid index");
  68.         Node *node = new Node(data);
  69.         if (node == nullptr)
  70.             throw std::out_of_range("full");  
  71.         if (index == 0) {
  72.             size_++;
  73.             head = node;
  74.         }
  75.         Node *aux = head;
  76.         if (index == size_-1) {
  77.             size_++;
  78.             for (int i = 0; i < size_-1; i++)
  79.                 aux = aux->next();
  80.             aux->next(node);
  81.             node->next(nullptr);
  82.             delete aux;
  83.         }
  84.         size_++;
  85.         for (int i = 0; i < index-1; i++)
  86.             aux = aux->next();
  87.         size_++;
  88.         aux->next(node);
  89.         delete aux;
  90.     }
  91. //! destructor
  92. /*
  93. *  verifies if list is empty. if not, destruct list
  94. */
  95.     void insert_sorted(const T& data) {
  96.         Node *node = new Node(data);
  97.         if (node == nullptr)
  98.             throw std::out_of_range("full");
  99.         Node *aux = head;
  100.         for (int i = 0; i < size_-1; i++) {
  101.             if (aux->data() < data)
  102.                 aux = aux->next();
  103.             insert(data, i);
  104.           }
  105.         delete aux;
  106.     }
  107. //! destructor
  108. /*
  109. *  verifies if list is empty. if not, destruct list
  110. */
  111.     T& at(std::size_t index) {
  112.         if (indexOut(index))
  113.             throw std::out_of_range("invalid index");
  114.         if (empty())
  115.             throw std::out_of_range("empty");
  116.         Node *aux = head;
  117.         T& data;
  118.         for (int i = 0; i < index -1; i++) {
  119.             aux = aux->next();
  120.             if (index == i) {
  121.                 data = aux->data();
  122.                 delete aux;
  123.                 return data;
  124.             }
  125.         }
  126.         throw "not found";
  127.     }
  128. //! destructor
  129. /*
  130. *  verifies if list is empty. if not, destruct list
  131. */
  132.     T pop(std::size_t index) {
  133.         if (empty())
  134.             throw std::out_of_range("empty");
  135.         if (indexOut(index))
  136.             throw std::out_of_range("invalid index");
  137.         Node *aux = head;
  138.         Node *del;
  139.         T data;
  140.         for (int i = 0; i < index -2; i++)
  141.             aux = aux->next();
  142.         size_--;
  143.         del = aux->next();
  144.         data = del->data();
  145.         aux = del->next();
  146.         delete del;
  147.         delete aux;
  148.         return data;
  149.     }
  150. //! destructor
  151. /*
  152. *  verifies if list is empty. if not, destruct list
  153. */
  154.     T pop_back() {
  155.         if (empty())
  156.             throw std::out_of_range("empty");
  157.         Node *aux = head, *del;
  158.         T data;
  159.         for (int i = 0; i < size_ -1; i++)
  160.             aux = aux->next();
  161.         del = aux->next();
  162.         data = del->data();
  163.         aux->next(nullptr);
  164.         size_--;
  165.         delete del;
  166.         delete aux;
  167.         return data;
  168.     }
  169. //! destructor
  170. /*
  171. *  verifies if list is empty. if not, destruct list
  172. */
  173.     T pop_front() {
  174.         if (empty())
  175.             throw std::out_of_range("empty");
  176.         Node *aux = head;
  177.         for (int i = 0; i < size_-1; i++)
  178.             aux = aux->next();
  179.         size_--;
  180.         T data = aux->data();
  181.         head = aux->next();
  182.         delete aux;
  183.         return data;
  184.     }
  185. //! destructor
  186. /*
  187. *  verifies if list is empty. if not, destruct list
  188. */
  189.     void remove(const T& data) {
  190.         if (empty())
  191.             throw std::out_of_range("empty");
  192.         Node *aux = head;
  193.         for (int i = 0; i < size_-1; i++)
  194.             if (aux->data() == data)
  195.                 pop(i);
  196.             aux = aux->next();
  197.         delete aux;
  198.     }
  199. //! destructor
  200. /*
  201. *  verifies if list is empty. if not, destruct list
  202. */
  203.     bool empty() const {
  204.         if (size_ == 0)
  205.             return true;
  206.         return false;
  207.     }
  208. //! destructor
  209. /*
  210. *  verifies if list is empty. if not, destruct list
  211. */
  212.     bool contains(const T& data) const {
  213.         Node *aux = head;
  214.         for (int i = 0; i < size_-1; i++) {
  215.             aux = aux->next();
  216.             if (aux->data() == data)
  217.                 return true;
  218.         }
  219.         return false;
  220.     }
  221. //! destructor
  222. /*
  223. *  verifies if list is empty. if not, destruct list
  224. */
  225.     std::size_t find(const T& data) {
  226.         if (empty())
  227.             throw std::out_of_range("empty");
  228.         Node *aux = head;
  229.         for (int i = 0; i < size_-1; i++)
  230.             if (aux->data() == data)
  231.                 return i;
  232.         return -1;
  233.     }
  234. //! destructor
  235. /*
  236. *  verifies if list is empty. if not, destruct list
  237. */
  238.     std::size_t size() const {
  239.         return size_;
  240.     }
  241.  
  242.  private:
  243.     class Node {
  244.      public:
  245.         explicit Node(const T& data) {
  246.             data_ = data;
  247.             next_ = nullptr;
  248.         }
  249.  
  250.         Node(const T& data, Node* next) {
  251.             data_ = data;
  252.             next_ = next;
  253.         }
  254.  
  255.         T& data() {
  256.             return data_;
  257.         }
  258.  
  259.         const T& data() const {
  260.             return data_;
  261.         }
  262.  
  263.         Node* next() {
  264.             return next_;
  265.         }
  266.  
  267.         const Node* next() const {
  268.             return next_;
  269.         }
  270.  
  271.         void next(Node* node) {
  272.             next_ = node;
  273.         }
  274.  
  275.      private:
  276.         T data_;
  277.         Node* next_;
  278.     };
  279. //! destructor
  280. /*
  281. *  verifies if list is empty. if not, destruct list
  282. */
  283.     Node* end() {
  284.         auto it = head;
  285.         for (auto i = 1u; i < size(); ++i) {
  286.             it = it->next();
  287.         }
  288.         return it;
  289.     }
  290. //! destructor
  291. /*
  292. *  verifies if list is empty. if not, destruct list
  293. */
  294.     bool indexOut(std::size_t index) {
  295.         if (index < 0 || index > size_)
  296.             return true;
  297.         return false;
  298.     }
  299.  
  300.     Node* head;
  301.     std::size_t size_;
  302. };
  303.  
  304. }  //  namespace structures
  305.  
  306. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement