Implementad un nuevo método de la clase List para mover
el contenido apuntado por un iterador al inicio de la lista. En caso de
que el iterador ya apunte al primer elemento de la lista, entonces el
método no hará nada. Entre los archivos que se adjuntan en este
ejercicio, encontraréis list.hh, donde hay una
implementación de la clase genérica List.
/**
* @pre 'it' apunta a algún elemento de la lista implícita no vacía.
*
* @post 'it' continúa apuntando al mismo elemento, el cual ha sido movido
* al inicio de la llista. No se ha reservado ni liberado memoria.
* En el caso en que el elemento apuntado por 'it' ya fuese el
* primero, nada ha cambiado.
*/
void moveToBeginning(iterator &it)
(Encontraréis la declaración de moveToBeginning al final
del fichero list.hh, que es bastante largo.)
No toquéis el resto de la implementación de la clase
List, excepto si, por algún motivo, consideráis que
necesitáis añadir algún método auxiliar a la parte privada. Entre los
archivos que se adjuntan al ejercicio (icono del gatito) está el
programa principal, main.cc, que podéis compilar.
Los ficheros públicos (icono del gatito) incluyen un
.tar con main.cc, list.hh y un
Makefile. También se incluye una copia de los juegos de
prueba públicos por comodidad. En la carpeta donde se descompriman se
puede: compilar con "make"; y testear con
"make test".
El main.cc ya se encarga de leer la entrada, procesar
los comandos y producir la salida. Para entregar, solo hay que subir al
Juez vuestro fichero list.hh modificado.
La entrada del programa es una secuencia de instrucciones del siguiente tipo que se irán aplicando sobre una lista que inicialmente está vacía y un iterador que está situado inicialmente al principio (y final) de esta lista:
push_front s // s es un string
push_back s // s es un string
pop_front
pop_back
it++
it--
*it
moveToBeginning // el método que debéis implementar
print_list // muestra la lista entera en la salida
Se puede suponer que la secuencia de entrada será correcta (es decir:
sin pop_front ni pop_back sobre lista vacía,
ni *it ni moveToBeginning teniendo
it situado en el end de la lista; tampoco
habrá pop_front justo cuando el iterador esté apuntando al
primer elemento de la lista, ni habrá pop_back justo cuando
el iterador esté apuntando al último elemento de la lista; tened en
cuenta que el último elemento de la lista no es el end de
la lista).
El programa principal que os ofrecemos ya se encarga de leer estas
entradas y hacer las llamadas a los correspondientes métodos de la clase
List. Solo tenéis que implementar el método antes
mencionado.
El programa principal ya se encarga de producir la salida: para cada
instrucción *it, escribe el contenido apuntado por el
iterador; y para cada instrucción print_list se muestra el
contenido de toda la lista.
Input
push_back a it-- *it print_list moveToBeginning print_list push_back b it++ *it print_list moveToBeginning print_list push_front c it++ *it print_list moveToBeginning print_list
Output
a a a b a b b a a c b a a c b