00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00025
00026
#ifndef __T_LIST_H__
00027
#define __T_LIST_H__
00028
00029
#ifndef NULL
00030
#define NULL 0
00031
#endif // NULL
00032
00033
namespace tutk
00034 {
00035
00039
template <
class T>
00040 class NODE
00041 {
00042
public:
00047
NODE(
void);
00048
00052
~NODE();
00053
00056 NODE *nextNodePtr;
00059 NODE *previousNodePtr;
00062 T data;
00063 };
00064
00065
template <
class T>
00066 NODE<T>::NODE(
void)
00067 {
00068
nextNodePtr =
previousNodePtr = NULL;
00069
data = T();
00070 }
00071
00072
template <
class T>
00073 NODE<T>::~NODE() { ; }
00074
00077
template <
class T>
00078 class List
00079 {
00080
public:
00084
List(
void);
00085
00103
List(
const List &l);
00104
00107
~List();
00108
00111
00112
00115
void append(T node);
00116
00119
void push(T node);
00120
00126
void pop(
void);
00127
00130
00131
00138
void destroy(
void);
00139
00143
void refresh(
void);
00144
00148 T
getLastNode(
bool& validity);
00149
00156 T
getNode(
bool& validity);
00157
00161 T*
getPointerToNodeItem(
void);
00162
00165
int getSize(
void);
00166
00169 T*
getPointerToLastItem(
void);
00170
00174
void operator=(
const List &l);
00175
00176
private:
00177
int *size;
00178
int *refCount;
00179
NODE<T> *firstNodePtr, *lastNodePtr;
00180
NODE<T> *currentNodePtr;
00181 };
00182
00183
00184
00185
00186
template <
class T>
00187 List<T>::List(
void)
00188 {
00189 firstNodePtr = lastNodePtr = currentNodePtr = NULL;
00190
00191 size =
new int; refCount =
new int;
00192 *size = 0; *refCount = 1;
00193 }
00194
00195
template <
class T>
00196 List<T>::List(
const List &l)
00197 : firstNodePtr(l.firstNodePtr), currentNodePtr(l.currentNodePtr),
00198 lastNodePtr(l.lastNodePtr), size(l.size), refCount(l.refCount)
00199 {
00200 (*refCount)++;
00201 }
00202
00203
template <
class T>
00204 List<T>::~List()
00205 {
00206
if (*refCount <= 1)
00207 {
00208
destroy();
00209
delete size;
delete refCount;
00210 }
00211
else
00212 (*refCount)--;
00213 }
00214
00215
template <
class T>
00216 void List<T>::append(T node)
00217 {
00218
NODE<T> *newNodePtr =
new NODE<T>();
00219
00220
if (*size == 0)
00221 firstNodePtr = currentNodePtr = newNodePtr;
00222
else
00223 {
00224 newNodePtr->
previousNodePtr = lastNodePtr;
00225 lastNodePtr->nextNodePtr = newNodePtr;
00226 }
00227
00228 lastNodePtr = newNodePtr;
00229 lastNodePtr->data = T(node);
00230 (*size)++;
00231
00232
return;
00233 }
00234
00235
template <
class T>
00236 void List<T>::refresh(
void)
00237 {
00238 currentNodePtr = firstNodePtr;
00239
return;
00240 }
00241
00242
template <
class T>
00243 T
List<T>::getNode(
bool& validity)
00244 {
00245
if (*size == 0 || currentNodePtr == NULL)
00246 {
00247 T dummy;
00248 validity =
false;
00249
return dummy;
00250 }
00251
else
00252 {
00253 T nodeData = T(currentNodePtr->data);
00254 currentNodePtr = currentNodePtr->nextNodePtr;
00255 validity =
true;
00256
return nodeData;
00257 }
00258 }
00259
00260
template <
class T>
00261 T*
List<T>::getPointerToNodeItem(
void)
00262 {
00263
if (*size == 0 || currentNodePtr == NULL)
00264
return NULL;
00265
else
00266 {
00267 T *dataPtr = &(currentNodePtr->data);
00268
return dataPtr;
00269 }
00270 }
00271
00272
template <
class T>
00273 void List<T>::pop(
void)
00274 {
00275
if (*size == 0)
00276
return;
00277
else if (*size == 1)
00278 {
00279
delete firstNodePtr;
00280 lastNodePtr = firstNodePtr = currentNodePtr = NULL;
00281 (*size)--;
00282
00283
return;
00284 }
00285
00286 lastNodePtr = lastNodePtr->previousNodePtr;
00287
delete lastNodePtr->nextNodePtr;
00288 lastNodePtr->nextNodePtr = NULL;
00289 (*size)--;
00290
00291
return;
00292 }
00293
00294
template <
class T>
00295 void List<T>::push(T node)
00296 {
00297
append(node);
00298
return;
00299 }
00300
00301
template <
class T>
00302 void List<T>::destroy(
void)
00303 {
00304
int s = *size;
00305
00306
for (
int i = 1; i <= s; i++)
00307
pop();
00308
00309
return;
00310 }
00311
00312
template <
class T>
00313 T
List<T>::getLastNode(
bool& validity)
00314 {
00315
if (*size == 0)
00316 {
00317 T dummy;
00318 validity =
false;
00319
return dummy;
00320 }
00321
else
00322 {
00323 T lastNodeData = T(lastNodePtr->data);
00324 validity =
true;
00325
return lastNodeData;
00326 }
00327 }
00328
00329
template <
class T>
00330 T*
List<T>::getPointerToLastItem(
void)
00331 {
00332
if (lastNodePtr == NULL)
00333
return NULL;
00334
else
00335
return &(lastNodePtr->data);
00336 }
00337
00338
template <
class T>
00339 int List<T>::getSize(
void)
00340 {
00341
return *size;
00342 }
00343
00344
template <
class T>
00345 void List<T>::operator=(
const List &l)
00346 {
00347
if (*refCount <= 1)
00348 {
00349
destroy();
00350
delete size;
delete refCount;
00351
00352 firstNodePtr = l.
firstNodePtr;
00353 currentNodePtr = l.
currentNodePtr;
00354 lastNodePtr = l.
lastNodePtr;
00355 size = l.
size;
00356 refCount = l.
refCount;
00357 (*refCount)++;
00358 }
00359
else
00360 {
00361 (*refCount)--;
00362
00363 firstNodePtr = l.
firstNodePtr;
00364 currentNodePtr = l.
currentNodePtr;
00365 lastNodePtr = l.
lastNodePtr;
00366 size = l.
size;
00367 refCount = l.
refCount;
00368 (*refCount)++;
00369 }
00370
00371
return;
00372 }
00373
00374 }
00375
00376
#endif // __T_LIST_H__
00377