GenericList.cpp
From Giona
(Difference between revisions)
Line 1: | Line 1: | ||
<pre> | <pre> | ||
- | + | /**************************************************************************** | |
- | + | *This class represents a generic linked list. | |
- | + | * | |
+ | * | ||
+ | *Author: Rosario Marino | ||
+ | ***************************************************************************/ | ||
+ | |||
#include "GenericList.h" | #include "GenericList.h" | ||
Line 10: | Line 14: | ||
GenericList::GenericList() | GenericList::GenericList() | ||
{ | { | ||
- | + | this->head = NULL; | |
- | + | this->length = 0; | |
- | + | this->lastError = GENERIC_LIST_ERR_NO; | |
} | } | ||
- | + | ||
/* | /* | ||
* Destructor | * Destructor | ||
Line 20: | Line 24: | ||
GenericList::~GenericList() | GenericList::~GenericList() | ||
{ | { | ||
- | + | deleteList(); | |
} | } | ||
/* | /* | ||
- | * Adds a node | + | * Adds a node at the end of the list |
* Returns FALSE in case of error, TRUE otherwise | * Returns FALSE in case of error, TRUE otherwise | ||
*/ | */ | ||
- | + | bool GenericList::addNode(GenericListNode* node) | |
{ | { | ||
- | + | if(node == NULL) | |
- | + | { | |
- | + | this->lastError = GENERIC_LIST_ERR_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) | ||
+ | { | ||
+ | if(node == NULL) | ||
+ | { | ||
+ | this->lastError = GENERIC_LIST_ERR_NULL_NODE; | ||
+ | return false; | ||
+ | } | ||
+ | node->setNext(this->getHead()); | ||
+ | this->head = node; | ||
+ | this->length++; | ||
+ | return true; | ||
} | } | ||
Line 52: | Line 74: | ||
GenericListNode *GenericList::getHead() | GenericListNode *GenericList::getHead() | ||
{ | { | ||
- | + | return this->head; | |
+ | } | ||
+ | |||
+ | /* | ||
+ | * extracts and returns the head node of the list | ||
+ | */ | ||
+ | GenericListNode *GenericList::extractHead() | ||
+ | { | ||
+ | if(this->head == NULL) | ||
+ | { | ||
+ | this->lastError = GENERIC_LIST_ERR_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) | ||
+ | { | ||
+ | if((idx<0)||(idx>length-1)) | ||
+ | { | ||
+ | this->lastError = GENERIC_LIST_ERR_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) | ||
+ | { | ||
+ | if((idx<0)||(idx>length-1)) | ||
+ | { | ||
+ | this->lastError = GENERIC_LIST_ERR_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; | ||
} | } | ||
Line 59: | Line 137: | ||
* of error, TRUE otherwise | * of error, TRUE otherwise | ||
*/ | */ | ||
- | + | bool GenericList::deleteNode(GenericListNode *node) | |
{ | { | ||
- | + | if(this->head == NULL) | |
- | + | { | |
- | + | this->lastError = GENERIC_LIST_ERR_EMPTY_LIST; | |
- | + | return false; | |
- | + | } | |
- | + | if(node == NULL) | |
- | + | { | |
- | + | this->lastError = GENERIC_LIST_ERR_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) | |
- | + | { | |
- | + | this->lastError = GENERIC_LIST_ERR_NODE_NOT_FOUND; | |
- | + | return false; | |
- | + | } | |
- | + | GenericListNode* delNode = tmp->getNext(); | |
- | + | tmp->setNext(delNode->getNext()); | |
- | + | delete(delNode); | |
- | + | this->length--; | |
- | + | return true; | |
} | } | ||
Line 98: | Line 176: | ||
int GenericList::getLastError() | int GenericList::getLastError() | ||
{ | { | ||
- | + | return this->lastError; | |
} | } | ||
Line 106: | Line 184: | ||
int GenericList::getLength() | int GenericList::getLength() | ||
{ | { | ||
- | + | return this->length; | |
} | } | ||
Line 114: | Line 192: | ||
void GenericList::deleteList() | void GenericList::deleteList() | ||
{ | { | ||
- | + | GenericListNode * tmp = this->head; | |
- | + | while(tmp) | |
- | + | { | |
- | + | GenericListNode* tmpNext=tmp->getNext(); | |
- | + | delete(tmp); | |
- | + | tmp = tmpNext; | |
- | + | } | |
} | } | ||
- | |||
+ | </pre> | ||
+ | [[Il database Object Oriented Generico|BACK]] | ||
[[Category:Codice Sorgente]] | [[Category:Codice Sorgente]] |
Revision as of 11:39, 13 December 2007
/**************************************************************************** *This class represents a generic linked list. * * *Author: Rosario Marino ***************************************************************************/ #include "GenericList.h" /* * Constructor */ GenericList::GenericList() { this->head = NULL; this->length = 0; this->lastError = GENERIC_LIST_ERR_NO; } /* * Destructor */ 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) { if(node == NULL) { this->lastError = GENERIC_LIST_ERR_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) { if(node == NULL) { this->lastError = GENERIC_LIST_ERR_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() { return this->head; } /* * extracts and returns the head node of the list */ GenericListNode *GenericList::extractHead() { if(this->head == NULL) { this->lastError = GENERIC_LIST_ERR_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) { if((idx<0)||(idx>length-1)) { this->lastError = GENERIC_LIST_ERR_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) { if((idx<0)||(idx>length-1)) { this->lastError = GENERIC_LIST_ERR_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) { if(this->head == NULL) { this->lastError = GENERIC_LIST_ERR_EMPTY_LIST; return false; } if(node == NULL) { this->lastError = GENERIC_LIST_ERR_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) { this->lastError = GENERIC_LIST_ERR_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() { return this->lastError; } /* * Returns the number of list nodes */ int GenericList::getLength() { return this->length; } /* * (Private) deletes all list nodes */ void GenericList::deleteList() { GenericListNode * tmp = this->head; while(tmp) { GenericListNode* tmpNext=tmp->getNext(); delete(tmp); tmp = tmpNext; } }