template <class Elem> class Link{ public: Elem element;//数据域 Link *next; Link(const Elem& elemval, Link* nextval = NULL){ element = elemval; next = nextval; } Link(Link* nextval = NULL){ next = nextval; } }; template<class Elem> class LList :public list<Elem>{ private: Link<Elem>* head;//头结点 Link<Elem>* tail;//尾节点 Link<Elem>* fence;//栅栏结点 int leftcnt; //栅栏结点左边结点的数目 int rightcnt; //栅栏结点右边结点的数目 void init(){ fence = tail = head = new Link<Elem>; leftcnt = rightcnt = 0; } void removeall(){ while (head != NULL){ fence = head; head = head->next; delete fence; } } public: LList(int size = 0){ init(); } ~LList(){ removeall(); } void clear(){ removeall(); init(); } bool insert(const Elem&); bool append(const Elem&); bool remove(Elem&); void setStart(){ fence = head; rightcnt += leftcnt; leftcnt = 0; } void setEnd(){ fence = tail; leftcnt += rightcnt; rightcnt = 0; } void prev(); void next(){ if (fence!=tail){ fence = fence->next; rightcnt--; leftcnt++; } } int leftLength()const{return leftcnt;} int rightLength()const{return rightcnt;} bool setPos(int pos); bool getValue(Elem& it)const{ if(rightLength()==0)return false; it = fence->next->element; return true; } void print()const; bool turn(); //单链表逆序,反转 Link<Elem> quickloc();//快速定位到中间位置 void getBackN(int N){//寻找单链表倒数第N个数 this->setStart(); while(rightcnt!=N-1){ fence=fence->next; rightcnt--; leftcnt++; } cout<<fence->element; } }; template<class Elem> bool LList<Elem>::insert(const Elem& item){//在栅栏结点后插入结点 fence->next = new Link<Elem>(item, fence->next); if(tail == fence) tail = fence->next; rightcnt++; return true; } template<class Elem> bool LList<Elem>::turn(){//链表就地逆转 Link<Elem> *current=head->next,*p; if (head == NULL) { return false; } while (current->next != NULL){ p = current->next; current->next = p->next; p->next = head->next; head->next = p; } return true; } template<class Elem> bool LList<Elem>::append(const Elem& item){//在尾节点后增加结点 tail = tail->next = new Link<Elem>(item,NULL); rightcnt++; return true; } template<class Elem> bool LList<Elem>::remove(Elem& it){ if(fence->next == NULL)return false; it = fence->next->element; Link<Elem>* ltemp = fence->next; fence->next = ltemp->next; if(tail == ltemp) tail =fence; delete ltemp; rightcnt--; return true; } template<class Elem> void LList<Elem>::prev(){//访问前结点 Link<Elem>* temp= head; if(fence == head)return ; while(temp->next!=fence)temp=temp->next; fence=temp; leftcnt--; rightcnt++; } template<class Elem> bool LList<Elem>::setPos(int pos){//把栅栏设在pos处 if((pos>0)||(pos>rightcnt+leftcnt))return false; fence = head; for(int i=0;i<pos;i++)fence = fence->next; return true; } template<class Elem> void LList<Elem>::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"; } template<class Elem> Link<Elem> LList<Elem>::quickloc(){//快速定位 Link<Elem> *search=head,*mid=head; while(true){ if(search==tail){ cout<<mid->element; return mid; } search=search->next; mid=mid->next; if(search==tail){ cout<<mid->element; return mid; } search=search->next; } }
c++链表实现2
猜你喜欢
转载自crazymizzz.iteye.com/blog/2259249
今日推荐
周排行