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 únicamente las preguntas pares o las impares. Resuelva la mitad de las 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,3,2,1).
1.b) [33 pts]
Implemente
el
método
clist::Orden_4321()
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 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_4321()
?
2) [33 pts]
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.
2.a) [0 pts] Dibuje el modelo para la lista circular L=(8,9,6,7,2,4).
2.b) [33 pts]
Implemente
el
método
clist::Orden_896724()
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 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
(2,4,6,7,8,9). 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.
2.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_896724()
?
3) [33 pts] Las listas permiten trasladar grupos de los valores que contienen sin copiarlos, usando cirugía de punteros.
3.a) [8 pts]
Especifique en formato
"Doxygen" la
función
Splice()
para la lista, que sirve para trasladar
valores de una lista a otra usando cirugía de punteros.
3.b) [3 pts]
Especifique en formato
"Doxygen"
la función
Reverse()
que vuelve al revés los valores de una lista.
3.c) [22 pts]
Implemente Reverse()
. Utilice su
Splice()
para evitar accesar el
Rep de la
lista. Puede usar los métodos de la lista pero evite copiar
cualquiera de los valores que la lista contiene.
3.d) [0 pts]
Especifique el método list::size()
que
retorna la cantidad de valores almacenados en la lista.
4) [33 pts] Las listas permiten trasladar grupos de los valores que contienen sin copiarlos, usando cirugía de punteros.
4.a) [6 pts]
Especifique en formato
"Doxygen" la
función
Splice()
para la lista, que sirve para trasladar
valores de una lista a otra usando cirugía de punteros.
4.b) [5 pts]
Especifique en formato
"Doxygen" la
operación L.Merge(LL)
que funciona
intercalando en orden los valores de "L" y "LL" cuando ambas
listas están ordenadas.
4.c) [22 pts]
Implemente L.Merge(LL)
. Utilice su
Splice()
para evitar accesar el
Rep de la
lista. Puede usar los métodos de la lista pero evite copiar
cualquiera de los valores que la lista contiene. Debe implementar
el algoritmo de intercalación.
4.d) [0 pts]
Especifique el método list::size()
que
retorna la cantidad de valores almacenados en la lista.
Adolfo Di Mare <adolfo@di-mare.com>.
|