You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
3.1 KiB
191 lines
3.1 KiB
// |
|
// mxToolKit (c) 1999 by Mete Ciragan |
|
// |
|
// file: mxLinkedList.h |
|
// implementation: all |
|
// last modified: Mar 19 1999, Mete Ciragan |
|
// copyright: The programs and associated files contained in this |
|
// distribution were developed by Mete Ciragan. The programs |
|
// are not in the public domain, but they are freely |
|
// distributable without licensing fees. These programs are |
|
// provided without guarantee or warrantee expressed or |
|
// implied. |
|
// |
|
#ifndef INCLUDED_MXLINKEDLIST |
|
#define INCLUDED_MXLINKEDLIST |
|
|
|
|
|
|
|
typedef struct mxListNode_s |
|
{ |
|
void *d_data; |
|
struct mxListNode_s *d_next; |
|
struct mxListNode_s *d_prev; |
|
} mxListNode; |
|
|
|
|
|
|
|
class mxLinkedList |
|
{ |
|
mxListNode *d_head; |
|
mxListNode *d_tail; |
|
int d_nodeCount; |
|
|
|
// NOT IMPLEMENTED |
|
mxLinkedList (const mxLinkedList&); |
|
mxLinkedList& operator= (const mxLinkedList&); |
|
|
|
public: |
|
//CREATORS |
|
mxLinkedList () |
|
{ |
|
d_head = new mxListNode; |
|
d_tail = new mxListNode; |
|
d_head->d_data = 0; |
|
d_head->d_next = d_tail; |
|
d_head->d_prev = 0; |
|
d_tail->d_data = 0; |
|
d_tail->d_next = 0; |
|
d_tail->d_prev = d_head; |
|
d_nodeCount = 0; |
|
} |
|
|
|
~mxLinkedList () |
|
{ |
|
removeAll (); |
|
delete d_tail; |
|
delete d_head; |
|
} |
|
|
|
// MANIPULATORS |
|
void add (void *data) |
|
{ |
|
mxListNode *node = new mxListNode; |
|
node->d_data = data; |
|
d_tail->d_prev->d_next = node; |
|
node->d_prev = d_tail->d_prev; |
|
node->d_next = d_tail; |
|
d_tail->d_prev = node; |
|
++d_nodeCount; |
|
} |
|
|
|
void remove (void *data) |
|
{ |
|
mxListNode *node = d_head->d_next; |
|
while (node != d_tail) |
|
{ |
|
mxListNode *next = node->d_next; |
|
if (node->d_data == data) |
|
{ |
|
node->d_prev->d_next = node->d_next; |
|
node->d_next->d_prev = node->d_prev; |
|
delete node; |
|
} |
|
|
|
node = next; |
|
} |
|
--d_nodeCount; |
|
} |
|
|
|
void removeAll () |
|
{ |
|
mxListNode *node = d_head->d_next; |
|
|
|
while (node != d_tail) |
|
{ |
|
mxListNode *next = node->d_next; |
|
delete node; |
|
node = next; |
|
} |
|
|
|
d_head->d_next = d_tail; |
|
d_tail->d_prev = d_head; |
|
d_nodeCount = 0; |
|
} |
|
|
|
void setData (mxListNode *node, void *data) |
|
{ |
|
if (node) |
|
node->d_data = data; |
|
} |
|
|
|
// ACCESSORS |
|
void *getData (mxListNode *node) const |
|
{ |
|
if (node) |
|
return node->d_data; |
|
|
|
return 0; |
|
} |
|
|
|
mxListNode *getFirst () const |
|
{ |
|
if (d_head->d_next != d_tail) |
|
return d_head->d_next; |
|
|
|
return 0; |
|
} |
|
|
|
mxListNode *getNext (mxListNode *node) const |
|
{ |
|
if (node) |
|
{ |
|
if (node->d_next != d_tail) |
|
return node->d_next; |
|
|
|
return 0; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
mxListNode *getLast () const |
|
{ |
|
if (d_tail->d_prev != d_head) |
|
return d_tail->d_prev; |
|
|
|
return 0; |
|
} |
|
|
|
mxListNode *getPrev (mxListNode *node) const |
|
{ |
|
if (node) |
|
{ |
|
if (node->d_prev != d_head) |
|
return node->d_prev; |
|
|
|
return 0; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
mxListNode *at (int pos) const |
|
{ |
|
mxListNode *node = d_head->d_next; |
|
while (pos > 0 && node != d_tail) |
|
{ |
|
pos--; |
|
node = node->d_next; |
|
} |
|
|
|
if (node != d_tail) |
|
return node; |
|
|
|
return 0; |
|
} |
|
|
|
bool isEmpty () const |
|
{ |
|
return (d_head->d_next == d_tail); |
|
} |
|
|
|
int getNodeCount () const |
|
{ |
|
return d_nodeCount; |
|
} |
|
}; |
|
|
|
|
|
|
|
#endif // INCLUDED_MXLINKEDLIST
|