You are on page 1of 47

Estructura de datos Lista.

Implementación dinámica.
Modelo de Lista. Características:
• Espacio para guardar los

Conjunto: datos.

Acciones:
– Homogéneo Todos los • Insertar elementos
elementos del conjunto, son del • Al inicio.
mismo tipo. • Al final.
• En una posición específica.
– Lineal. Cada elemento tiene • Buscar elemento.
un elemento anterior y uno • Ver elemento.
siguiente, excepto el primero y el
• Modificar elemento.
último
• Eliminar elemento.
• Ordenar elementos.
• Limpiar lista.

2
Memoria dinámica (Programación).

La memoria dinámica es la memoria que se reserva en tiempo
de ejecución y conforme se va necesitando. Es antónimo de
memoria estática (arreglos, por ejemplo).

Ventaja principal: No se limita el espacio de almacenamiento
de datos a una cantidad predispuesta por la declaración de la
estructura estática . La principal desventaja es la complejidad
temporal y espacial que conlleva trabajar con las estructuras
dinámicas.

3
Lista dinámica.
Conjunto de datos, homogéneo y
lineal, que reserva y libera un
Lista + Memoria dinámica = espacio de memoria cuando lo
necesita.
Existen varias implementaciones computacionales que representan a una lista
dinámica, por sus propias características, se conocen como:

Lista simplemente ligada.

Lista doblemente ligada.

Lista simplemente ligada circular.

Lista doblemente ligada circular.

Lista sin encabezado.

Lista con encabezado.
4
Lista simplemente ligada.
primero

d₁ d₁ d₁ ... d₁ d₁

Nodo
nullptr

Apuntador a nodo d₁

dato Apuntador a nodo

5
Lista simplemente ligada.
Implementación en C++.
class Lista{ class Nodo{ Convencionalmente, los
private: private: valores de posición, aunque
Nodo* primero; TD dato; no se trata de un arreglo, se
int cont; Nodo* sig; trabajan de:
public: public:
void insertaEn(TD& dato, int pos); Nodo(TD& dato);
TD* recupera(Nodo* nodo); void setDato(TD& dato); 0 a n-1
void elimina(Nodo* e); void setSig(Nodo* sig);
Nodo* localiza(TD buscado); TD* getDato();
void anula(); cantidad de
Nodo* getSig(); n = elementos en la
void ordena(); }
} estructura

6
Lista simplemente ligada
Además de los métodos anteriormente
mencionados, existen otros que facilitan la
programación y uso de una lista dinámica. A
continuación se muestra un listado de los métodos
que comúnmente se programan para representar
una lista, utilizando memoria dinámica.

7
Métodos de lista simplemente ligada.
Nodo(); void insertaEn(TD& dato, int pos);

bool vacia(); TD* recupera(Nodo* r);

Nodo* getPrimero(); void elimina(int pos);

Nodo* getUltimo(); void elimina(Nodo* e);

Nodo* getAnterior(Nodo* act); Nodo* localiza(TD& dato);

Nodo* getSiguiente(Nodo* act); void anula();

void insertaInicio(TD& dato); void ordena();

void insertaFinal(TD& dato);


8
Lista::Lista()
primero cont = 0

nullptr

Ancla al primer nodo de la lista

9
bool Lista::vacia()
primero
La lista está vacía.

primero

d₁ ... La lista NO está vacía.

10
Nodo* Lista::getPrimero()
primero
Devuelve nullptr

primero

d₁ ... Devuelve la dirección de memoria,


almacenada en la variable primero.

11
Nodo* Lista::getUltimo()
si la lista está vacia:
primero devolver nullptr

12
Nodo* Lista::getUltimo()
si la lista está vacia:
devolver nullptr
primero auxiliar = primero

d1 d2 d3 ... dn-1 dn

aux

