class CSecuencia {
public:
CSecuencia ();
CSecuencia(const CSecuencia<TElem> &other) {copia(other);};
/*Constructor de copia de la secuencia; debe tener cuidado con la compartición de memoria, es decir, debe hacer una copia completa.
Parámetros:
other Objeto a copiar.
*/
~CSecuencia() {libera();};
CSecuencia<TElem>& operator= (const CSecuencia<TElem> &rhs);
/*Operador de asignación sobre secuencias; se preocupa de duplicar la estructura de la secuencia para que no exista compartición de memoria.
Parámetros:
rhs Secuencia a copiar.
Devuelve:
Una referencia a la nueva secuencia.*/
void inserta(const TElem &e);
/*Inserta un nuevo elemento en la secuencia, justo delante del punto de interés.
Parámetros:
e Elemento a añadir.
*/
void borra();
/*Elimina el elemento apuntado por el punto de interés.
Excepciones:
EAccesoIndebido si el punto de interés está al final, fuera de la secuencia.
*/
const TElem& actual() const;
/*Devuelve el elemento apuntado por el punto de interés.
Devuelve:
Elemento almacenado.
Excepciones:
EAccesoIndebido si el punto de interés está al final, fuera de la secuencia.*/
void avanza();
/*Avanza una posición el punto de interés.
Excepciones:
EAccesoIndebido si el punto de interés está al final, fuera de la secuencia, es decir, si esFin() == true.
Ver también:
CSecuencia::esFin().
*/
void reinicia();
/*Coloca el punto de interés al principio de la secuencia.*/
bool esFin() const;
/*Sirve para averiguar si el recorrido de la secuencia ha terminado, es decir, si el punto de interés ya no apunta a un elemento válido de la secuencia.
Devuelve:
true si el punto de interés está al final del recorrido.*/
bool esVacio() const;
/*Sirve para averiguar si la secuencia no tiene elementos.
Devuelve:
true si la secuencia está vacía.*/
int numElems() const;
/*Devuelve el número de elementos que tiene la secuencia.
Esta operación debe tener coste constante (O(1)).
Devuelve:
Número de elementos dentro de la secuencia.*/
void invertir();
void invertirAux(CNodoSecuencia<TElem> *act, CNodoSecuencia<TElem>*anterior);
private:
CNodoSecuencia<TElem> *_pri, *_ant;
int _longitud;
void libera();
void copia(const CSecuencia<TElem>& secuencia);
};
template <class TElem>
class CNodoSecuencia {
friend CSecuencia<TElem>;
public:
const TElem& elem() const;
CNodoSecuencia<TElem>* sig() const;
private:
TElem _elem;
CNodoSecuencia<TElem>* _sig;
CNodoSecuencia();
CNodoSecuencia(const TElem&, CNodoSecuencia<TElem>* = 0);
};