C+双链表

来源:互联网 发布:eplan软件价格 编辑:程序博客网 时间:2024/06/02 20:56

#include "iostream"using namespace std;template <class Elem> class Link {private:  static Link<Elem>* freelist; // Headpublic:  Elem element;     // Value for this node  Link *next;    // Pointer to next node   Link *prev;    // Pointer to previous   Link(const Elem& e, Link* prevp =NULL, Link* nextp =NULL)   {  element=e;  prev=prevp;  next=nextp;   }  Link(Link* prevp =NULL, Link* nextp =NULL)  {  prev = prevp;  next = nextp;   }  void* operator new(size_t);  // Overload  void operator delete(void*); // Overload};template <class Elem>Link<Elem>* Link<Elem>::freelist = NULL;template <class Elem>   // Overload for newvoid* Link<Elem>::operator new(size_t) {  if (freelist == NULL) return ::new Link;  Link<Elem>* temp = freelist; // Reuse  freelist = freelist->next;  return temp;         // Return the link}template <class Elem>   // Overload deletevoid Link<Elem>::operator delete(void* ptr){  ((Link<Elem>*)ptr)->next = freelist;  freelist = (Link<Elem>*)ptr;}template<class Elem> class LList : public Link<Elem> { // Linked list classprivate:Link<Elem>* head;                 // Pointer to list headerLink<Elem>* tail;                 // Pointer to last Elem in list Link<Elem>* fence;                 // last elements on left sideint leftcnt; //size of left partitionint rightcnt; //size of right partitionprivate:void init(){ //initialization routinefence = tail = head = new Link<Elem>;leftcnt = rightcnt = 0;}void removeall(){//return link nodes to free storewhile(head != NULL){fence = head;head = head->next;delete fence;}}public:// LList()       // Constructor// { init(); }                         // Initialize// ~LList(){ removeall();}// void clear() { removeall(); init();}bool insert(const Elem& item) {fence->next = new Link<Elem>(item, fence, fence->next);          if (fence->next->next != NULL)        fence->next->next->prev = fence->next;        if (tail == fence)   // Appending new Elem        tail = fence->next; //   so set tail        rightcnt++;           // Added to right        return true;}bool append(const Elem& item) // Insert Elem at tail of list{tail=tail->next=new Link<Elem>(item,tail,NULL);rightcnt++;return true;}bool remove(Elem& it) {              // Remove and return current Elemif (fence->next == NULL) return false;        it = fence->next->element;        Link<Elem>* ltemp = fence->next;        if (ltemp->next != NULL)ltemp->next->prev = fence;else tail = fence;         // Reset tailfence->next = ltemp->next; // Remove  delete ltemp;    // Reclaim spacerightcnt--;      // Removed from rightreturn true;}void setStart()          // Set fence to first position{ fence = head; rightcnt += leftcnt; leftcnt = 0; }void setEnd()          // Set fence to end position{ fence = tail; leftcnt += rightcnt; rightcnt = 0; }void prev() { Link<Elem>* temp = head;if(fence == head) return;     //no previous elemwhile(temp->next != fence) temp = temp->next;fence = temp;leftcnt--;rightcnt++;}void next()              // Move curr to next position{ if(fence != tail)//don't move fence if right empty{fence = fence->next; rightcnt--; leftcnt++;}}  // Return length of left and right partition, respectivelyint  leftLength() const {         // Return current length of listreturn leftcnt;}int  rightLength() const {         // Return current length of listreturn rightcnt;}bool setPos(int pos) {       // Set curr to specified positionif((pos < 0) || (pos > rightcnt + leftcnt)) return false;fence = head;for(int i = 0; i < pos; i++) fence = fence->next;return true;}bool getValue(Elem& it) const   // Return value of current Elem{ if(rightLength() == 0) return false;it = fence->next->element;return true;}void print() const{Link<Elem>* temp = head;cout << "<";while(temp != fence){cout << temp->next->element<<" ";temp = temp->next;}cout << "|";while(temp->next != NULL){cout << temp->next->element << " ";temp = temp->next;}cout << ">\n";}};int main(int argc, char* argv[]){LList<int> lList;lList.insert(8);lList.insert(9);lList.insert(3);lList.insert(4);lList.append(1);lList.print();return 0;}



0 0
原创粉丝点击