GenericList.cpp

From Giona

(Difference between revisions)
 
(One intermediate revision not shown)
Line 1: Line 1:
<pre>
<pre>
 +
 +
/****************************************************************************
/****************************************************************************
  *This class represents a generic linked list.
  *This class represents a generic linked list.
-
  *
+
  * --------------------------------------------------------------------------
-
*
+
  *Author: Rosario Marino
  *Author: Rosario Marino
  ***************************************************************************/
  ***************************************************************************/
Line 14: Line 15:
GenericList::GenericList()
GenericList::GenericList()
{
{
 +
Debug::debug("GenericList::GenericList()");
     this->head = NULL;
     this->head = NULL;
     this->length = 0;
     this->length = 0;
-
     this->lastError = GENERIC_LIST_ERR_NO;
+
     this->lastError = ERROR_NO;
}
}
   
   
Line 24: Line 26:
GenericList::~GenericList()
GenericList::~GenericList()
{
{
 +
Debug::debug("GenericList::~GenericList()");
     deleteList();
     deleteList();
}
}
Line 33: Line 36:
bool GenericList::addNode(GenericListNode* node)
bool GenericList::addNode(GenericListNode* node)
{
{
 +
Debug::debug("bool GenericList::addNode(GenericListNode* node)");
     if(node == NULL)
     if(node == NULL)
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_NULL_NODE;
+
    Debug::debugError("bool GenericList::addNode(GenericListNode* node)", "ERROR_NULL_NODE", "parameter: node");
 +
         this->lastError = ERROR_NULL_NODE;
         return false;
         return false;
     }
     }
Line 55: Line 60:
  * Returns FALSE in case of error, TRUE otherwise
  * Returns FALSE in case of error, TRUE otherwise
  */
  */
-
 
bool GenericList::inHeadNode(GenericListNode* node)
bool GenericList::inHeadNode(GenericListNode* node)
{
{
 +
Debug::debug("bool GenericList::inHeadNode(GenericListNode* node)");
     if(node == NULL)
     if(node == NULL)
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_NULL_NODE;
+
    Debug::debugError("bool GenericList::inHeadNode(GenericListNode* node)", "ERROR_NULL_NODE", "parameter: node");
 +
         this->lastError = ERROR_NULL_NODE;
         return false;
         return false;
     }
     }
Line 74: Line 80:
GenericListNode *GenericList::getHead()
GenericListNode *GenericList::getHead()
{
{
 +
Debug::debug("GenericListNode *GenericList::getHead()");
     return this->head;
     return this->head;
}
}
Line 82: Line 89:
GenericListNode *GenericList::extractHead()
GenericListNode *GenericList::extractHead()
{
{
 +
Debug::debug("GenericListNode *GenericList::extractHead()");
     if(this->head == NULL)
     if(this->head == NULL)
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_EMPTY_LIST;
+
    Debug::debugError("GenericListNode *GenericList::extractHead()", "ERROR_EMPTY_LIST", EMPTY_STRING);
 +
         this->lastError = ERROR_EMPTY_LIST;
         return NULL;
         return NULL;
     }
     }
Line 98: Line 107:
GenericListNode* GenericList::extractNode(int idx)
GenericListNode* GenericList::extractNode(int idx)
{
{
 +
Debug::debug("GenericListNode* GenericList::extractNode(int idx)");
     if((idx<0)||(idx>length-1))
     if((idx<0)||(idx>length-1))
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_OUT_OF_RANGE_INDEX;
+
    Debug::debugError("GenericListNode* GenericList::extractNode(int idx)", "ERROR_OUT_OF_RANGE_INDEX", "parameter: idx");
 +
         this->lastError = ERROR_OUT_OF_RANGE_INDEX;
         return NULL;
         return NULL;
     }
     }
Line 120: Line 131:
GenericListNode* GenericList::viewNode(int idx)
GenericListNode* GenericList::viewNode(int idx)
{
{
 +
Debug::debug("GenericListNode* GenericList::viewNode(int idx)");
     if((idx<0)||(idx>length-1))
     if((idx<0)||(idx>length-1))
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_OUT_OF_RANGE_INDEX;
+
    Debug::debugError("GenericListNode* GenericList::viewNode(int idx)", "ERROR_OUT_OF_RANGE_INDEX", "parameter: idx");
 +
         this->lastError = ERROR_OUT_OF_RANGE_INDEX;
         return NULL;
         return NULL;
     }
     }
