1 查找
template <typename T> //在无序节点中的n个(真)前驱中,找到等于e的最后者
ListNodePost(T) List<T>::find (T const& e,int n, ListNodePosi(T) p ) const{
while(0<n--) //从右往左
if(e==(p==p->pred)->data) return p;
return NULL; // 越出左边界意味着区间不含e,查找失败
}
2 前插入
template <typename T>
ListNodePosi(T) ListNode<T>::insertAsPred(T const& e){
ListNodePosi(T) x=new ListNode(e,pred,this); //创建新节点
pred->succ=x;pred=x; //设置正向链接
return x; //返回新结点位置
}
3 后插入
template <typename T>
ListNodePosi(T) ListNode<T>::insertAsSucc(T const& e){
ListNodePosi(T) x=new ListNode(e,this,succ);
succ->pred=x; succ=x;
return x;
}
4 删除
template <typename T> T List<T>::remove (ListNodePosi(T) p){// 删除合法节点p,返回其数值
T e=p->data;// 备份待删除节点的数值
p->pred->succ=p->succ;p->succ->pred=p->pred;
delete p; _size--; //释放节点,更新规模
return e;
}
5 析构
template <typename T> int List<T>::clear() {
int oldSize=_size;
while(0<_size) remove(header->succ);
return oldSize;
}
template <typename T> List<T>::~List(){
clear(); delete header;delete trailer;}
6 唯一化
template <typename T> int List<T>::deduplicate() {
if(_size<2) return 0; //平凡列表无重复
int oldSize =_size;
ListNodeposi(T) p=header; Rank r=0; //p从首节点开始
while(trailer !=(p=p->succ)){
ListNodePosi(T) q=find (p->pata,r,p); //在p的r个(真)前驱种查找雷同者
q?remove(q):r++;// 若的确存在,则删除之;否则秩加一
}
return oldSize-_size;
}