(2011.07.20) 双链表.cpp -- 最基本的C++双链表

来源:互联网 发布:林珊珊淘宝店铺33标志 编辑:程序博客网 时间:2024/06/05 12:05
// 双链表.cpp -- 最基本的C++双链表// Doubly-linked list link node with freelist supporttemplate <class Elem>class Link{private:static Link<Elem>* freelist;// Head of the freelistpublic:Elem element;// Value for this nodeLink *next;// Pointer to next node in listLink *prev;// Pointer to previous node// 构造一个带元素和前后指针的构造函数Link(const Elem& e, Link* prevp = NULL, Link* nextp = NULL){ element = e; prev = prevp; next = nexp; }// 构造一个只带前指针和后指针的函数Link(Link*prevp = NULL, Link* nextp = NULL){ prev = prevp; next = nextp; }// Overload new and delete operators for freelistvoid* operator new(size_t);void operator delete(void*);};template <class Elem>Link<Elem>* Link<Elem>::freelist = NULL;template <class Elem>// overload for new operatorvoid* Link<Elem>::operator new(size_t){if(freelist == NULL) return ::new Link;// creat spaceLink<Elem>*temp = freelist;// can take from freelistfreelist = freelist -> next;return temp;// Return the link}template <class Elem>// overload for delete operatorvoid Link<Elem>::operator delete(void* ptr){((Link<Elem>*)ptr) -> next = freelist;// put on freelistfreelist = (Link<Elem>*)ptr;}template <class Elem>class LList: public Link<Elem>{private:int rightcnt;// size of right partitionint leftcnt;// size of left partitionLink<Elem> *head;// Pointer to list headerLink<Elem> *tail;// Pointer to last elem in listLink<Elem> *fence;// Last element on left sidevoid init()// Intialization routine{fence = tail = head = new Link<Elem>;leftcnt = rightcnt = 0;}void removeall()// Return link nodes to free store{while(head != NULL){fence = head;head = head -> next;delete fence;}}};public:LList(int size = DefaultListSize) { init();}~LList() { removeall(); init(); }bool insert(const Elem& item);bool append(const Elem& item);bool remove(Elem& it);void prev();//  ....};template <class Elem> // Insert at front of right partitionbool LList<Elem>::insert(const Elem& item){fence -> next = new Link<Elem>(item, fence, fence -> next);if (fence -> next -> next != NULL)// if note deleting at endfence -> next -> next -> prev = fence -> next;if (tail == fence)// Appending new Elemtail = fence -> next;/// so set tailrightcnt++;return true;}template <class Elem>// Append Elem to end of the list.bool LList<Elem>::append(const Elem& item){tail = tail -> next = new Link <Elem>(item, tail, NULL);rightcnt++;return true;}// Removve and return first Elem in right partitiontemplate <class Elem> bool LList<Elem>::remove(Elem& it){if (fence -> next == NULL) return false;// empty rightit = fence -> next -> element;// Remember valueLink<Elem>* ltemp = fence -> next;// Remember link nodeif (ltemp -> next != NULL) ltemp -> next -> prev = fence;else tail = fence;// Reset tailfence -> next = ltemp -> next;// Remove from listdelete ltemp;// Reclaim spacerightcnt--;// Removed from rightreturn true;}// Move fence one step left; no change if left is emptytemplate <class Elem> void LList<Elem>::prev(){if (fence != head)// can't back up from list head{fence = fence -> prev; leftcnt--; rightcnt++;}}


原创粉丝点击