#include #include using namespace std; template class List { private: T* data; int* next; int* free; int head; int current; int size; int next_free; public: List(int size); bool insert(T e); bool remove(); bool find_first(); bool find_next(); bool find_prior(); bool full(); bool empty(); T retrieve(); void update(T e); }; template List::List(int size) : size(size), head(-1), current(-1), next_free(size-1) { this->data = new T[size]; this->next = new int[size]; this->free = new int[size]; for(int i = 0; i < size; i++) { this->next[i] = -1; this->free[i] = i; } } template bool List::full() { return (this->next_free == -1); } template bool List::empty() { return (this->head == -1); } template bool List::insert(T e) { if(this->full()) return false; int p = this->free[next_free--]; this->data[p] = e; if(this->empty()) { this->head = p; } else { this->next[p] = this->next[this->current]; this->next[this->current] = p; } this->current = p; return true; } template bool List::find_prior() { if(this->empty()) return false; int p = this->head; while(p!=-1 && this->next[p] != this->current) { p = this->next[p]; } if(p == -1) { return false; } else { this->current = p; return true; } } template bool List::remove() { if(this->empty()) return false; int node_rem = this->current; if(node_rem == this->head) { this->head = this->next[node_rem]; this->current = this->head; } else { assert(this->find_prior()); this->next[this->current] = this->next[node_rem]; } this->next[node_rem] = -1; this->free[++this->next_free] = node_rem; return true; } template bool List::find_next() { if(this->empty()) return false; if(this->next[this->current] == -1) return false; this->current = this->next[this->current]; return true; } template bool List::find_first() { if(this->empty()) return false; this->current = this->head; return true; } template T List::retrieve() { assert(!this->empty()); return this->data[current]; } template void List::update(T e) { assert(!this->empty()); this->data[current] = e; } int main( int argc, char *argv[] ) { List l(20); int i; for(i = 0; !l.full(); i++) { l.insert(i); } assert(i == 20); assert(l.find_first()); while(l.find_next()) { cout << l.retrieve() << endl; } assert(l.find_first()); while(!l.empty()) l.remove(); assert(!l.find_first()); return 0; }