Universidad de Costa Rica
|
|
Duración: dos horas. Lea bien el examen antes de hacerlo. El examen es a libro abierto. Cuenta la documentación. Cuenta la redacción y la ortografía. Puede hacer el examen con lápiz. Resuelva tres de las cuatro preguntas. ¡No haga más de lo que se le pide!
1) [33 pts]
L->last ───────────────────────────────────────┐ │ ┌────────────┐ ┌────────────┐ ┌───────────┐ │ │ v │ v │ v v │ ┌────────┬───┐ │ ┌────────┬───┐ │ ┌────────┬───┐ │ │ elem_1 │ ├─┼─┘ │ elem_2 │ ├─┼─┘ │ elem_3 │ ├─┼─┐ │ └────────┴───┘ └────────┴───┘ └────────┴───┘ │ │ ^ next ^ │ │ │ │ │ │ first last v └───────<───────────────<────────────────<─────────┘ |
clist
La clase
clist
es una
lista circular, en que el último nodo apunta al primero. A
diferencia de una lista tradicional, en que en el
Rep hay un
puntero al primer nodo, en una lista circular el puntero del
Rep apunta al último nodo, de manera que se pueden
hacer inserciones eficientemente tanto al principio como al final
de la lista.
1.a) [0 pts] Dibuje el modelo para la lista circular L=(4,1,3,2).
1.b) [33 pts]
Implemente
el
método
clist::Orden_4132()
que reacomoda los nodos de la
lista "L" de manera que queden ordenados usando únicamente
instrucciones de asignación. No use otro tipo de
sentencias; tampoco trate de escribir un algoritmo general: basta
que las 6 asignaciones funcionen para esta lista "L". Use 6 o
menos asignaciones de
punteros, para que
los nodos de la lista "L" queden en orden ascendente (1,2,3,4). En
su solución usted puede usar sólo un
puntero como
variable temporal. Al hacer su solución debe mostrar el
diagrama de la lista después de que se ejecuta cada
instrucción.
1.c) [0 pts]
Si usara una lista sencilla, en que el
Rep tiene un
puntero al primer nodo de la cadena de nodos, y en el
último está el puntero nulo, ¿cómo
quedaría implementado el algoritmo que debe usar para
clist::Orden_4132()
?
2) [33 pts]
Lista& Lista::copy(const Lista& LO) { // *this = LO if (&LO == this) { // evita autocopia return *this; } while ( _prm != 0 ) { // borra todo nodo *p = _prm; _prm = _prm->next; delete p; } nodo *p = LO._prm; // copia while (p != 0) { push_back( p->_val ); p = p->next; } return *this; } // Lista::copy() |
2.a) [2 pts]
Dibuje el
modelo de la clase
Lista
.
2.b) [14 pts]
Implemente el
método
Lista::copy()
sin acceder al
Rep de Lista
. Use únicamente los
métodos públicos de Lista
.
2.c) [14 pts]
Implemente Lista::push_front()
sin acceder al
Rep. Puede copiar los valores de la lista, o la lista
completa si lo desea.
2.d) [3 pts]
Explique qué ventaja se deriva de implementar los
métodos de Lista
sin acceder al Rep.
3) [33 pts] El método de ordenamiento de la burbuja intercambia valores en un vector hasta que todo queda ordenado.
A[0].key = -∞; for (i=2; i<n; ++i) { j = i; while (A[j] < A[j-1]) { swap(A[j], A[j-1]); j = j-1 } } |
void ADH_list::swap(ADH_list& L) { /* resultado Intercambia *this <==> L */ nodo *tmp = L._prm; L._prm = _prm; _prm = tmp; } |
3.a) [7 pts]
Especifique el método Lista::Ordena_Burbuja()
para la clase Lista
.
3.b) [26 pts] Implemente
Lista::Ordena_Burbuja()
. Use únicamente los
métodos de la lista que fueron definidos como
públicos en la
cuarta tarea programada, evitando de esta forma acceder al
Rep de la lista
[operator=()
,
push_front()
,
push_back()
,
pop_front()
,
pop_back()
,
empty()
,
first()
].
No hace falta que su solución sea eficiente, por lo que
puede usar varias listas temporales para hacer su trabajo.
También puede copiar los valores de la lista.
4) [33 pts] Una manera de lograr que un contenedor sea polimórfico es derivar el objeto contenido de una clase base común,
Chunche
.
4.a) [4 pts]
Declare la clase Chunche
que tiene algunas de las
operaciones básicas de una clase.
4.b) [3 pts] Dibuje la jerarquía de chunches que usted almacenará en la lista porlimórfica: puntos, cuadrados, círculos, autos, casas, animales, perros y gatos.
4.c) [3 pts]
Los nodos de una la lista polimórfica
ListaPoli
contienen dos punteros: el puntero
"next
" hacia el siguiente nodo, y un puntero al
Chunche
que corresponde al nodo. Dibuje el
modelo de la clase
ListaPoli
.
4.d) [8 pts]
Escriba la
declaración del
Rep de ListaPoli
, de su nodo y de su
iterador. Para el
iterador ListaPoli::iterador
use un Rep
que contenga únicamente un puntero hacia el nodo.
++
avanza y
--
retrocede).
4.f) [4 pts]
Implemente el operador de
derreferencia de
ListaPoli::iterador
.
4.g) [7 pts]
Suponga que en la clase Chunche
usted definió
el método virtual Grabe(iostream &)
.
Úselo para implementar una operación que graba toda
la lista. No puede acceder al Rep de la lista.
Adolfo Di Mare <adolfo@di-mare.com>.
|