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
|