《数据结构与算法分析》习题-----第二章(3)(关于list的题目)

PS:这两条习题是添加到STL的List代码实现

http://www.cnblogs.com/alan-forever/archive/2012/09/12/2682437.html

3.15 给List类添加splice操作。

void splice( iterator position, List<Object> & lst )

删除lst中的所有项,并将这些List * this中的位置position之前。lst和*this必须是不同的表,所写的例程必须是常量时间的。

PS:刚开始以为O(n)是常量,最后我发现我严重的错了,之前还想逐个逐个调用inset函数,好吧,我错了。

 1     void splice( iterator position, List<Object> & lst )
 2     {
 3         Node *p = position.current;
 4 
 5         p->prev->next = lst.head->next;
 6         lst.head->next->prev = p->prev;
 7         lst.tail->prev->next = p;
 8         p->prev = lst.tail->prev;
 9 
10         theSize += lst.size();
11 
12         lst.init();
13     }

 

3.16,给STL List类实现添加逆向迭代器。定义reverse_iterator 和const_reverse_iterator。添加方法rbegin和rend,来分别返回逆向迭代器所指向末尾标记前的项的位置和表头结点的位置,逆向迭代器在内部逆转++和--操作的意义,应该可以使用下面的代码逆向打印链表。

List<int>::reverse_iterator itr1 = l1.rbegin();
while( itr1 != l1.rend() )
cout << *itr1++ <<" ";
cout << endl;

PS:代码里面的注释有点不正确,只是含糊解释。

PS:下图有助于理解迭代器!!!!

 

 

下面的代码是逆向迭代器类的定义。

  1     class const_reverse_iterator
  2     {
  3     public:
  4         const_reverse_iterator( ) : current( NULL ) { }
  5 
  6         const Object & operator* ( ) const
  7         {
  8             return retrieve( );
  9         }
 10 
 11         const_reverse_iterator & operator++ ( )
 12         {
 13             current = current->prev;
 14             return * this;
 15         }
 16 
 17         const_reverse_iterator  operator++ ( int )
 18         {
 19             const_reverse_iterator old = *this;
 20             ++( *this );
 21             return old;
 22         }
 23 
 24         const_reverse_iterator & operator--  ( )
 25         {
 26             current = current->next;
 27             return * this;
 28         }
 29 
 30         const_reverse_iterator  operator-- ( int )
 31         {
 32             const_reverse_iterator old = *this;
 33             ++( *this );
 34             return old;
 35         }
 36 
 37         bool operator== ( const const_reverse_iterator & rhs ) const
 38         {
 39             return current == rhs.current;
 40         }
 41 
 42         bool operator!= ( const const_reverse_iterator & rhs ) const
 43         {
 44             return !( *this == rhs );
 45         }
 46 
 47     private:
 48         Node * current;
 49 
 50         Object & retrieve( ) const
 51         {
 52             return current->data;
 53         }
 54 
 55         const_reverse_iterator( Node * p ) : current( p ) { }
 56 
 57         friend class List<Object>;
 58     };
 59     //逆向迭代器
 60 
 61     class reverse_iterator
 62     {
 63     public:
 64         reverse_iterator( ) : current( NULL ) { }
 65 
 66         const Object & operator* ( ) const
 67         {
 68             return retrieve( );
 69         }
 70 
 71         reverse_iterator & operator++ ( )
 72         {
 73             current = current->prev;
 74             return * this;
 75         }
 76 
 77         reverse_iterator  operator++ ( int )
 78         {
 79             reverse_iterator old = *this;
 80             ++( *this );
 81             return old;
 82         }
 83 
 84         const_reverse_iterator & operator--  ( )
 85         {
 86             current = current->next;
 87             return * this;
 88         }
 89 
 90         reverse_iterator  operator-- ( int )
 91         {
 92             const_reverse_iterator old = *this;
 93             --( *this );
 94             return old;
 95         }
 96 
 97         bool operator== ( const reverse_iterator & rhs ) const
 98         {
 99             return current == rhs.current;
100         }
101 
102         bool operator!= ( const reverse_iterator & rhs ) const
103         {
104             return !( *this == rhs );
105         }
106 
107     private:
108         Node * current;
109 
110         Object & retrieve( ) const
111         {
112             return current->data;
113         }
114 
115         reverse_iterator( Node * p ) : current( p ) { }
116 
117         friend class List<Object>;
118     };

下面代码是返回特殊位置的迭代器

 1 reverse_iterator rbegin( )
 2     {
 3         return reverse_iterator( tail->prev );
 4     }
 5     const_reverse_iterator rbegin( ) const
 6     {
 7         return const_reverse_iterator( tail->prev );
 8     }
 9     //逆向begin迭代器,返回tail的前一个迭代器。
10     
11     reverse_iterator rend( )
12     {
13         return reverse_iterator( head );
14     }
15     const_reverse_iterator rend( ) const
16     {
17         return const_reverse_iterator( head );
18     }
19     //逆向end迭代器,返回head节点的迭代器。

 

 

 

 

 

 

 

 

 

posted @ 2012-10-15 23:42  alan_forever  阅读(360)  评论(0编辑  收藏  举报