Line 139: Line 152:
bool GenericList::deleteNode(GenericListNode *node)
bool GenericList::deleteNode(GenericListNode *node)
{
{
 +
Debug::debug("bool GenericList::deleteNode(GenericListNode *node)");
     if(this->head == NULL)
     if(this->head == NULL)
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_EMPTY_LIST;
+
    Debug::debugError("bool GenericList::deleteNode(GenericListNode *node)", "ERROR_EMPTY_LIST", EMPTY_STRING);
 +
         this->lastError = ERROR_EMPTY_LIST;
         return false;
         return false;
     }
     }
     if(node == NULL)
     if(node == NULL)
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_NULL_NODE;
+
    Debug::debugError("bool GenericList::deleteNode(GenericListNode *node)", "ERROR_NULL_NODE", "parameter: node");
 +
         this->lastError = ERROR_NULL_NODE;
         return false;
         return false;
     }
     }
Line 161: Line 177:
     if(tmp->getNext() == NULL)
     if(tmp->getNext() == NULL)
     {
     {
-
         this->lastError = GENERIC_LIST_ERR_NODE_NOT_FOUND;
+
    Debug::debugError("bool GenericList::deleteNode(GenericListNode *node)", "ERROR_NODE_NOT_FOUND", "parameter: node");
 +
         this->lastError = ERROR_NODE_NOT_FOUND;
         return false;
         return false;
     }
     }
Line 176: Line 193:
int GenericList::getLastError()
int GenericList::getLastError()
{
{
 +
Debug::debug("int GenericList::getLastError()");
     return this->lastError;
     return this->lastError;
}
}
Line 184: Line 202:
int GenericList::getLength()
int GenericList::getLength()
{
{
 +
Debug::debug("int GenericList::getLength()");
     return this->length;
     return this->length;
}
}
Line 192: Line 211:
void GenericList::deleteList()
void GenericList::deleteList()
{
{
 +
Debug::debug("void GenericList::deleteList()");
     GenericListNode * tmp = this->head;
     GenericListNode * tmp = this->head;
     while(tmp)
     while(tmp)
Line 200: Line 220:
     }
     }
}
}
-
 
</pre>
</pre>
[[Il database Object Oriented Generico|BACK]]
[[Il database Object Oriented Generico|BACK]]
[[Category:Codice Sorgente]]
[[Category:Codice Sorgente]]

Current revision as of 17:40, 17 December 2007



/****************************************************************************
 *This class represents a generic linked list.
 * --------------------------------------------------------------------------
 *Author: Rosario Marino
 ***************************************************************************/

#include "GenericList.h"

/*
 * Constructor
 */
GenericList::GenericList()
{
	Debug::debug("GenericList::GenericList()");
    this->head = NULL;
    this->length = 0;
    this->lastError = ERROR_NO;
}
 
/*
 * Destructor
 */
GenericList::~GenericList()
{
	Debug::debug("GenericList::~GenericList()");
    deleteList();
}

/*
 * Adds a node at the end of the list
 * Returns FALSE in case of error, TRUE otherwise
 */
bool GenericList::addNode(GenericListNode* node)
{
	Debug::debug("bool GenericList::addNode(GenericListNode* node)");
    if(node == NULL)
    {
    	Debug::debugError("bool GenericList::addNode(GenericListNode* node)", "ERROR_NULL_NODE", "parameter: node");
        this->lastError = ERROR_NULL_NODE;
        return false;
    }
    this->length++;
    if(this->head == NULL)
    {
        head=node;
        return true;
    }
    GenericListNode *tmp = this->head;
    while(tmp->getNext() != NULL)
        tmp = tmp->getNext();
    tmp->setNext(node);
    return true;
}

/*
 * Adds a node on the head of the list
 * Returns FALSE in case of error, TRUE otherwise
 */
bool GenericList::inHeadNode(GenericListNode* node)
{
	Debug::debug("bool GenericList::inHeadNode(GenericListNode* node)");
    if(node == NULL)
    {
    	Debug::debugError("bool GenericList::inHeadNode(GenericListNode* node)", "ERROR_NULL_NODE", "parameter: node");
        this->lastError = ERROR_NULL_NODE;
        return false;
    }
    node->setNext(this->getHead());
    this->head = node;
    this->length++;
    return true;    
}

/*
 * returns the head node of the list
 */
