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_dyn_slist_nc.H
1 # ifndef TPL_DYN_SLIST_NC_H
2 # define TPL_DYN_SLIST_NC_H
3 
4 # include <tpl_snode_nc.H>
5 
6 namespace Aleph
7 {
24  template <typename T> class Dyn_Slist_Nc : public Snode_Nc <T>
25  {
26  public:
27  typedef Snode_Nc <T> Node;
28 
29  private:
30  Node * head;
31  size_t num_items;
32 
33  public:
34 
36  void empty()
37  {
38  while (not this->is_empty())
39  delete Node::remove_next();
40  this->reset();
41  head = this;
42  num_items = 0;
43  }
44 
55  T & insert(const T & data) throw(std::exception, std::bad_alloc)
56  {
57  Node * p = new Node(data);
58  Node::insert(p);
59 
60  if (num_items++ == 0)
61  head = p;
62 
63  return p->get_data();
64  }
65 
76  T & append(const T & data) throw(std::exception, std::bad_alloc)
77  {
78  I(head not_eq NULL);
79  Node * p = new Node(data);
80  head->insert(p);
81 
82  head = p;
83  ++num_items;
84  return p->get_data();
85  }
86 
88  T & get_first()
89  {
90  if (this->is_empty())
91  throw std::underflow_error("List is empty");
92 
93  return this->get_next()->get_data();
94  }
95 
97  T & get_last()
98  {
99  if (this->is_empty())
100  throw std::underflow_error("List is empty");
101 
102  return head->get_data();
103  }
104 
112  {
113  if (this->is_empty())
114  throw std::underflow_error("List is empty");
115 
116  Node * p = Node::remove_next();
117  T ret_val = p->get_data();
118  delete p;
119  if (--num_items == 0)
120  head = this;
121  return ret_val;
122  }
123 
125  T & put(const T & item) { return append(item); }
126 
128  T get() { return remove_first(); }
129 
131  T & rear() { return get_last(); }
132 
134  T & front() { return get_first(); }
135 
137  T & push(const T & item) { return insert(item); }
138 
140  T pop() { return remove_first(); }
141 
143  T & top() const { return get_first(); }
144 
145  const size_t & size() const { return num_items; }
146 
147  class Iterator : public Node::Iterator
148  {
149  /* TODO: Agregar atributos y métodos que hagan falta
150  la implementación de este iterador la hice minimalista
151  para pruebas de Dyn_Slist_Nc
152  */
153  public:
155  {
156  // empty
157  }
158 
159  T & get_current()
160  {
162  }
163 
164  T & get_curr() { return Dyn_Slist_Nc::Iterator::get_current(); }
165 
166  };
167 
169  Dyn_Slist_Nc() : Node(), head(this), num_items(0)
170  {
171  // empty
172  }
173 
175  Dyn_Slist_Nc(const Dyn_Slist_Nc & l) : Node(l), head(this), num_items(0)
176  {
177  for (Iterator it(const_cast <Dyn_Slist_Nc &>(l));
178  it.has_current(); it.next())
179  append(it.get_current());
180  }
181 
182  ~Dyn_Slist_Nc()
183  {
184  empty();
185  }
186 
196  {
197  if (this == &list)
198  return *this;
199 
200  empty();
201 
202  I(this->is_empty());
203 
204  for (Iterator it(const_cast<Dyn_Slist_Nc &>(list));
205  it.has_current(); it.next())
206  append(it.get_current());
207 
208  return *this;
209  }
210 
211  T & operator [] (const size_t & n)
212  {
213  Iterator it(*this);
214  for (int i = 0; i < n and it.has_current(); ++i, it.next());
215 
216  return it.get_curr();
217  }
218  };
219 }
220 
221 # endif
222 
Definition: tpl_dyn_slist_nc.H:24
Snode_Nc * get_current()
retorna puntero al nodo actual
Definition: tpl_snode_nc.H:65
Definition: tpl_dyn_slist_nc.H:147
T pop()
Si this es una pila, entonces elimina el tope.
Definition: tpl_dyn_slist_nc.H:140
void empty()
Vacía totalmente a la lista.
Definition: tpl_dyn_slist_nc.H:36
Dyn_Slist_Nc(const Dyn_Slist_Nc &l)
Constructor de copia.
Definition: tpl_dyn_slist_nc.H:175
Dyn_Slist_Nc()
Constructor vacío.
Definition: tpl_dyn_slist_nc.H:169
T & put(const T &item)
Si this es una cola, entonces mete el elemento item.
Definition: tpl_dyn_slist_nc.H:125
T & get_last()
Retorna una referencia al último elemento de la lista.
Definition: tpl_dyn_slist_nc.H:97
T & insert(const T &data)
Definition: tpl_dyn_slist_nc.H:55
T & top() const
Si this es una pila, entonces retorna el tope.
Definition: tpl_dyn_slist_nc.H:143
Definition: tpl_snode_nc.H:8
T remove_first()
Definition: tpl_dyn_slist_nc.H:111
T & push(const T &item)
Si this es una pila, entonces inserta item.
Definition: tpl_dyn_slist_nc.H:137
T & get_data()
Retorna una referencia al dato contenido en el nodo.
Definition: tpl_snode_nc.H:22
T & rear()
Si this e suna cola, entonces retorna el elemento más joven.
Definition: tpl_dyn_slist_nc.H:131
Snode_Nc *& get_next()
Retorna el nodo siguiente a this.
Definition: tpl_snode_nc.H:37
Dyn_Slist_Nc & operator=(const Dyn_Slist_Nc &list)
Definition: tpl_dyn_slist_nc.H:195
Definition: tpl_snode_nc.H:42
T & get_first()
Retorna una referencia al primer elemento de la lista.
Definition: tpl_dyn_slist_nc.H:88
T & front()
Si this e suna cola, entonces retorna el elemento más antiguo.
Definition: tpl_dyn_slist_nc.H:134
Definition: List.H:23
T & append(const T &data)
Definition: tpl_dyn_slist_nc.H:76
Snode_Nc * remove_next()
Definition: tpl_snode_nc.H:31

Leandro Rabindranath León