]>
jfr.im git - irc/gameservirc.git/blob - gameserv/list.h
14 extern void log(const char *fmt
, ...);
20 ~List(); //deconstructor
21 T
*insertAtFront( const T
& );
22 T
*insertAtBack( T
*&);
23 T
*random(); // Returns a random element in the list
24 ListNode
<T
> *insertAtBack_RLN( T
*&);
25 bool removeFromFront( T
& );
26 bool removeFromBack( T
& );
28 ListNode
< T
> *remove( T
* );
35 ListNode
< T
> *Find( T
* );
36 ListNode
< T
> *First() { return firstPtr
; };
37 ListNode
< T
> *Last() { return lastPtr
; };
38 int elements
; // Number of elements in the list
40 ListNode
< T
> *firstPtr
;
41 ListNode
< T
> *lastPtr
;
43 ListNode
< T
> *getNewNode ( const T
& );
44 ListNode
< T
> *getNewNode ( T
& );
48 List
<T
>::List() : firstPtr (0), lastPtr (0) {elements
= 0;}
51 void List
<T
>::deleteNodes()
55 ListNode
<T
> *it
= firstPtr
, *tempPtr
;
79 int num
= rand() % elements
;
80 ListNode
<T
> *it
= firstPtr
;
81 for (int x
= 0; x
< num
; x
++)
89 T
*List
<T
>::insertAtFront( const T
&value
)
91 ListNode
<T
> *newPtr
= getNewNode ( value
);
95 firstPtr
= lastPtr
= newPtr
;
98 newPtr
->Next
= firstPtr
;
99 firstPtr
->prev
= newPtr
;
103 return firstPtr
->getData();
107 T
*List
<T
>::insertAtBack(T
*&value
)
109 ListNode
<T
> *newPtr
= getNewNode(*value
);
113 firstPtr
= lastPtr
= newPtr
;
117 newPtr
->prev
= lastPtr
;
118 lastPtr
->next
= newPtr
;
122 return lastPtr
->getData();
126 ListNode
<T
> *List
<T
>::insertAtBack_RLN(T
*&value
)
128 ListNode
<T
> *newPtr
= getNewNode(*value
);
132 firstPtr
= lastPtr
= newPtr
;
136 newPtr
->prev
= lastPtr
;
137 lastPtr
->next
= newPtr
;
146 bool List
<T
>::removeFromFront( T
&value
)
152 ListNode
<T
> *tempPtr
= firstPtr
;
154 if ( firstPtr
== lastPtr
)
155 firstPtr
= lastPtr
= 0;
157 firstPtr
= firstPtr
->next
;
159 value
= tempPtr
->getData();
167 bool List
<T
>::removeFromBack( T
&value
)
173 ListNode
<T
> *tempPtr
= lastPtr
;
175 if ( firstPtr
== lastPtr
)
176 lastPtr
= firstPtr
= 0;
178 lastPtr
= lastPtr
->prev
;
180 value
= tempPtr
->getData();
188 bool List
<T
>::isEmpty() const
189 { return firstPtr
== 0 && lastPtr
== 0; }
192 ListNode
<T
> *List
<T
>::getNewNode( const T
&value
)
194 ListNode
<T
> *ptr
= new ListNode
<T
>(value
);
202 ListNode
<T
> *List
<T
>::getNewNode( T
&value
)
204 ListNode
<T
> *ptr
= new ListNode
<T
>(value
);
212 ListNode
<T
> *List
<T
>::Find( T
*value
)
214 if (isEmpty()) {return NULL
;}
216 ListNode
<T
> *currentPtr
;
217 currentPtr
= firstPtr
;
220 cout
<< currentPtr
->getData() << endl
<< value
<< endl
;
221 if (currentPtr
->getData() == value
)
223 currentPtr
= currentPtr
->Next();
230 void List
<T
>::print() const
234 cout
<< "Empty list" << endl
;
238 ListNode
<T
> *currentPtr
;
239 currentPtr
= firstPtr
;
243 cout << "aClient: " << *currentPtr->getData() << flush;
245 if (currentPtr->getData()->stats)
246 cout << " Player Name: " << currentPtr->getData()->stats->name
247 << " Password: " << currentPtr->getData()->stats->password << flush;
251 cout << currentPtr->getData()->getString() << endl;
252 currentPtr = currentPtr->next;
256 dat = currentPtr->getData();
257 log("name: %s", dat->name.c_str());
258 log("weapon: %s", dat->weapon.c_str());
259 log("death: %s", dat->death.c_str());
260 log("strength: %d", dat->strength);
261 log("exp: %ld", dat->exp);
262 log("gold: %ld", dat->gold);
263 log("maxhp: %d", dat->maxhp);
264 log("hp: %d", dat->hp);
265 currentPtr = currentPtr->next;
272 bool List
<T
>::del(T
*remPtr
)
274 ListNode
<T
> *removed
= remove( remPtr
);
284 ListNode
<T
> *List
<T
>::remove(T
*remPtr
)
286 ListNode
<T
> *newPtr
= firstPtr
;
294 testPtr
= newPtr
->getData();
295 if (testPtr
== remPtr
)
297 if (firstPtr
== lastPtr
)
300 log("One Element. Deleting it");
302 firstPtr
= lastPtr
= NULL
;
305 else if (newPtr
!= lastPtr
&& newPtr
!= firstPtr
)
308 log("Many elements, this one is in the middle. Deleting it, linking front to back, and back to front.");
310 newPtr
->prev
->next
= newPtr
->next
;
311 newPtr
->next
->prev
= newPtr
->prev
;
314 else if (newPtr
== lastPtr
)
317 log("This was the last element. Deleting it, and pointing the tail to its previous element.");
319 lastPtr
= newPtr
->prev
;
323 else if (newPtr
== firstPtr
)
326 log("This was the first element. Deleting it, and pointing the head to its next element.");
328 firstPtr
= newPtr
->next
;
334 newPtr
= newPtr
->next
;