GenericListNode *GenericList::getHead()
{
	Debug::debug("GenericListNode *GenericList::getHead()");
    return this->head;
}

/*
 * extracts and returns the head node of the list
 */
GenericListNode *GenericList::extractHead()
{
	Debug::debug("GenericListNode *GenericList::extractHead()");
    if(this->head == NULL)
    {
    	Debug::debugError("GenericListNode *GenericList::extractHead()", "ERROR_EMPTY_LIST", EMPTY_STRING);
        this->lastError = ERROR_EMPTY_LIST;
        return NULL;
    }
    GenericListNode* node = this->head;
    this->head =node->getNext();
    this->length--;
    return node;
}

/*
 * extracts the node at position idx and returns it
 */
GenericListNode* GenericList::extractNode(int idx)
{
	Debug::debug("GenericListNode* GenericList::extractNode(int idx)");
    if((idx<0)||(idx>length-1))
    {
    	Debug::debugError("GenericListNode* GenericList::extractNode(int idx)", "ERROR_OUT_OF_RANGE_INDEX", "parameter: idx");
        this->lastError = ERROR_OUT_OF_RANGE_INDEX;
        return NULL;
    }
    if(idx==0)
        return(this->extractHead());
    GenericListNode * tmp=this->getHead();
    for(int i=1; i<idx; i++)
        tmp=tmp->getNext();
    GenericListNode* node= tmp->getNext();
    tmp->setNext(node->getNext());
    this->length--;
    return node;
}


/*
 * returns the node at position idx without extracting it from the list
 */
GenericListNode* GenericList::viewNode(int idx)
{
	Debug::debug("GenericListNode* GenericList::viewNode(int idx)");
    if((idx<0)||(idx>length-1))
    {
    	Debug::debugError("GenericListNode* GenericList::viewNode(int idx)", "ERROR_OUT_OF_RANGE_INDEX", "parameter: idx");
        this->lastError = ERROR_OUT_OF_RANGE_INDEX;
        return NULL;
    }
    if(idx==0)
        return(this->getHead());
    GenericListNode * tmp=this->getHead();
    for(int i=1; i<=idx; i++)
        tmp=tmp->getNext();
    return tmp;
}

/*
 * Deletes the node from the list. Returns FALSE in case
 * of error, TRUE otherwise
 */ 
bool GenericList::deleteNode(GenericListNode *node)
{
	Debug::debug("bool GenericList::deleteNode(GenericListNode *node)");
    if(this->head == NULL)
    {
    	Debug::debugError("bool GenericList::deleteNode(GenericListNode *node)", "ERROR_EMPTY_LIST", EMPTY_STRING);
        this->lastError = ERROR_EMPTY_LIST;
        return false;
    }
    if(node == NULL)
    {
    	Debug::debugError("bool GenericList::deleteNode(GenericListNode *node)", "ERROR_NULL_NODE", "parameter: node");
        this->lastError = ERROR_NULL_NODE;
        return false;
    }
    GenericListNode *tmp = this->head;
    if (tmp == node)
    {
        this->head = tmp->getNext();
        delete(tmp);
        this->length --;
        return true;
    }
    while((tmp->getNext() !=NULL) && (tmp->getNext() != node))
        tmp = tmp->getNext();
    if(tmp->getNext() == NULL)
    {
    	Debug::debugError("bool GenericList::deleteNode(GenericListNode *node)", "ERROR_NODE_NOT_FOUND", "parameter: node");
        this->lastError = ERROR_NODE_NOT_FOUND;
        return false;
    }
    GenericListNode* delNode = tmp->getNext();
    tmp->setNext(delNode->getNext());
    delete(delNode);
    this->length--;
    return true;
}

/*
 * Returns last error code
 */
int GenericList::getLastError()
{
	Debug::debug("int GenericList::getLastError()");
    return this->lastError;
}

/*
 * Returns the number of list nodes
 */
int GenericList::getLength()
{
	Debug::debug("int GenericList::getLength()");
    return this->length;
}

/*
 * (Private) deletes all list nodes 
 */
void GenericList::deleteList()
{
	Debug::debug("void GenericList::deleteList()");
    GenericListNode * tmp = this->head;
    while(tmp)
    {
        GenericListNode* tmpNext=tmp->getNext();
        delete(tmp);
        tmp = tmpNext;
    }
}

BACK

Personal tools