EJERCICIO 1 INTERFAZ CLASE CColaBarcos TIPOS REGISTRO TipoElemento N numReg C pais[1..50] CPilaCarga pilaCarga CListaTripulacion listaTripulacion FINREGISTRO MÉTODOS // Constructor sin parámetros Crear() // Constructor de copia Crear(E CColaBarcos colaBarcos) // Destructor Destruir() // Inspección de barcos CListaTripulacion::TCadena Inspeccion() ... FIN CLASE CColaBarcos IMPLEMENTACIÓN CLASE CColaBarcos TIPOS REGISTRO NodoColaBarcos TipoElemento barco NodoColaBarcos *sig FINREGISTRO NodoColaBarcos *TipoPtrBarco ATRIBUTOS TipoPtrBarco ptrBarcoIni, ptrBarcoFin MÉTODOS // Constructor sin parámetros Crear() INICIO ptrBarcoIni = NULO ptrBarcoFin = NULO FIN Crear // Destructor Destruir() VAR TipoPtrBarco ptr INICIO MIENTRAS ptrBarcoIni != NULO HACER ptr = ptrBarcoIni ptrBarcoIni = ptrBarcoIni->sig LIBERAR(ptr) /* Llama automáticamente al destructor de la pila y la lista */ FINMIENTRAS FIN Destruir // Constructor de copia Crear(E CColaBarcos colaBarcos) VAR TipoPtrBarco ptr1 INICIO ptr1 = colaBarcos.ptrBarcoIni SI ptr1 != NULO ENTONCES // Primer barco ASIGNAR(ptrBarcoIni) ptrBarcoIni->sig = NULO ptrBarcoFin = ptrBarcoIni /* Al hacer la copia del barco, se llama automáticamente a los constructores de copia de las clases CPilaCarga y CListaTripulacion */ ptrBarcoFin->barco = ptr1->barco ptr1 = ptr1->sig MIENTRAS ptr1 != NULO HACER ASIGNAR(ptrBarcoFin->sig) ptrBarcoFin = ptrBarcoFin->sig ptrBarcoFin->sig = NULO /* Al hacer la copia del barco, se llama automáticamente a los constructores de copia de las clases CPilaCarga y CListaTripulacion */ ptrBarcoFin->barco = ptr1->barco ptr1 =ptr1->sig FINMIENTRAS FINSI FIN Crear // Método auxiliar: calcula la carga de un barco N CalcularCarga(E CPilaCarga pilaCarga) VAR N carga=0 CPilaCarga pilaCargaAux = pilaCarga CPilaCarga::TipoElemento paquete INICIO MIENTRAS NO pilaCargaAux.EstaVacia() HACER paquete = pilaCargaAux.Cima() carga = carga + paquete.peso pilaCargaAux.Desapilar() FINMIENTRAS DEVOLVER carga FIN CalcularCarga // Inspeccionar la carga de los barcos CListaTripulacion::TCadena Inspeccion() VAR TipoPtrBarco ptr1, ptr2 N cargaMaxima = 0, carga CListaTripulacion::TCadena nombre2Oficial="" CListaTripulacion::TipoElemento tripulante INICIO SI ptrBarcoIni != NULO ENTONCES /* Si no hay barcos, no hacemos nada, se devuelve una cadena vacía */ // Buscamos el barco de mayor carga ptr1 = ptrBarcoIni MIENTRAS ptr1 != NULO HACER carga = CalcularCarga (ptr1->barco.pilaCarga) SI carga >= cargaMaxima ENTONCES ptr2 = ptr1 /* ptr2 apunta al más cargado */ cargaMaxima = carga FINSI ptr1 = ptr1->sig FINMIENTRAS /* Vemos el nombre del segundo oficial. Si no hay segundo oficial a bordo, se devuelve la cadena vacía */ SI ptr2->barco.listaTripulacion.Longitud()>=2 ENTONCES // Hay segundo oficial tripulante = ptr2->barco.listaTripulacion.Consultar(2) nombre2Oficial = tripulante.nombre FINSI FINSI DEVOLVER nombre2Oficial FIN Inspeccion ... FIN CLASE CColaBarcos EJERCICIO 2 IMPLEMENTACIÓN CLASE CArbolBin TIPOS REGISTRO NodoABin TipoElemento dato NodoABin *izq, *der FINREGISTRO NodoABin *TArbol ATRIBUTOS TArbol ptrRaiz MÉTODOS ... Espejo(ES TArbol arbol) VAR TArbol aux INICIO SI arbol != NULO ENTONCES /* Si es nulo, no tengo que hacer nada */ aux = arbol->izq arbol->izq = arbol->der arbol->der = aux Espejo(arbol->izq) Espejo(arbol->der) FINSI FIN Espejo ... FIN CArbolBin EJERCICIO 3 TIPOS TNodo *TListaDoble REGISTRO TNodo Z dato TNodo *sig, *ant FINREGISTRO ALGORITMO Insertar (ES TListaDoble lista; E Z valor) VAR TListaDoble ptr, nuevo INICIO ASIGNAR(nuevo) nuevo->dato = valor SI lista == NULO ENTONCES //Primer elemento a insertar lista = nuevo lista->ant = NULO lista->sig = NULO SINO // Busca la posición de inserción ptr = lista MIENTRAS ((ptr->sig != NULO) Y(ptr->dato < valor)) HACER ptr = ptr->sig FINMIENTRAS SI ptr->dato < valor ENTONCES //Inserta al final ptr->sig = nuevo nuevo->ant = ptr nuevo->sig = NULO SINO //Insertamos antes SI lista ==ptr ENTONCES //Inserta al principio nuevo->sig = lista nuevo->ant = NULO lista->ant = nuevo lista = nuevo SINO // Inserta en la posición que corresponda ptr->ant->sig = nuevo nuevo->ant = ptr->ant ptr->ant = nuevo nuevo->sig = ptr FINSI FINSI FINSI FIN Insertar