Professional Documents
Culture Documents
Lista Dinamica
Lista Dinamica
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₁
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);
nullptr
9
bool Lista::vacia()
primero
La lista está vacía.
primero
10
Nodo* Lista::getPrimero()
primero
Devuelve nullptr
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)
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