// 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

Última modificación: viernes, 26 de mayo de 2017, 10:19