00001 class Link { // A singly-linked list node 00002 public: // with freelist 00003 Elem element; // Elem value for this node 00004 Link* next; // Pointer to next node in list 00005 static Link* freelist; // Link class freelist 00006 Link(const Elem elemval, Link* nextval =NULL) 00007 { element = elemval; next = nextval; } 00008 Link(Link* nextval =NULL) { next = nextval; } 00009 ~Link() { } // Destructor: take no action 00010 void* operator new(size_t); // Overloaded new operator 00011 void operator delete(void*); // Overloaded delete operator 00012 }; 00013 00014 00015 // This creates space for the freelist variable 00016 Link* Link::freelist = NULL; 00017 00018 void* Link::operator new(size_t) { // Overload new 00019 if (freelist == NULL) return ::new Link; // Create new space 00020 Link* temp = freelist; // Otherwise, get from freelist 00021 freelist = freelist->next; 00022 return temp; // Return the link node 00023 } 00024 00025 void Link::operator delete(void* ptr) { // Overload delete 00026 ((Link*)ptr)->next = freelist; // Put on freelist 00027 freelist = (Link*)ptr; 00028 }