template<class T>
void List<T>::makeEmpty() //全部销毁指针资源
{
LinkNode<T> *current = first->next;
LinkNode<T> *del;
while(current != first)
{
del = current;
current = current->next;
delete del;
}
}
template<class T>
int List<T>::Length() const
{
int count = 0;
LinkNode<T> *current = first;//头指针副本用于遍历
while(current->next != first)//与单链表的遍历控制条件相同,当前结点后后继是否为空
{
current = current->next;
count++ ;
}
return count;
}
template<class T>
LinkNode<T>* List<T>::getHead() const
{
return first;
}
template<class T>
LinkNode<T>* List<T>::Search(T x) const
{
LinkNode<T> *current = first->next;
while(current != NULL)//此时的控制条件为某个结点的next知否为空
{
if(current->data == x)
return current;//如果查询到直接函数返回,不用无用操作(如果链表中有多个x元素值,则以第一个为准返回)
current = current->next;
}
return NULL;
}
template<class T>
LinkNode<T>* List<T>::Locate(int i) const
{
if(i < 0) //定位可以是第0个,也就是头结点指针
return NULL;
LinkNode<T> *current = first;int k=0;
while(current != NULL && k < i)//双条件控制后者其更多的作用
{
current = current->next;
k++;
}
return current;//指向第i个元素的指针
}
template<class T>
bool List<T>::GetData(int i,T& x) const //参数中有下标值的一般先判断其下标值是否合法
{
if(i <= 0)
return false;
LinkNode<T> *current = Locate(i);
if(current == NULL)
return false;
x = current->data;
retrun true;
}
template<class T>
bool List<T>::SetData(int i,T& x)
{
if(i <= 0)
return false;
LinkNode<T> *current = Locate(i);
if(current == NULL)
return false;
current->data = x;
return true;
}
template<class T>
bool List<T>::Insert(int i,T& x)
{
if(i < 0 )//可以插入在第一个结点之前,有头结点的好处代码一致
return false;
LinkNode<T> *current = Locate(i);
return false;
LinkNode<T> *newNode = new LinkNode<T>(x);
if(newNode == NULL)
return false;
newNode->prior = current; //双向链表插入的关键四步,顺序不能变,最后一句必须最后执行
newNode->next = current->next;
current->next->prior = newNode;
current->next = newNode;
return true;
}
template<class T>
LinkNode<T>* List<T>::Remove(int i,T& x)
{
if(i <= 0)
return NULL;
LinkNode<T> *current = Locate(i);//和单链表不同的是,双向链表有前指针可以指向前驱,所以定位到第i个就好
if(current ==NULL)
return NULL;
current->next->prior = current->prior;//双向链表删除操作较为简单明了
current->prior->next = current->next;//重新搭链
x = current->data;
delete current;//销毁指针资源
}
template<class T>
bool List<T>::isEmpty() const
{