チェーンテーブルベースの両端キューのクラステンプレートのC++実装

3315 ワード

/*
         (    )
          
											1.Createdeque  n         
											2.cleardeque      
											3.f_inde(T e)       e
											4.f_outde()      
											5.l_inde(T e)       e
											6.l_outde      
											7.empty        
											8.length         
											9.display             
        :
											1.fp    
											2.lp    
											3.len    
by chczy
2017/10/16 21:34
*/
#include
#include
#include
using namespace std;
template
struct node {
	node* nx;
	node* pr;
	T data;
};

template
class linkdeque {
public:
	linkdeque();//     
	~linkdeque() { cout << "destroy the deque!" << endl; };
	node* Createdeque(int n);//     n   
	void cleardeque();//    
	node* f_inde(T e);//       e
	node* f_outde();//      
	node* l_inde(T e);//       e
	node* l_outde();//      
	bool empty();//        
	int length();//      
	void display();//         

private:
	node* fp;//front pointer
	node* lp;//rare pointer
	int len;
};

template
linkdeque::linkdeque()
{
	fp = NULL;
	lp = NULL;
	len = 0;
}

template
node* linkdeque::Createdeque(int n)
{
	len = n;
	node *L = new node;
	L->nx = NULL;
	L->pr = NULL;
	node *h = new node;
	cin >> h->data;
	L->nx = h;
	h->pr = L;
	h->nx = NULL;
	fp = h;
	int i = n-1;
	n -= 1;
	node *prev;
	prev = h;
	while (n--)
	{
		node *p = new node;
		cin >> p->data;
		prev->nx = p;
		p->pr = prev;
		p->nx = NULL;
		prev = p;
		if (n == 0)
			lp = p;
	}
	return fp;
}

template
void linkdeque::cleardeque()
{
	while (!empty()) l_outde();
}

template
node* linkdeque::f_inde(T e)
{
	node* p=new node;
	p->data = e;
	p->nx = fp;
	fp->pr = p;
	p->pr = NULL;
	fp = p;
	++len;
	return fp;
}

template
node* linkdeque::f_outde()
{
	node *p = fp;
	node *s = p->nx;
	s->pr = NULL;
	fp = s;
	delete p;
	--len;
	return fp;
}

template
node* linkdeque::l_inde(T e)
{
	node* p = new node;
	p->data = e;
	p->pr = lp;
	lp->nx = p;
	p->nx = NULL;
	lp = p;
	++len;
	return lp;
}

template
node* linkdeque::l_outde()
{
	node *p=lp;
	node *s = p->pr;
	s->nx = NULL;
	lp = s;
	delete p;
	--len;
	return p;
}

template
bool linkdeque::empty()
{
	if (len == 0)
		return 1;
	else
		return 0;
}

template
int linkdeque::length()//          
{
	cout << "      :" << endl;
	cout << len << endl;
	return len;
}

template
void linkdeque::display()
{
	if (len == 0)
	{
		cout << "no elem!" << endl;
		return;
	}
	int i = 0;
	node *p = fp;
	cout << "    " << len << endl;
	cout << "       : ";
	while (i != len)
	{
		cout << p->data << " ";
		p = p->nx;
		++i;
	}
	cout << endl;
}