Xyris  0.5
LinkedList.hpp
Go to the documentation of this file.
1 /**
2  * @file LinkedList.hpp
3  * @author Keeton Feavel ([email protected])
4  * @brief Standard linked list library
5  * @version 0.3
6  * @date 2020-06-17
7  *
8  * @copyright Copyright the Xyris Contributors (c) 2021
9  */
10 #pragma once
11 
12 #include <stddef.h>
13 #include <stdint.h>
14 
15 namespace LinkedList {
16 
17 template<typename T>
19 public:
20  /**
21  * @brief Construct a new Linked List Node object
22  *
23  */
25  : data(0)
26  , next(NULL)
27  , prev(NULL)
28  {
29  // Default constructor
30  }
31 
32  /**
33  * @brief Construct a new Linked List Node object
34  *
35  * @param v Value to be stored
36  */
38  : data(v)
39  , next(NULL)
40  , prev(NULL)
41  {
42  // Value constructor
43  }
44 
45  /**
46  * @brief Construct a new Linked List Node object
47  *
48  * @param n Next node in the list
49  * @param p Previous node in the list
50  * @param v Value to be stored
51  */
53  : data(v)
54  , next(n)
55  , prev(p)
56  {
57  // Complete constructor
58  }
59 
60  /**
61  * @brief Return the data stored by the node
62  *
63  * @return T Stored data
64  */
65  T& Data()
66  {
67  return data;
68  }
69 
70  /**
71  * @brief Get the next node in the linked list
72  *
73  * @return LinkedListNode* Pointer to next node
74  */
76  {
77  return next;
78  }
79 
80  /**
81  * @brief Get the previous node in the linked list
82  *
83  * @return LinkedListNode* Pointer to the previous node
84  */
86  {
87  return prev;
88  }
89 
90  /**
91  * @brief Set the node's data
92  *
93  */
94  void SetData(T v)
95  {
96  data = v;
97  }
98 
99  /**
100  * @brief Set the node's next pointer
101  *
102  * @param n Pointer to next node
103  */
105  {
106  next = n;
107  }
108 
109  /**
110  * @brief Set the node's previous pointer
111  *
112  * @param n Pointer to the previous node
113  */
115  {
116  prev = n;
117  }
118 
119 private:
120  T data;
123 };
124 
125 template<typename T>
126 class LinkedList {
127 public:
129  : head(NULL)
130  , tail(NULL)
131  , count(0)
132  {
133  // Default constructor
134  }
135 
136  LinkedList(T val)
137  : LinkedList()
138  {
139  InsertFront(val);
140  }
141 
143  {
144  LinkedListNode<T>* back;
145  while ((back = RemoveBack())) {
146  delete back;
147  }
148  }
149 
150  void InsertFront(T val)
151  {
152  if (head) {
153  InsertBefore(head, val);
154  } else {
155  head = new LinkedListNode<T>(val);
156  tail = head;
157  ++count;
158  }
159  }
160 
161  void InsertBack(T val)
162  {
163  if (tail) {
164  InsertAfter(tail, val);
165  } else {
166  tail = new LinkedListNode<T>(val);
167  head = tail;
168  ++count;
169  }
170  }
171 
172  void InsertBefore(LinkedListNode<T>* next, T val)
173  {
174  if (!next)
175  return;
176  LinkedListNode<T>* newNode = new LinkedListNode<T>(val);
177  newNode->SetPrevious(next->Previous());
178  next->SetPrevious(newNode);
179  newNode->SetNext(next);
180  if (newNode->Previous()) {
181  newNode->Previous()->SetNext(newNode);
182  } else {
183  head = newNode;
184  }
185  ++count;
186  }
187 
188  void InsertAfter(LinkedListNode<T>* prev, T val)
189  {
190  if (!prev)
191  return;
192  LinkedListNode<T>* newNode = new LinkedListNode<T>(val);
193  newNode->SetNext(prev->Next());
194  prev->SetNext(newNode);
195  newNode->SetPrevious(prev);
196  if (newNode->Next()) {
197  newNode->Next()->SetPrevious(newNode);
198  } else {
199  tail = newNode;
200  }
201  ++count;
202  }
203 
205  {
206  if (del == head)
207  head = del->Next();
208  if (del == tail)
209  tail = del->Previous();
210  if (del->Next())
211  del->Next()->SetPrevious(del->Previous());
212  if (del->Previous())
213  del->Previous()->SetNext(del->Next());
214  count--;
215  }
216 
218  {
219  if (!head)
220  return NULL;
221  LinkedListNode<T>* currHead = head;
222  Remove(currHead);
223  return currHead;
224  }
225 
227  {
228  if (!tail)
229  return NULL;
230  LinkedListNode<T>* currTail = tail;
231  Remove(currTail);
232  return currTail;
233  }
234 
236  {
237  if (!node)
238  return NULL;
239  LinkedListNode<T>* before = node->Previous();
240  Remove(before);
241  return before;
242  }
243 
245  {
246  if (!node)
247  return NULL;
248  LinkedListNode<T>* after = node->Next();
249  Remove(after);
250  return after;
251  }
252 
253  /**
254  * @brief Get pointer to the head node
255  *
256  * @return LinkedListNode* Pointer to head node
257  */
259  {
260  return head;
261  }
262 
263  /**
264  * @brief Get pointer to the tail node
265  *
266  * @return LinkedListNode* Pointer to tail node
267  */
269  {
270  return tail;
271  }
272 
273  /**
274  * @brief Get the number of items in the linked list
275  *
276  * @return size_t Number of items in the linked list
277  */
278  size_t Count()
279  {
280  return count;
281  }
282 
283  /**
284  * @brief Check if the linked list is empty
285  *
286  * @return true The list is empty
287  * @return false The list is not empty
288  */
289  bool IsEmpty()
290  {
291  return Count() == 0;
292  }
293 
294 private:
297  size_t count;
298 };
299 
300 } // !namespace LinkedList
LinkedList::LinkedList::InsertFront
void InsertFront(T val)
Definition: LinkedList.hpp:150
LinkedList::LinkedListNode
Definition: LinkedList.hpp:18
LinkedList::LinkedList::InsertBefore
void InsertBefore(LinkedListNode< T > *next, T val)
Definition: LinkedList.hpp:172
LinkedList::LinkedList::head
LinkedListNode< T > * head
Definition: LinkedList.hpp:295
LinkedList::LinkedListNode::Next
LinkedListNode * Next()
Get the next node in the linked list.
Definition: LinkedList.hpp:75
LinkedList::LinkedListNode::Previous
LinkedListNode * Previous()
Get the previous node in the linked list.
Definition: LinkedList.hpp:85
LinkedList::LinkedList::~LinkedList
~LinkedList()
Definition: LinkedList.hpp:142
LinkedList::LinkedListNode::LinkedListNode
LinkedListNode(T v, LinkedListNode *n, LinkedListNode *p)
Construct a new Linked List Node object.
Definition: LinkedList.hpp:52
LinkedList::LinkedList::RemoveBack
LinkedListNode< T > * RemoveBack()
Definition: LinkedList.hpp:226
LinkedList::LinkedList::Tail
LinkedListNode< T > * Tail()
Get pointer to the tail node.
Definition: LinkedList.hpp:268
LinkedList::LinkedListNode::SetNext
void SetNext(LinkedListNode *n)
Set the node's next pointer.
Definition: LinkedList.hpp:104
LinkedList::LinkedList::count
size_t count
Definition: LinkedList.hpp:297
LinkedList::LinkedList::LinkedList
LinkedList(T val)
Definition: LinkedList.hpp:136
LinkedList::LinkedListNode::Data
T & Data()
Return the data stored by the node.
Definition: LinkedList.hpp:65
LinkedList::LinkedListNode::SetData
void SetData(T v)
Set the node's data.
Definition: LinkedList.hpp:94
LinkedList::LinkedList::Count
size_t Count()
Get the number of items in the linked list.
Definition: LinkedList.hpp:278
LinkedList::LinkedListNode::SetPrevious
void SetPrevious(LinkedListNode *n)
Set the node's previous pointer.
Definition: LinkedList.hpp:114
LinkedList::LinkedListNode::LinkedListNode
LinkedListNode()
Construct a new Linked List Node object.
Definition: LinkedList.hpp:24
LinkedList::LinkedList::tail
LinkedListNode< T > * tail
Definition: LinkedList.hpp:296
LinkedList::LinkedList::IsEmpty
bool IsEmpty()
Check if the linked list is empty.
Definition: LinkedList.hpp:289
LinkedList::LinkedList::InsertBack
void InsertBack(T val)
Definition: LinkedList.hpp:161
LinkedList::LinkedList::LinkedList
LinkedList()
Definition: LinkedList.hpp:128
LinkedList::LinkedList::RemoveFront
LinkedListNode< T > * RemoveFront()
Definition: LinkedList.hpp:217
LinkedList
Definition: LinkedList.hpp:15
LinkedList::LinkedList::Head
LinkedListNode< T > * Head()
Get pointer to the head node.
Definition: LinkedList.hpp:258
LinkedList::LinkedList::InsertAfter
void InsertAfter(LinkedListNode< T > *prev, T val)
Definition: LinkedList.hpp:188
LinkedList::LinkedList::RemoveBefore
LinkedListNode< T > * RemoveBefore(LinkedListNode< T > *node)
Definition: LinkedList.hpp:235
LinkedList::LinkedList::Remove
void Remove(LinkedListNode< T > *del)
Definition: LinkedList.hpp:204
LinkedList::LinkedListNode::data
T data
Definition: LinkedList.hpp:120
LinkedList::LinkedListNode::prev
LinkedListNode * prev
Definition: LinkedList.hpp:122
LinkedList::LinkedListNode::LinkedListNode
LinkedListNode(T v)
Construct a new Linked List Node object.
Definition: LinkedList.hpp:37
LinkedList::LinkedListNode::next
LinkedListNode * next
Definition: LinkedList.hpp:121
LinkedList::LinkedList::RemoveAfter
LinkedListNode< T > * RemoveAfter(LinkedListNode< T > *node)
Definition: LinkedList.hpp:244