13
Nodo* Lista::getUltimo()
si la lista está vacia:
devolver nullptr
primero auxiliar = primero
mientras el siguiente de
d1 d2 d3 ... dn-1 dn auxiliar no sea nullptr:
auxiliar = siguiente de auxiliar

aux

14
Nodo* Lista::getUltimo()
si la lista está vacia:
devolver nullptr
primero auxiliar = primero
mientras el siguiente de
d1 d2 d3 ... dn-1 dn auxiliar no sea nullptr:
auxiliar = siguiente de auxiliar

aux

15
Nodo* Lista::getUltimo()
si la lista está vacia:
devolver nullptr
primero auxiliar = primero
mientras el siguiente de
d1 d2 d3 ... dn-1 dn auxiliar no sea nullptr:
auxiliar = siguiente de auxiliar

aux

16
Nodo* Lista::getUltimo()
si la lista está vacia:
devolver nullptr
primero auxiliar = primero
mientras el siguiente de
d1 d2 d3 ... dn-1 dn auxiliar no sea nullptr:
auxiliar = siguiente de auxiliar

aux

17
Nodo* Lista::getUltimo()
si la lista está vacia:
devolver nullptr
primero auxiliar = primero
mientras el siguiente de
d1 d2 d3 ... dn-1 dn auxiliar no sea nullptr:
auxiliar = siguiente de auxiliar
devolver auxiliar

aux

18
Nodo* Lista::getSiguiente(Nodo* actual)
si la lista está vacía o no existe
primero actual:
devolver nullptr

19
Nodo* Lista::getSiguiente(Nodo* actual)
si la lista no está vacía o no existe
primero actual:
devolver nullptr
d1 d2 d3 d4 dn Si no:
devolver la dirección del nodo
siguiente de actual.

actual

20
Nodo* Lista::getAnterior(Nodo* actual)
si la lista está vacía o no existe
primero actual:
devolver nullptr

21
Nodo* Lista::getAnterior(Nodo* actual)
si la lista está vacía o no existe
primero actual:
devolver nullptr
d1 d2 d3 d4 ... dn
si no
auxiliar = primero

aux actual

22
Nodo* Lista::getAnterior(Nodo* actual)
si la lista está vacía o no existe
primero actual:
devolver nullptr
d1 d2 d3 d4 ... dn
si no
auxiliar = primero
mientras el siguiente de auxiliar
no sea el actual
auxiliar = siguiente de auxiliar
aux actual

23
Nodo* Lista::getAnterior(Nodo* actual)
si la lista está vacía o no existe
primero actual:
devolver nullptr
d1 d2 d3 d4 ... dn
si no
auxiliar = primero
mientras el siguiente de auxiliar
no sea el actual
auxiliar = siguiente de auxiliar
aux actual

24
Nodo* Lista::getAnterior(Nodo* actual)
si la lista está vacía o no existe
primero actual:
devolver nullptr
d1 d2 d3 d4 ... dn
si no
auxiliar = primero
mientras el siguiente de auxiliar
no sea el actual
auxiliar = siguiente de auxiliar
devolver auxiliar
aux actual

25
Nodo* Lista::localiza(TD dato)
primero auxiliar = primero

d1 d2 d3 dato ... dn

aux

26
Nodo* Lista::localiza(TD dato)
primero auxiliar = primero
mientras (auxiliar != nullptr)
d1 d2 d3 dato ... dn auxiliar = siguiente de auxiliar
si el dato de auxiliar == dato
detenerse

aux

27
Nodo* Lista::localiza(TD dato)
primero auxiliar = primero
mientras (auxiliar != nullptr)
d1 d2 d3 dato ... dn auxiliar = siguiente de auxiliar
si el dato de auxiliar == dato
detenerse

aux

28
Nodo* Lista::localiza(TD dato)
primero auxiliar = primero
mientras (auxiliar != nullptr)
d1 d2 d3 dato ... dn auxiliar = siguiente de auxiliar
si el dato de auxiliar == dato
detenerse

aux

