本蒟蒻在手敲双向指针链表,但一但调用erase
就会出错,求调。
#ifndef Listb_H
#define Listb_H
template<typename T>
void Free(T*p){*p=T();delete p;p=nullptr;return;}
template<typename T>
struct Node{
Node *pre,*next;T val;
Node(){val=T(),pre=next=nullptr;}
Node(const T&v,Node*p=nullptr,Node*n=nullptr){val=v,pre=p,next=n;}
Node operator++(){*this=*next;return *this;}
Node operator--(){*this=*pre;return *this;}
Node operator++(int){
Node tmp=*this;*this=*next;
return tmp;
}
Node operator--(int){
Node tmp=*this;*this=*pre;
return tmp;
}
Node friend operator+(Node p,int mv){
while(mv--) ++p;
return p;
}
Node friend operator-(Node p,int mv){
while(mv--) --p;
return p;
}
void friend operator+=(Node&p,const int mv){p=p+mv;return;}
void friend operator-=(Node&p,const int mv){p=p-mv;return;}
T& operator*(){return this->val;}
};
template<typename T>
class List{
private:
Node<T> *head,*tail,*newnode,*cur;
public:
void clear();
void create();
void push_front(T v);
void push_back(T v);
void pop_front();
void pop_back();
void insert(Node<T>&it,T val);
void erase(Node<T>&it);
T front();
T back();
int size();
bool empty();
auto begin();
auto end();
};
template<typename T>
void List<T>::clear(){
while(!empty()) pop_back();
return;
}
template<typename T>
void List<T>::create(){
head=new Node<T>();tail=new Node<T>();
head->next=tail;tail->pre=head;
return;
}
template<typename T>
void List<T>::push_front(T v){
newnode=new Node<T>(v,head,head->next);
head->next->pre=newnode;head->next=newnode;
return;
}
template<typename T>
void List<T>::push_back(T v){
newnode=new Node<T>(v,tail->pre,tail);
tail->pre->next=newnode;tail->pre=newnode;
return;
}
template<typename T>
void List<T>::pop_front(){
if(empty()) return;
cur=head->next;
head->next->next->pre=head;head->next=head->next->next;
cur->pre=cur->next=nullptr;cur->val=T();Free(cur);
return;
}
template<typename T>
void List<T>::pop_back(){
if(empty()) return;
cur=tail->pre;
tail->pre->pre->next=tail;tail->pre=tail->pre->pre;
cur->pre=cur->next=nullptr;cur->val=T();Free(cur);
return;
}
template<typename T>
void List<T>::insert(Node<T>&it,T val){
cur=⁢
newnode=new Node<T>(val);
newnode->pre=cur->pre;
newnode->next=cur;
cur->pre->next=newnode;
cur->pre=newnode;
it=*cur;
return;
}
template<typename T>
void List<T>::erase(Node<T>&it){
cur=⁢it--;
cur->pre->next=cur->next;
cur->next->pre=cur->pre;
cur->pre=cur->next=nullptr;
Free(cur);
return;
}
template<typename T>
T List<T>::front(){return head->next->val;}
template<typename T>
T List<T>::back(){return tail->pre->val;}
template<typename T>
int List<T>::size(){
int l=0;cur=head->next;
while(cur!=tail) ++l,cur=cur->next;
return l;
}
template<typename T>
bool List<T>::empty(){return (head==nullptr&&tail==nullptr)||head->next==tail;}
template<typename T>
auto List<T>::begin(){return *(head->next);}
template<typename T>
auto List<T>::end(){return *tail-1+1;}
#endif
顺便问一下,还有什么别的链表操作吗,我只做了基础操作。
借楼宣传一下我师兄写的小说