]>
jfr.im git - irc/gameservirc.git/blob - gameserv/list.h
18 ~List(); //deconstructor
19 T
*insertAtFront( const T
& );
20 T
*insertAtBack( T
*&);
21 T
*random(); // Returns a random element in the list
22 ListNode
<T
> *insertAtBack_RLN( T
*&);
23 bool removeFromFront( T
& );
24 bool removeFromBack( T
& );
26 ListNode
< T
> *remove( T
* );
33 ListNode
< T
> *Find( T
* );
34 ListNode
< T
> *First() { return firstPtr
; };
35 ListNode
< T
> *Last() { return lastPtr
; };
36 int elements
; // Number of elements in the list
38 ListNode
< T
> *firstPtr
;
39 ListNode
< T
> *lastPtr
;
41 ListNode
< T
> *getNewNode ( const T
& );
42 ListNode
< T
> *getNewNode ( T
& );
46 List
<T
>::List() : firstPtr (0), lastPtr (0) {elements
= 0;}
49 void List
<T
>::deleteNodes()
53 ListNode
<T
> *it
= firstPtr
, *tempPtr
;
77 int num
= rand() % elements
;
78 ListNode
<T
> *it
= firstPtr
;
79 for (int x
= 0; x
< num
; x
++)
87 T
*List
<T
>::insertAtFront( const T
&value
)
89 ListNode
<T
> *newPtr
= getNewNode ( value
);
93 firstPtr
= lastPtr
= newPtr
;
96 newPtr
->Next
= firstPtr
;
97 firstPtr
->prev
= newPtr
;
101 return firstPtr
->getData();
105 T
*List
<T
>::insertAtBack(T
*&value
)
107 ListNode
<T
> *newPtr
= getNewNode(*value
);
111 firstPtr
= lastPtr
= newPtr
;
115 newPtr
->prev
= lastPtr
;
116 lastPtr
->next
= newPtr
;
120 return lastPtr
->getData();
124 ListNode
<T
> *List
<T
>::insertAtBack_RLN(T
*&value
)
126 ListNode
<T
> *newPtr
= getNewNode(*value
);
130 firstPtr
= lastPtr
= newPtr
;
134 newPtr
->prev
= lastPtr
;
135 lastPtr
->next
= newPtr
;
144 bool List
<T
>::removeFromFront( T
&value
)
150 ListNode
<T
> *tempPtr
= firstPtr
;
152 if ( firstPtr
== lastPtr
)
153 firstPtr
= lastPtr
= 0;
155 firstPtr
= firstPtr
->next
;
157 value
= tempPtr
->getData();
165 bool List
<T
>::removeFromBack( T
&value
)
171 ListNode
<T
> *tempPtr
= lastPtr
;
173 if ( firstPtr
== lastPtr
)
174 lastPtr
= firstPtr
= 0;
176 lastPtr
= lastPtr
->prev
;
178 value
= tempPtr
->getData();
186 bool List
<T
>::isEmpty() const
187 { return firstPtr
== 0 && lastPtr
== 0; }
190 ListNode
<T
> *List
<T
>::getNewNode( const T
&value
)
192 ListNode
<T
> *ptr
= new ListNode
<T
>(value
);
200 ListNode
<T
> *List
<T
>::getNewNode( T
&value
)
202 ListNode
<T
> *ptr
= new ListNode
<T
>(value
);
210 ListNode
<T
> *List
<T
>::Find( T
*value
)
212 if (isEmpty()) {return NULL
;}
214 ListNode
<T
> *currentPtr
;
215 currentPtr
= firstPtr
;
218 cout
<< currentPtr
->getData() << endl
<< value
<< endl
;
219 if (currentPtr
->getData() == value
)
221 currentPtr
= currentPtr
->Next();
228 void List
<T
>::print() const
232 cout
<< "Empty list" << endl
;
236 ListNode
<T
> *currentPtr
;
237 currentPtr
= firstPtr
;
241 cout << "aClient: " << *currentPtr->getData() << flush;
243 if (currentPtr->getData()->stats)
244 cout << " Player Name: " << currentPtr->getData()->stats->name
245 << " Password: " << currentPtr->getData()->stats->password << flush;
249 cout << currentPtr->getData()->getString() << endl;
250 currentPtr = currentPtr->next;
253 dat
= currentPtr
->getData();
254 log("name: %s", dat
->name
);
255 log("weapon: %s", dat
->weapon
);
256 log("death: %s", dat
->death
);
257 log("strength: %d", dat
->strength
);
258 log("exp: %ld", dat
->exp
);
259 log("gold: %ld", dat
->gold
);
260 log("maxhp: %d", dat
->maxhp
);
261 log("hp: %d", dat
->hp
);
262 currentPtr
= currentPtr
->next
;
268 bool List
<T
>::del(T
*remPtr
)
270 ListNode
<T
> *removed
= remove( remPtr
);
280 ListNode
<T
> *List
<T
>::remove(T
*remPtr
)
282 ListNode
<T
> *newPtr
= firstPtr
;
290 testPtr
= newPtr
->getData();
291 if (testPtr
== remPtr
)
293 if (firstPtr
== lastPtr
)
296 log("One Element. Deleting it");
298 firstPtr
= lastPtr
= NULL
;
301 else if (newPtr
!= lastPtr
&& newPtr
!= firstPtr
)
304 log("Many elements, this one is in the middle. Deleting it, linking front to back, and back to front.");
306 newPtr
->prev
->next
= newPtr
->next
;
307 newPtr
->next
->prev
= newPtr
->prev
;
310 else if (newPtr
== lastPtr
)
313 log("This was the last element. Deleting it, and pointing the tail to its previous element.");
315 lastPtr
= newPtr
->prev
;
319 else if (newPtr
== firstPtr
)
322 log("This was the first element. Deleting it, and pointing the head to its next element.");
324 firstPtr
= newPtr
->next
;
330 newPtr
= newPtr
->next
;