/* struct Stack_node { Stack_node(void *datA, Stack_node *nexT) {data = datA; next = nexT;} void *data; Stack_node *next;}; template class Stack { Stack_node *s; public: Stack() {s = 0;} void push(T* t) {s = new Stack_node(t, s);} void pop() {Stack_node *old = s; s = s->next; delete old;} T& top() {return *((T*)s->data);} bool empty() {return (s==0);} void clear() {while (!empty()) pop();} }; */ template struct DLink { T *obj; DLink *prev, *next; DLink(T *obJ, DLink *preV, DLink *nexT) : obj(obJ), prev(preV), next(nexT) { if (preV) preV->next = this; if (nexT) nexT->prev = this; } void erase() { if (prev) prev->next = next; if (next) next->prev = prev; delete this; } }; template struct DList { DLink *first, *last; DList() : first(0), last(0) {} DLink *find_first(T *o) { for (DLink *i = first; i; i=i->next) if (i->obj==o) return i; return 0; } int size() {int j = 0; for (DLink *i = first; i; i=i->next) ++j; return j;} DLink *insert(T *o, DLink *prev, DLink *next); void push_front(T *o) {insert(o, 0, first);} void push_back(T *o) {insert(o, last, 0);} void erase(DLink *o); bool empty() {return !first;} }; template DLink *DList::insert(T *o, DLink *prev, DLink *next) { DLink *newobj = new DLink(o, prev, next); if (prev == last) last = newobj; if (next == first) first = newobj; return newobj; } template void DList::erase(DLink *obj) { if (obj==first) first=obj->next; if (obj==last) last=obj->prev; obj->erase(); }