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;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值