#include "definitions.h" #include "List.h" Cell::Cell() { item_ = NULL; next_ = NULL; prev_ = NULL; } Cell::Cell(Linkable *new_item) { item_ = new_item; next_ = NULL; prev_ = NULL; } Cell::Cell(Linkable *new_item, Cell *prev) { item_ = new_item; prev_ = prev; next_ = NULL; } Cell::Cell(Linkable *new_item, Cell *next, Cell *prev) { item_ = new_item; next_ = next; prev_ = prev; } Cell::~Cell() { next_ = NULL; prev_ = NULL; item_ = NULL; } Linkable* Cell::item(){return item_;} Cell* Cell::next(){return next_;} Cell* Cell::prev(){return prev_;} void Cell::set_next(Cell *next) {next_ = next;} void Cell::set_prev(Cell *prev) {next_ = prev;} /*----------------------------------------------------*/ List::List() { head_ = NULL; tail_ = NULL; old_search_val_ = NULL; } List::~List() { Cell* ptr = head_; Cell* tmp; while(ptr != NULL) { tmp = ptr->next(); delete ptr; ptr = tmp; } head_ = NULL; tail_ = NULL; old_search_val_ = NULL; } /* Simply add to the beginning of the list */ void List::insert(Linkable* new_item) { add_first(new_item); } /* Add to the end of the list */ void List::add_last(Linkable *new_item) { Cell* tmp; if ((tail_ == NULL) && (head_ == NULL)) { /* The list is empty */ tmp = new Cell(new_item); tail_ =tmp; head_ = tmp; return; } else if ((tail_ != NULL) && (head_ != NULL)) { tmp = new Cell(new_item , tail_); tail_->set_next(tmp); tail_ = tmp; return; } else { printf("Error in List obj\n"); } } /* Add to the beginning of the list */ void List::add_first(Linkable *new_item) { Cell *tmp; if ((tail_ == NULL) && (head_ == NULL)) { /* The list is empty */ tmp = new Cell(new_item); head_ = tmp; tail_ = tmp; return; } else if ((tail_ != NULL) && (head_ != NULL)) { tmp = new Cell(new_item, head_); head_ = tmp; return; } else { printf("Error in List obj\n"); } } /* Remove the item from the List */ void List::remove(Linkable *new_item) { Cell *ptr = head_, *prev, *next; while (ptr) { if (ptr->item()==new_item) { prev = ptr->prev(); next = ptr->next(); if ((prev != NULL) && (next != NULL)) { prev->set_next(next); next->set_prev(prev); delete ptr; } else if (prev != NULL) { /* ptr must be the last item */ prev->set_next(NULL); tail_ = prev; delete ptr; } else if (next != NULL) { /* ptr must be the first item */ next->set_prev(NULL); head_ = next; delete ptr; } else { head_ = tail_ = NULL; delete ptr; } return; } else ptr = ptr->next(); } }