玄关求调
  • 板块灌水区
  • 楼主_Corange_
  • 当前回复19
  • 已保存回复20
  • 发布时间2025/2/3 15:31
  • 上次更新2025/2/3 20:50:25
查看原帖
玄关求调
762117
_Corange_楼主2025/2/3 15:31

本蒟蒻在手敲双向指针链表,但一但调用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=&it;
	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;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

顺便问一下,还有什么别的链表操作吗,我只做了基础操作。
借楼宣传一下我师兄写的小说

2025/2/3 15:31
加载中...