#include using namespace std; struct data { void *data; struct data *prev; struct data *next; } ; template class LinkedList { public : LinkedList(); ~LinkedList(); void add(T &elemt); void remove(); bool remove(T &elemt); T & get(); void start(); T & next(); T & prev(); bool isfirst(); bool islast(); private : data *first; data *pcurrent; } ; template LinkedList::LinkedList() { this->first = new data; this->pcurrent = this->first; } template LinkedList::~LinkedList() { this->start(); while (this->pcurrent->next != NULL) { this->pcurrent = this->pcurrent->next; delete this->pcurrent->prev; } delete this->pcurrent; } template void LinkedList::add(T &elemt) { data * newdata = new data; newdata->data = (void *) &elemt; if (this->pcurrent->next != NULL) { newdata->next = this->pcurrent->next; newdata->next->prev = newdata; } newdata->prev = this->pcurrent; this->pcurrent->next = newdata; if (this->pcurrent == this->first) { this->next(); } } template void LinkedList::remove() { data * removed; removed = this->pcurrent; if (removed->prev == NULL && removed->next == NULL) { return; } // else if (removed->prev == NULL) // { // this->next(); // this->remove(); // this->prev(); // return; // } else { removed->prev->next = removed->next; if (removed->next != NULL) { removed->next->prev = removed->prev; } this->pcurrent = removed->prev; delete removed; } } template bool LinkedList::remove(T &elemt) { data * old_pcurrent = this->pcurrent; this->start(); while (! this->islast()) { if (&elemt == &this->next()) { this->remove(); this->pcurrent = old_pcurrent; return true; } } this->pcurrent = old_pcurrent; return false; } template T & LinkedList::get() { return * (T *) this->pcurrent->data; } template void LinkedList::start() { this->pcurrent = this->first; } template T & LinkedList::next() { if (this->pcurrent->next != NULL) { this->pcurrent = this->pcurrent->next; } return this->get(); } template T & LinkedList::prev() { if (this->pcurrent->prev != NULL || this->pcurrent->prev != this->debut) { this->pcurrent = this->pcurrent->prev; } return this->get(); } template bool LinkedList::isfirst() { if (this->pcurrent->prev == first) { return true; } else { return false; } } template bool LinkedList::islast() { if (this->pcurrent->next == NULL) { return true; } else { return false; } } int main(int argc, char **argv) { int test = 42; int test1 = 43; int test2 = 44; LinkedList liste; liste.add(test); // liste.next(); liste.add(test1); /* liste.start();*/ liste.add(test2); // liste.start(); liste.remove(test1); liste.start(); cout << liste.next() << endl; cout << liste.next() << endl; if (! liste.islast()) { cout << liste.next() << endl; } return 0; }