`
CrazyMizzz
  • 浏览: 23279 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

c++链表实现2

阅读更多
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;
	}
	
}
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics