无序列表的各种处理

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;

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值