#include #include struct list { struct node { node *prev, *next; int value; node(int v) { value = v; } node *advance() { return next; } }; node *first, *last; node *begin() { return first; } node *end() { return NULL; } list() { first = NULL; last = NULL; } ~list() { clear(); } void insert(node *where, int v) { node *newnode = new node(v); newnode->prev = where ? where->prev : last; newnode->next = where; if(newnode->prev) newnode->prev->next = newnode; if(where) where->prev = newnode; if(where == first) first = newnode; if(!where) last = newnode; } void push_front(int v) { insert(begin(), v); } void push_back(int v) { insert(end(), v); } void erase(node *where) { node* prev = where->prev; node* next = where->next; if(prev) prev->next = next; if(next) next->prev = prev; if(where == first) first = next; if(where == last) last = prev; delete where; } void clear() { while(first) erase(first); } }; int main(void) { list mylist; // mylist.init(); -- no longer necessary. list::list() is automatically called. mylist.push_back(1); mylist.push_back(5); mylist.push_front(8); mylist.push_back(3); for(list::node *i = mylist.begin(); i != mylist.end(); i = i->advance()) printf("%d ", i->value); printf("\n"); // mylist.done(); -- no longer necessary. list::~list() is automatically called. // There is no memory leak here. return 0; }