]>
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
* );
32 ListNode
< T
> *Find( T
* );
33 ListNode
< T
> *First() { return firstPtr
; };
34 ListNode
< T
> *Last() { return lastPtr
; };
36 ListNode
< T
> *firstPtr
;
37 ListNode
< T
> *lastPtr
;
39 ListNode
< T
> *getNewNode ( const T
& );
43 List
<T
>::List() : firstPtr (0), lastPtr (0) {}
51 log("Destroying Nodes");
54 ListNode
<T
> *currentPtr
= firstPtr
, *tempPtr
;
59 currentPtr
= currentPtr
->Next();
62 log("Deleting Memory address: %s", tempPtr
->getData());
68 log("All Nodes destroyed");
74 T
*List
<T
>::insertAtFront( const T
&value
)
76 ListNode
<T
> *newPtr
= getNewNode ( value
);
80 firstPtr
= lastPtr
= newPtr
;
83 newPtr
->Next
= firstPtr
;
84 firstPtr
->prev
= newPtr
;
87 return firstPtr
->getData();
91 T
*List
<T
>::insertAtBack(T
*&value
)
93 ListNode
<T
> *newPtr
= getNewNode(*value
);
97 firstPtr
= lastPtr
= newPtr
;
101 newPtr
->prev
= lastPtr
;
102 lastPtr
->next
= newPtr
;
105 return lastPtr
->getData();
109 ListNode
<T
> *List
<T
>::insertAtBack_RLN(T
*&value
)
111 ListNode
<T
> *newPtr
= getNewNode(*value
);
115 firstPtr
= lastPtr
= newPtr
;
119 newPtr
->prev
= lastPtr
;
120 lastPtr
->next
= newPtr
;
128 bool List
<T
>::removeFromFront( T
&value
)
134 ListNode
<T
> *tempPtr
= firstPtr
;
136 if ( firstPtr
== lastPtr
)
137 firstPtr
= lastPtr
= 0;
139 firstPtr
= firstPtr
->next
;
141 value
= tempPtr
->getData();
148 bool List
<T
>::removeFromBack( T
&value
)
154 ListNode
<T
> *tempPtr
= lastPtr
;
156 if ( firstPtr
== lastPtr
)
157 lastPtr
= firstPtr
= 0;
159 lastPtr
= lastPtr
->prev
;
161 value
= tempPtr
->getData();
169 bool List
<T
>::isEmpty() const
170 { return firstPtr
== 0 && lastPtr
== 0; }
173 ListNode
<T
> *List
<T
>::getNewNode( const T
&value
)
175 ListNode
<T
> *ptr
= new ListNode
<T
>(value
);
182 ListNode
<T
> *List
<T
>::Find( T
*value
)
184 if (isEmpty()) {return NULL
;}
186 ListNode
<T
> *currentPtr
;
187 currentPtr
= firstPtr
;
190 cout
<< currentPtr
->getData() << endl
<< value
<< endl
;
191 if (currentPtr
->getData() == value
)
193 currentPtr
= currentPtr
->Next();
200 void List
<T
>::print() const
204 cout
<< "Empty list" << endl
;
208 ListNode
<T
> *currentPtr
;
209 currentPtr
= firstPtr
;
213 cout << "aClient: " << *currentPtr->getData() << flush;
215 if (currentPtr->getData()->stats)
216 cout << " Player Name: " << currentPtr->getData()->stats->name
217 << " Password: " << currentPtr->getData()->stats->password << flush;
220 cout
<< currentPtr
->getData()->getString() << endl
;
221 currentPtr
= currentPtr
->next
;
227 bool List
<T
>::del(T
*remPtr
)
229 ListNode
<T
> *removed
= remove( remPtr
);
239 ListNode
<T
> *List
<T
>::remove(T
*remPtr
)
241 ListNode
<T
> *newPtr
= firstPtr
;
249 testPtr
= newPtr
->getData();
250 if (testPtr
== remPtr
)
252 if (firstPtr
== lastPtr
)
255 log("One Element. Deleting it");
257 firstPtr
= lastPtr
= NULL
;
260 else if (newPtr
!= lastPtr
&& newPtr
!= firstPtr
)
263 log("Many elements, this one is in the middle. Deleting it, linking front to back, and back to front.");
265 newPtr
->prev
->next
= newPtr
->next
;
266 newPtr
->next
->prev
= newPtr
->prev
;
269 else if (newPtr
== lastPtr
)
272 log("This was the last element. Deleting it, and pointing the tail to its previous element.");
274 lastPtr
= newPtr
->prev
;
278 else if (newPtr
== firstPtr
)
281 log("This was the first element. Deleting it, and pointing the head to its next element.");
283 firstPtr
= newPtr
->next
;
288 newPtr
= newPtr
->next
;