]>
jfr.im git - irc/gameservirc.git/blob - gameserv/list.h
19 ~List(); //deconstructor
20 T
*insertAtFront( const T
& );
21 T
*insertAtBack( T
*&);
22 ListNode
<T
> *insertAtBack_RLN( T
*&);
23 bool removeFromFront( T
& );
24 bool removeFromBack( T
& );
26 ListNode
< T
> *remove( T
* );
29 ListNode
< T
> *Find( T
* );
30 ListNode
< T
> *First() { return firstPtr
; };
31 ListNode
< T
> *Last() { return lastPtr
; };
33 ListNode
< T
> *firstPtr
;
34 ListNode
< T
> *lastPtr
;
36 ListNode
< T
> *getNewNode ( const T
& );
40 List
<T
>::List() : firstPtr (0), lastPtr (0) {}
48 log("Destroying Nodes");
51 ListNode
<T
> *currentPtr
= firstPtr
, *tempPtr
;
56 currentPtr
= currentPtr
->Next();
59 log("Deleting Memory address: %s", tempPtr
->getData());
65 log("All Nodes destroyed");
71 T
*List
<T
>::insertAtFront( const T
&value
)
73 ListNode
<T
> *newPtr
= getNewNode ( value
);
77 firstPtr
= lastPtr
= newPtr
;
80 newPtr
->Next
= firstPtr
;
81 firstPtr
->prev
= newPtr
;
84 return firstPtr
->getData();
88 T
*List
<T
>::insertAtBack(T
*&value
)
90 ListNode
<T
> *newPtr
= getNewNode(*value
);
94 firstPtr
= lastPtr
= newPtr
;
98 newPtr
->prev
= lastPtr
;
99 lastPtr
->next
= newPtr
;
102 return lastPtr
->getData();
106 ListNode
<T
> *List
<T
>::insertAtBack_RLN(T
*&value
)
108 ListNode
<T
> *newPtr
= getNewNode(*value
);
112 firstPtr
= lastPtr
= newPtr
;
116 newPtr
->prev
= lastPtr
;
117 lastPtr
->next
= newPtr
;
125 bool List
<T
>::removeFromFront( T
&value
)
131 ListNode
<T
> *tempPtr
= firstPtr
;
133 if ( firstPtr
== lastPtr
)
134 firstPtr
= lastPtr
= 0;
136 firstPtr
= firstPtr
->next
;
138 value
= tempPtr
->getData();
145 bool List
<T
>::removeFromBack( T
&value
)
151 ListNode
<T
> *tempPtr
= lastPtr
;
153 if ( firstPtr
== lastPtr
)
154 lastPtr
= firstPtr
= 0;
156 lastPtr
= lastPtr
->prev
;
158 value
= tempPtr
->getData();
166 bool List
<T
>::isEmpty() const
167 { return firstPtr
== 0 && lastPtr
== 0; }
170 ListNode
<T
> *List
<T
>::getNewNode( const T
&value
)
172 ListNode
<T
> *ptr
= new ListNode
<T
>(value
);
179 ListNode
<T
> *List
<T
>::Find( T
*value
)
181 if (isEmpty()) {return NULL
;}
183 ListNode
<T
> *currentPtr
;
184 currentPtr
= firstPtr
;
187 cout
<< currentPtr
->getData() << endl
<< value
<< endl
;
188 if (currentPtr
->getData() == value
)
190 currentPtr
= currentPtr
->Next();
197 void List
<T
>::print() const
201 cout
<< "Empty list" << endl
;
205 ListNode
<T
> *currentPtr
;
206 currentPtr
= firstPtr
;
209 cout
<< "aClient: " << *currentPtr
->getData() << flush
;
211 if (currentPtr
->getData()->stats
)
212 cout
<< " Player Name: " << currentPtr
->getData()->stats
->name
213 << " Password: " << currentPtr
->getData()->stats
->password
<< flush
;
215 currentPtr
= currentPtr
->next
;
221 bool List
<T
>::del(T
*remPtr
)
223 ListNode
<T
> *removed
= remove( remPtr
);
233 ListNode
<T
> *List
<T
>::remove(T
*remPtr
)
235 ListNode
<T
> *newPtr
= firstPtr
;
243 testPtr
= newPtr
->getData();
244 if (testPtr
== remPtr
)
246 if (firstPtr
== lastPtr
)
249 log("One Element. Deleting it");
251 firstPtr
= lastPtr
= NULL
;
254 else if (newPtr
!= lastPtr
&& newPtr
!= firstPtr
)
257 log("Many elements, this one is in the middle. Deleting it, linking front to back, and back to front.");
259 newPtr
->prev
->next
= newPtr
->next
;
260 newPtr
->next
->prev
= newPtr
->prev
;
263 else if (newPtr
== lastPtr
)
266 log("This was the last element. Deleting it, and pointing the tail to its previous element.");
268 lastPtr
= newPtr
->prev
;
272 else if (newPtr
== firstPtr
)
275 log("This was the first element. Deleting it, and pointing the head to its next element.");
277 firstPtr
= newPtr
->next
;
282 newPtr
= newPtr
->next
;