Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_dynSlist.H
1 
2 # ifndef TPL_DYNSLIST_H
3 # define TPL_DYNSLIST_H
4 
5 # include <tpl_slist.H>
6 
7 using namespace Aleph;
8 
9 namespace Aleph {
10 
20  template <typename T>
21 class DynSlist : public Slist<T>
22 {
23 
24 private:
25 
26  size_t num_items;
27  int current_pos;
28  Snode<T> * current_node;
29  typename Slist<T>::Node * get_previous_to_pos(const int & pos)
30  {
31 
32  if (pos > num_items)
33  throw std::out_of_range ("position out of range");
34 
35  if (pos < current_pos) // hay que retroceder?
36  { // Si, reinicie posición actual
37  current_pos = 0;
38  current_node = this;
39  }
40  while (current_pos < pos) // avanzar hasta nodo predecesor a pos
41  {
42  current_node = current_node->get_next();
43  ++current_pos;
44  }
45  return current_node;
46  }
47 
48 public:
49 
51  DynSlist() : num_items(0), current_pos(0), current_node(this)
52  {
53  // Empty
54  }
70  T & operator [] (const size_t & i)
71 
72  throw(std::exception, std::out_of_range)
73 
74  {
75  return get_previous_to_pos(i)->get_next()->get_data();
76  }
77 
79  size_t size() const { return num_items; }
80 
92  void insert(const int & pos, const T & data)
93 
94  throw(std::exception, std::bad_alloc, std::out_of_range)
95 
96  { // apartar nodo para nuevo elemento
97  typename Slist<T>::Node * node = new typename Slist<T>::Node (data);
98  typename Slist<T>::Node * prev = get_previous_to_pos(pos);
99  prev->insert_next(node);
100  ++num_items;
101  }
107  void remove(const int & pos)
108 
109  throw(std::exception, std::range_error)
110 
111  { // obtener nodo predecesor al nuevo elemento
112  typename Slist<T>::Node * prev = get_previous_to_pos(pos);
113  typename Slist<T>::Node * node_to_delete = prev->remove_next();
114  delete node_to_delete;
115  --num_items;
116  }
119  { // eliminar nodo por nodo hasta que la lista devenga vacía
120  while (not this->is_empty())
121  delete this->remove_first(); // remove_first de clase Slink
122  }
128  class Iterator : public Slist<T>::Iterator
129  {
130  public:
134  typedef T Item_Type;
135 
137  Iterator(DynSlist & list) : Slist<T>::Iterator(list) { /* Empty */ }
138 
141  };
142 
143 };
144 
145 } // end namespace Aleph
146 
147 # endif // TPL_DYNSLIST_H
148 
Iterator(DynSlist &list)
Constructor.
Definition: tpl_dynSlist.H:137
Snode * remove_next()
Definition: tpl_snode.H:48
Definition: tpl_snode.H:22
void insert(const int &pos, const T &data)
Definition: tpl_dynSlist.H:92
Definition: tpl_dynSlist.H:21
Definition: tpl_dynSlist.H:128
DynSlist()
Constructor.
Definition: tpl_dynSlist.H:51
Definition: tpl_slist.H:20
Snode *& get_next()
Retorna el nodo siguiente a this.
Definition: tpl_snode.H:51
~DynSlist()
Destructor.
Definition: tpl_dynSlist.H:118
size_t size() const
Retorna la cantidad de elementos que tiene la lista.
Definition: tpl_dynSlist.H:79
Node * get_current()
Definition: tpl_slist.H:112
T & get_data()
Retorna una referencia al dato contenido en el nodo.
Definition: tpl_snode.H:31
T Item_Type
El tipo de elemento que retorna get_current().
Definition: tpl_dynSlist.H:134
T & operator[](const size_t &i)
Definition: tpl_dynSlist.H:70
Node * remove_first()
Definition: tpl_slist.H:50
Definition: List.H:23
Slist< T > Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_dynSlist.H:132
T & get_current()
retorna una referencia al elemento actual.
Definition: tpl_dynSlist.H:140

Leandro Rabindranath León