Advertisement
sp2danny

LinkedList.h++

Jun 5th, 2015
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.22 KB | None | 0 0
  1. // this is part of a tutorial that can be found here: http://pastebin.com/DXunz58Q
  2.  
  3. #pragma once
  4.  
  5. #include <cstddef>
  6.  
  7. template<typename T>
  8. class List
  9. {
  10.     struct Node
  11.     {
  12.         Node* next;
  13.         Node* prev;
  14.         T data;
  15.     };
  16.  
  17.     struct Sentry  // since T might not be default-constructible, we need a separate Sentry type
  18.     {
  19.         Node* next;
  20.         Node* prev;
  21.     };
  22.  
  23.     Node* sentry;  // this will be our sentry node. it will be of type Sentry, but 'poses' as a Node
  24.     std::size_t size;
  25.  
  26.     // helper function to link 2 nodes
  27.     void Link( Node* n1, Node* n2 )
  28.     {
  29.         n1->next = n2;
  30.         n2->prev = n1;
  31.     }
  32.  
  33. public:
  34.  
  35.     typedef Node* Iterator;
  36.  
  37.     // this creates a new empty list
  38.     List()
  39.     {
  40.         sentry = (Node*) new Sentry;  // make a new sentry node
  41.         Link( sentry, sentry );       // that points to itself
  42.         size = 0;
  43.     }
  44.  
  45.     // returns true if list is empty
  46.     bool Empty() const
  47.     {
  48.         return sentry->next == sentry;  // when sentry points to itself, the list is empty
  49.     }
  50.  
  51.     // returns size of list
  52.     std::size_t Size() const
  53.     {
  54.         return size;
  55.     }
  56.  
  57.     // pointer to first item of list, or end if empty
  58.     Iterator Begin()
  59.     {
  60.         return sentry->next;  // no special-cases needed when using sentry
  61.     }
  62.  
  63.     // pointer to end (one past last)
  64.     Iterator End()
  65.     {
  66.         return sentry;
  67.     }
  68.  
  69.     // this inserts new data before 'here'
  70.     Iterator Insert( Iterator here, const T& data )
  71.     {
  72.         Iterator item = new Node{0,0,data};  // create new item. use T's copy-constructor
  73.         Link( here->prev, item );            // link in new node. item comes before here,
  74.         Link( item, here );                  // so in-between `here->prev´ and `here´
  75.         size += 1;                           // update size
  76.         return item;
  77.     }
  78.  
  79.     // adds new item last
  80.     void PushBack( const T& d )
  81.     {
  82.         Insert( End(), d );
  83.     }
  84.  
  85.     // adds new item first
  86.     void PushFront( const T& d )
  87.     {
  88.         Insert( Begin(), d );
  89.     }
  90.  
  91.     // erase one item. erasing end is harmless
  92.     Iterator Erase( Iterator here )
  93.     {
  94.         if( here == sentry ) return sentry;  // check for end
  95.         Iterator nxt = here->next;           // save next item for return value
  96.         Link( here->prev, here->next );      // unlink item. no special cases needed when using sentry
  97.         delete here;                         // delete item. this will call T's destructor
  98.         size -= 1;                           // update size
  99.         return nxt;
  100.     }
  101.  
  102.     // remove last item. don't call on empty list
  103.     void PopBack()
  104.     {
  105.         Erase( sentry->prev );  // sentry->prev points to last item
  106.     }
  107.  
  108.     // remove first item. don't call on empty list
  109.     void PopFront()
  110.     {
  111.         Erase( sentry->next );  // sentry->next points to first item
  112.     }
  113.  
  114.     // erase all items
  115.     void Clear()
  116.     {
  117.         Iterator cur = sentry->next;
  118.         while( cur != sentry )
  119.         {
  120.             Iterator nxt = cur->next;  // we have to save the next pointer, since deletion invalidates access
  121.             delete cur;                // this will call T's destructor
  122.             cur = nxt;
  123.         }
  124.         size = 0;
  125.         // note that the list is left in a usable (but empty) state
  126.         // while(!Empty()) Erase(Begin());  // would have been simpler
  127.     }
  128.  
  129.     // this destroys the list itself
  130.     ~List()
  131.     {
  132.         Clear();
  133.         delete (Sentry*) sentry;
  134.     }
  135.  
  136.     // returns last item by reference
  137.     T& Back()
  138.     {
  139.         return sentry->prev->data;
  140.     }
  141.  
  142.     // returns first item by reference
  143.     T& Front()
  144.     {
  145.         return sentry->next->data;
  146.     }
  147.  
  148.     // non-range-checked index access
  149.     T& operator [] ( std::size_t idx )
  150.     {
  151.         Iterator iter = Begin();
  152.         while( idx-- ) iter = iter->next;  // this loop is why index access in O(n)
  153.         return iter->data;
  154.     }
  155.  
  156. #ifndef NDEBUG
  157.  
  158.     bool IntegrityCheck()
  159.     {
  160.         if( ! sentry ) return false;                // not even allocated?
  161.         Iterator prev = sentry;
  162.         Iterator curr = sentry->next;
  163.         std::size_t sz = 0;
  164.         while( curr != sentry )
  165.         {
  166.             if( ! curr ) return false;              // there should be no null pointers in the list
  167.             if( sz >= size ) return false;          // list is longer than what size suggest
  168.             ++sz;
  169.             if( curr->prev != prev ) return false;  // back-pointer dont point to previous item
  170.             prev = curr;
  171.             curr = curr->next;
  172.         }
  173.         if( sz != size ) return false;              // list is shorter than what size suggest
  174.         if( sentry->prev != prev ) return false;    // 'tail' pointer don't point to last item
  175.  
  176.         return true;
  177.     }
  178.  
  179. #endif
  180.  
  181. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement