GuiaEDDSol1 - Chien

CIT-2000 Estructuras de Datos
Guía Ejercicios E.D.D
2011
Guía Ejercicios Estructuras de Datos
Autor: Juan Ignacio Canales
Para los problemas 1-4:
Considere la siguiente definición de nodo, para una lista enlazada simple:
class Nodo
{
int data;
Nodo *next;
}
1. Implemente la función:
int reparar(Nodo *cabeza, int x, int correccion)
La que recorre la lista, sumando el valor de 'correccion' a cada nodo de la lista que
tenga su atributo 'data' igual a 'x'.
2. Implemente una función que reciba dos listas como parámetros (x, y) y devuelva una
sola lista, que corresponda a la concatenación de las dos listas entregadas por
parámetro (la lista x seguida de la lista y). No altere las listas originales.
3. Implemente una función que permita borrar un elemento de la lista que esté en una
posición entregada por parámetro (considere el valor 0 para el primer nodo de la lista),
y luego utilice esa función para construir la siguiente:
void crop(Nodo *cabeza, int *excepciones)
Que dada una cabeza de lista y un arreglo de enteros, elimine de la lista todos los
elementos cuya posición no sea ninguna de los valores contenidos dentro del arreglo
'excepciones'. (Considere las posiciones antes de empezar a eliminar)
4. Proponga una declaración de Nodo que permita crear listas enlazadas de listas
enlazadas. (cada nodo contiene una lista)
Para los problemas 5-7:
Considere los siguientes TDA's y asuma que sus métodos ya han sido implementados
correctamente:
class Pila
{
int pop();
void push(int dato);
bool vacia();
}
Class Cola
{
int desencolar();
void encolar(int dato);
bool vacia();
1/3
CIT-2000 Estructuras de Datos
Guía Ejercicios E.D.D
2011
5. Defina una función que reciba una Pila como parámetro y devuelva la cantidad de
elementos que tiene, sin alterar el orden o la cantidad de elementos que contenga.
6. Defina la clase 'ListaMixta', la que implementa los métodos push, pop, desencolar y
encolar, y opera sobre una misma lista de elementos. Para efectos de implementación
considere que la extracción de elementos se hace desde el inicio de la lista.
7. Se insertan mediante push() en una pila, los siguientes elementos (en este orden):
1, 40, 2, 50, 3, 60, 45, 33, 65, 21, 19, 4, 5
Luego la pila es vaciada, y a medida que los elementos son extraídos, los elementos
pares se insertan en una cola mediante encolar() y los impares se insertan en otra
pila.
Responda:
a) ¿En qué orden se extraerán los elementos de la pila de impares?
b) ¿Y de la cola de pares?
c) Si luego de hacer las operaciones del enunciado, se extraen 2 elementos de la pila
de pares para insertarlos en la cola de impares, y luego se extraen todos los
elementos de la cola y la pila (en ese orden), ¿Cuál es el orden en que se extraen
los elementos?
Para los problemas 8-12:
Considere el siguiente nodo llamado 'Persona':
string nombre, oficio, sexo;
Persona *padre, *madre;
Persona *hermano_menor_sig;
Persona *primer_hijo;
Persona *conyuge;
Persona *amigos[]; // arreglo de amigos de la persona
int namigos; // numero de amigos de la persona
Considere que hermano_menor_sig apunta al hermano inmediatamente menor, por lo
tanto el hermano menor de todos tendrá ese puntero nulo.
8. Implemente la función
int cuantosBisNietos(Persona *p)
La que retorna la cantidad de bisnietos que la persona 'p' recibida por parámetro tiene.
9. Implemente la función
2/3
CIT-2000 Estructuras de Datos
Guía Ejercicios E.D.D
2011
void tenerHijo(Persona *p, Persona *hijo)
Que agrega un hijo a la persona 'p', asumiendo que el hijo lo tiene con su cónyuge (si
tiene) y el hijo agregado es recién nacido (el menor).
10. Implemente un método que reciba como parámetro una persona, un sexo y un oficio
determinados, e imprima el nombre de todas las personas directamente relacionadas
a ella, que tengan el sexo y oficio recibidos por parámetro.
11. Implemente una función que, dadas dos personas 'p' y 'q', imprima cual es el
parentezco directo entre ellas, si es que existe.
12. Construya una función que imprima el árbol familiar de una persona determinada,
avanzando 3 generaciones. (hasta los bisnietos). El orden de impresión es irrelevante.
Considere solamente la descendencia de la persona.
Desafíos extra:
13. Defina una función recursiva que permita recorrer una lista enlazada simple.
14. Para la E.D.D 'Persona' definida, implemente un método que determine si la persona
'p' tiene a sus padres separados.
15. Para la misma estructura, defina una función que permita imprimir el árbol familiar
completo de una persona (todas las generaciones).
16. Defina una clase ColaDePrioridad que mantenga el siguiente invariante: “Al extraer
un elemento de la cola, siempre se extraerá el de atributo 'data' de mayor valor”.
Defina métodos 'int extraer()', 'void insertar(int)' y 'bool vacia()', y todas las estructuras
que considere necesarias.
Proponga alternativas a la lista enlazada e indique las ventajas y desventajas.
17. Para la estructura de datos definida en el punto 4, implemente la siguiente función:
void eliminar(NodoCompuesto *c, int dato)
La cual elimina de la lista (y de las sublistas de cada nodo) todos los nodos que
tengan el atributo 'data' igual al parámetro 'dato'.
3/3