Advertisement
WsumrakW

LinkedList

May 26th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include "BaseList.h"
  2. #include "LinkedListNode.h"
  3.  
  4. template <typename ItemType>
  5. class LinkedList : public BaseList<ItemType>
  6. {
  7. private:
  8.     LinkedListNode<ItemType>* m_pHead;
  9.     LinkedListNode<ItemType>* m_pTail;
  10. public:
  11.     LinkedList();
  12.     virtual BaseList<ItemType>& addInHead(const ItemType& Item);
  13.     virtual BaseList<ItemType>& addInTail(const ItemType& Item);
  14.     virtual BaseList<ItemType>& removeFromHead();
  15.     virtual BaseList<ItemType>& removeFromTail();
  16.     virtual ItemType& operator[] (const int index);
  17.     virtual const ItemType& operator[] (const int index) const;
  18.     virtual ~LinkedList();
  19. };
  20.  
  21. template <typename ItemType>
  22. LinkedList<ItemType>::LinkedList() {
  23.     std::cout << "Linked list created" << std::endl;
  24.     m_pHead = m_pTail = nullptr;
  25.     m_size - 0;
  26. }
  27.  
  28. template <typename ItemType>
  29. BaseList<ItemType>& LinkedList<ItemType>::addInHead(const ItemType& Item) {
  30.     if (m_size)
  31.         m_pHead = m_pHead->addBefor(Item);
  32.     else
  33.         m_pHead = m_pTail = new LinkedListNode<ItemType>(Item);
  34.  
  35.     m_size++;
  36.     return *this;
  37. }
  38.  
  39. template <typename ItemType>
  40. BaseList<ItemType>& LinkedList<ItemType>::addInTail(const ItemType& Item) {
  41.     if (m_size)
  42.         m_pTail = m_pTail->addAfter(Item);
  43.     else
  44.         m_pHead = m_pTail = new LinkedListNode<ItemType>(Item);
  45.  
  46.     m_size++;
  47.     return *this;
  48. }
  49.  
  50. template <typename ItemType>
  51. BaseList<ItemType>& LinkedList<ItemType>::removeFromHead() {
  52.     switch (m_size)
  53.     {
  54.     case 0: return *this;
  55.     case 1:
  56.         m_pHead->remove();
  57.         m_pHead = m_pTail = nullptr;
  58.         break;
  59.     default:
  60.         LinkedListNode<ItemType>* temp = m_pHead;
  61.         m_pHead = m_pHead->operator[](1);
  62.         temp->remove();
  63.         break;
  64.     }
  65.     m_size--;
  66.     return *this;
  67. }
  68.  
  69. template <typename ItemType>
  70. BaseList<ItemType>& LinkedList<ItemType>::removeFromTail() {
  71.     switch (m_size)
  72.     {
  73.     case 0: return *this;
  74.     case 1:
  75.         m_pHead->remove();
  76.         m_pHead = m_pTail = nullptr;
  77.         break;
  78.     default:
  79.         LinkedListNode<ItemType>* temp = m_pTail;
  80.         m_pTail = m_pTail->operator[](-1);
  81.         temp->remove();
  82.         break;
  83.     }
  84.     m_size--;
  85.     return *this;
  86. }
  87.  
  88. template <typename ItemType>
  89. ItemType& LinkedList<ItemType>::operator[] (const int index) {
  90.     if (index<m_size / 2>)
  91.         return m_pHead->operator[](index)->data;
  92.     else
  93.         return m_pTail->operator[](index-m_size+1)->data;
  94. }
  95.  
  96. template <typename ItemType>
  97. const ItemType& LinkedList<ItemType>::operator[] (const int index) const {
  98.     if (index<m_size / 2>)
  99.         return m_pHead->operator[](index)->data;
  100.     else
  101.         return m_pTail->operator[](index - m_size + 1)->data;
  102. }
  103.  
  104. template <typename ItemType>
  105. LinkedList<ItemType>::~LinkedList() {
  106.     if (m_size) delete m_pHead;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement