clase_lista_enlazada
// Implementación de una lista simplemente enlazada genérica.
// La lista NO utiliza celda de cabecera.
// Sólo tiene puntero a principio (no tiene puntero a fin)
//
// Estructuras de Datos, UNICAN
// Revisión: Oct-2011
// Autor: Pablo Sanchez (p.sanchez@unican.es)
// http://personales.unican.es/sanchezbp
// La clase E que se usa como parámetro genérico debe implementar
// un método igual
PARAMETRO E ES CLASE HEREDA DE ComparableIgualdad
FINPARAMETRO
CLASE ListaEnlazada(E) ES
 //-----------------------------------------------------//
 // Declaración del tipo de datos Celda //
 //-----------------------------------------------------//
 HEREDABLE CLASE Nodo(E) ES
 e : E;
 sig : Nodo(E);
 FINCLASE
 HEREDABLE lista : Nodo(E);
 //-----------------------------------------------------//
 // Constructores
 //-----------------------------------------------------//
 PUBLICO CONSTRUCTOR() ES
 lista := NULO;
 FINCONSTRUCTOR
 PUBLICO CONSTRUCTOR(punteroaNodo : Nodo(E)) ES
 lista := punteroaNodo;
 FINCONSTRUCTOR
 //-----------------------------------------------------//
 // Operaciones para manipular las listas //
 //-----------------------------------------------------//
 PUBLICO FUNCION esVacia() : Booleano ES
 DEVOLVER (lista == NULO);
 FINFUNCION
 PUBLICO PROCEDIMIENTO insertaPrimero(eInsertar : E) ES
 nuevoNodo: Nodo(E);
 nuevoNodo := NUEVO Nodo(E)();
 nuevoNodo.e := eInsertar;
 nuevoNodo.sig := lista;
 lista := nuevoNodo;
 FINPROCEDIMIENTO
 PUBLICO PROCEDIMIENTO borra(eBorrar : E) ES
 SI (lista != NULO) ENTONCES
 SI (lista.e.igual(eBorrar)) ENTONCES
 lista := lista.sig;
 SINO
 aux : Nodo(E);
 aux := lista;
 MIENTRAS ((aux.sig != NULO) AND
 (NOT(aux.sig.e.igual(eBorrar)))) HACER
 aux := aux.sig;
 FINMIENTRAS
 SI (aux.sig != NULO) ENTONCES
 aux.sig := aux.sig.sig;
 FINSI
 FINSI
 FINSI
 FINPROCEDIMIENTO
 PUBLICO FUNCION busca(eBuscar : E) : E ES
 result : E; result := NULO;
 aux : Nodo(E);
 aux := buscaPunteroA(e);
 SI (aux != NULO) ENTONCES
 result := aux.e;
 FINSI
 DEVOLVER result;
 FINFUNCION
 PUBLICO PROCEDIMIENTO actualiza(eAntiguo : E, eNuevo : E) ES
 aux : Nodo(E)
 aux := buscaPunteroA(eAntiguo);
 SI (aux != NULO) ENTONCES
 aux.e := eNuevo;
 FINSI
 FINPROCEDIMIENTO
 //-----------------------------------------------------//
 // Funciones auxiliares //
 //-----------------------------------------------------//
 FUNCION buscaPunteroA(eBuscar : E) : Nodo(E) ES
 aux : Nodo(E);
 aux := lista;
 MIENTRAS ((aux != NULO) AND
 (NOT (aux.e.igual(eBuscar)))) HACER
 aux := aux.sig;
 FINMIENTRAS
 DEVOLVER aux;
 FINFUNCION
FINCLASE