码迷,mamicode.com
首页 > 其他好文 > 详细

slist 的实现

时间:2015-04-28 01:29:43      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

 slist单向链表的实现,比较复杂,运用了继承关系

     
     slist前者的迭代器属于单向的Foward Iterator。单向链表所耗用的空间更小,某些操作更快
     
     slist没有方法可以返回前一个位置,必须从头开始找起。所以,除了slist起点附近的区域之外,在其它位置上采用insert或erase操作函数,都是不智之举;slist提供了insert_after()和erase_after();
     基于效率考虑,slist不提供push_back(),只提供push_front().
 
__________________________________________________________________________________________________
slist的节点
 
     技术分享
 
//单向链表节点的基本结构     
struct _Slist_node_base       
{
  _Slist_node_base* _M_next;
};
 
//单向链表的节点结构
template <class _Tp>
struct _Slist_node public _Slist_node_base
{
  _Tp _M_data;
};
 
//make_link,在pre_node之后插入以新节点
inline _Slist_node_base*
__slist_make_link(_Slist_node_base* __prev_node,
                  _Slist_node_base* __new_node)
{
  __new_node->_M_next = __prev_node->_M_next;
  __prev_node->_M_next = __new_node;
  return __new_node;
}
 
//计算slist的节点个数
inline size_t __slist_size(_Slist_node_base* __node)
{
  size_t __result = 0;
  for ( ; __node != 0; __node = __node->_M_next)
    ++__result;
  return __result;
}
//查找节点node之前的元素节点
inline _Slist_node_base*
__slist_previous(_Slist_node_base* __head,
                 const _Slist_node_base* __node)
{
  while (__head && __head->_M_next != __node)
    __head = __head->_M_next;
  return __head;
}
 
inline const _Slist_node_base*
__slist_previous( const _Slist_node_base* __head,
                 const _Slist_node_base* __node)
{
  while (__head && __head->_M_next != __node)
    __head = __head->_M_next;
  return __head;
}
 
 
__________________________________________________________________________________________________
slist的迭代器
//迭代器的基本结构
struct _Slist_iterator_base
{
  typedef size_t                size_type;
  typedef ptrdiff_t             difference_type;
  typedef forward_iterator_tag iterator_category;
 
  _Slist_node_base* _M_node;  //指向节点基本结构
 
  _Slist_iterator_base(_Slist_node_base* __x) : _M_node(__x) {}
  void _M_incr() { _M_node = _M_node->_M_next; }
 
  bool operator==( const _Slist_iterator_base& __x) const {
    return _M_node == __x._M_node;
  }
  bool operator!=( const _Slist_iterator_base& __x) const {
    return _M_node != __x._M_node;
  }
};
 
//单项链表迭代器结构
template <class _Tp, class _Ref, class _Ptr>
struct _Slist_iterator public _Slist_iterator_base
{
  typedef _Slist_iterator<_Tp, _Tp&, _Tp*>             iterator;
  typedef _Slist_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;
  typedef _Slist_iterator<_Tp, _Ref, _Ptr>             _Self;
 
  typedef _Tp               value_type;
  typedef _Ptr              pointer;
  typedef _Ref              reference;
  typedef _Slist_node<_Tp> _Node;
 
  _Slist_iterator(_Node* __x) : _Slist_iterator_base(__x) {}
  _Slist_iterator() : _Slist_iterator_base(0) {}
  _Slist_iterator( const iterator& __x) : _Slist_iterator_base(__x._M_node) {}
 
  reference operator *() const return ((_Node*) _M_node)->_M_data; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
  pointer operator ->() const return &( operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
 
 
//operator++,没有实现operator--,因为这是slist迭代器是Forward Iterator
  _Self& operator ++()
  {
    _M_incr();
    return * this;
  }
  _Self operator ++(int )
  {
    _Self __tmp = * this;
    _M_incr();
    return __tmp;
  }
};
 
__________________________________________________________________________________________________
slist的数据结构
 
技术分享技术分享技术分享技术分享

slist 的实现

标签:

原文地址:http://www.cnblogs.com/jt-china/p/4461828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!