#ifndef DBLLIST_H
#define DBLLIST_H
#include <iostream>
using namespace std;
template<class T>
struct DblNode
{
T data; //链表结点数据
DblNode<T> *lLink,*rLink; //链表前驱(左链)、后继(右链)指针
DblNode(DblNode<T> *left = NULL,DblNode<T> *right = NULL)
:lLink(left),rLink(right){}
DblNode(T value,DblNode<T> *left = NULL,DblNode<T> *right = NULL)
:data(value),lLink(left),rLink(right){}
};
template<class T>
class DblList
{
public:
DblList();
DblList(T uniqueVal);
~DblList()
{
delete first;
}
int Length()const;
bool IsEmpty()
{
return first->rLink == first;
}
DblNode<T> *GetHead()const //取附加头结点地址
{
return first;
}
void SetHead(DblNode<T> *ptr) //设置附加头结点地址
{
first = ptr;
}
DblNode<T> *Search(const T &x); //在链表中沿后继方向寻找等于给定值x的结点
DblNode<T> *Locate(int i,int d); //在链表中定位诒为i(>=0)的结点,d=0按前驱方向,d<>0按后继方向
bool Insert(int i,const T &x,int d); //在第i个结点后插入一个包含有值x的新结点,d=0按前驱方向,d<>0按后继方向
bool Remove(int i,T &x,int d); //删除第i个结点,x返回其值,d=0按前驱方向,d<>0按后继方向
private:
DblNode<T> *first;
};
template<class T>
DblList<T>::DblList()
{
first = new DblNode<T>;
if (first == NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
first->lLink = first->rLink = first;
}
template<class T>
DblList<T>::DblList(T uniqueVal)
{
first = new DblNode<T>(uniqueVal);
if (first == NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
first->lLink = first->rLink = first;
}
template<class T>
int DblList<T>::Length()const
{
DblNode<T> *current = first->rLink;
int count = 0;
while (current != first)
{
++count;
current = current->rLink;
}
return count;
}
template<class T>
DblNode<T> *DblList<T>::Search(const T &x)
{
DblNode<T> *current = first->rLink;
while (current != first && current->data != x)
current = current->rLink;
if(current != first)
return current;
else
return NULL;
}
template<class T>
DblNode<T> *DblList<T>::Locate(int i,int d)
{
if (first->rLink == first || i == 0)
return first;
DblNode<T> *current;
if(d == 0)
current = first->lLink;
else
current = first->rLink;
for (int j = 1;j < i;++j)
{
if(current == first) //链太短,退出搜索
break;
else if(d == 0)
current = current->lLink;
else
current = current->rLink;
}
if(current != first)
return current;
else
return NULL;
}
template<class T>
bool DblList<T>::Insert(int i,const T &x,int d)
{
DblNode<T> *current = Locate(i,d);
if(current == NULL)
return false;
DblNode<T> *newNode = new DblNode<T>(x);
if (newNode == NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
if (d == 0)
{
newNode->lLink = current->lLink;
current->lLink = newNode;
newNode->lLink->rLink = newNode;
newNode->rLink = current;
}
else
{
newNode->rLink = current->rLink;
current->rLink = newNode;
newNode->rLink->lLink = newNode;
newNode->lLink = current;
}
return true;
}
template<class T>
bool DblList<T>::Remove(int i,T &x,int d)
{
DblNode<T> *current = Locate(i,d);
if(current == NULL)
return false;
current->rLink->lLink = current->lLink;
current->lLink->rLink = current->rLink;
x = current->data;
delete current;
return true;
}
#endif