29
Nodo* Lista::localiza(TD dato)
primero auxiliar = primero
mientras (auxiliar != nullptr)
d1 d2 d3 dato ... dn auxiliar = siguiente de auxiliar
si el dato de auxiliar == dato
detenerse
devolver el nodo auxiliar
aux

30
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn

dn+1

nuevo
pos = 3
cont = n

31
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0

aux dn+1

nuevo
pos = 3
i=0
cont = n

32
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0
mientras iterador < pos
auxiliar = siguiente de auxiliar
incrementa iterador
aux dn+1

nuevo
pos = 3
i=1
cont = n

33
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0
mientras iterador < pos
auxiliar = siguiente de auxiliar
incrementa iterador
aux dn+1

nuevo
pos = 3
i=2
cont = n

34
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0
mientras iterador < pos
auxiliar = siguiente de auxiliar
incrementa iterador
aux dn+1

nuevo
pos = 3
i=3
cont = n

35
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0
mientras iterador < pos
auxiliar = siguiente de auxiliar
incrementa iterador
ant aux dn+1 anterior = anterior de aux
siguiente de nuevo = auxiliar
si existe anterior:
siguiente de anterior =
nuevo nuevo
si no:
pos = 3 primero = nuevo
i=3 incrementa contador
cont = n

36
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0
mientras iterador < pos
auxiliar = siguiente de auxiliar
incrementa iterador
ant aux dn+1 anterior = anterior de aux
siguiente de nuevo = auxiliar

nuevo
pos = 3
cont = n

37
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0
mientras iterador < pos
auxiliar = siguiente de auxiliar
incrementa iterador
ant aux dn+1 anterior = anterior de aux
siguiente de nuevo = auxiliar
si existe anterior:
siguiente de anterior = nuevo
nuevo
pos = 3
cont = n

38
void Lista::insertaEn(TD& dato, int pos)
si 0>pos>cont
salir
primero si no:
crear nodo nuevo con dato

d1 d2 d3 d4 ... dn
auxiliar = primero
iterador = 0
mientras iterador < pos
auxiliar = siguiente de auxiliar
incrementa iterador
ant aux dn+1 anterior = anterior de aux
siguiente de nuevo = auxiliar
si existe anterior:
siguiente de anterior = nuevo
nuevo si no:
primero = nuevo
pos = 3 incrementa contador
cont = n+1

39
void Lista::insertaInicio(TD& dato)
insertaEn( dato, 0)

void Lista::insertaInicio(TD& dato)


insertaEn( dato, cont )

40
TD* Lista::recupera(Nodo* actual)
primero devolver la dirección del
dato almacenado actual
d1 d2 d3 d4 ... dn

actual

cont = n

41
void Lista::elimina(Nodo* e)
si no existe e:
salir
primero e
ó
cont = 0

42
void Lista::elimina(Nodo* e)
si no existe e:
primero salir
si no:
d1 d2 d3 d4 ... dn anterior = nodo anterior a e

ant e

cont = n

43
void Lista::elimina(Nodo* e)
si no existe e:
primero salir
si no:
d1 d2 d3 d4 ... dn anterior = nodo anterior a e
si existe anterior:
siguiente de anterior =
ant e
siguiente de e

cont = n

44
void Lista::elimina(Nodo* e)
si no existe e:
primero salir
si no:
d1 d2 d3 d4 ... dn anterior = nodo anterior a e
si existe anterior:
siguiente de anterior =
ant e
siguiente de e
libera memoria de e
cont = n

45
void Lista::elimina(Nodo* e)
si no existe e:
primero salir
si no:
d1 d2 d3 d4 ... dn anterior = nodo anterior a e
si existe anterior:
siguiente de anterior =
ant e
siguiente de e
libera memoria de e
cont = n-1 decrementa contador

46
Otros.
Los métodos:

void elimina(Nodo* e);

void anula();
Se dejarán a la comprensión del lector.

47

You might also like