M.Sc. Kenneth Sánchez S. U.C.R – Sede Guanacaste 2 ¿ QUE SON ? • Son conjuntos de datos relacionados entre sí de alguna forma que sólo se conoce en tiempo de ejecución, lo que impide ubicar memoria para ellos.
• Se construyen de forma que unos apuntan a
otros.
• Se “destruyen” dejando de apuntarse.
M.C.I. Kenneth Sánchez S. U.C.R – Sede Guanacaste 3 ¿Cuándo interesan? • Cuando las relaciones entre datos son cambiantes a lo largo de la ejecución – " el número de datos crece y disminuye " – Las relaciones van cambiando.
• Cuando ubicar memoria inicialmente (ej.
array) da pie a ubicar mucha más que la que se necesita. – "si ubicamos un array, puede que luego no lo llenemos ” M.C.I. Kenneth Sánchez S. U.C.R – Sede Guanacaste 4 LISTAS DOBLES
• Una lista doblemente enlazada es una
lista lineal en la que cada nodo tiene dos enlaces, uno al nodo siguiente, y otro al anterior.
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 5 OPERACIONES CON LISTAS DOBLES
• Añadir o insertar elementos.
• Buscar o localizar elementos. • Borrar elementos. • Moverse a través de la lista, siguiente y anterior.
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 6 INSERTAR UN ELEMENTO • Añadir elemento en una lista doblemente enlazada vacía: – Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que apunte a él, además el puntero que define la lista, que valdrá NULL: M.C.I. Kenneth Sánchez S. U.C.R – Sede Guanacaste 7 INSERTAR UN ELEMENTO (cont) • El algoritmo es muy simple, bastará con que: que: 1. lista apunta a nodo. nodo. 2. Lista.siguiente y lista.anterior apunten a null.
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 8 Insertar un elemento en la primera posición de la lista: • Partimos de una lista no vacía. Para simplificar, vacía. simplificar, consideraremos que lista apunta al primer elemento de la lista doblemente enlazada. enlazada. El algoritmo es el siguiente siguiente:: 1. Nodo.siguiente debe apuntar a Lista. Lista. 2. Nodo.anterior apuntará a Lista..anterior. Lista anterior. 3. Lista..anterior Lista debe apuntar a nodo. nodo.
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 9 Insertar un elemento en la última posición de la lista: • Igual que en el caso anterior, partiremos de una lista no vacía, vacía, y de nuevo para simplificar, simplificar, que Lista está apuntando al último elemento de la lista: lista: • El algoritmo es el siguiente siguiente:: 1. nodo.siguiente debe apuntar a Lista.siguiente (NULL). 2. Lista.siguiente debe apuntar a nodo. nodo. 3. nodo.anterior apuntará a Lista.. Lista
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 10 Insertar un elemento a continuación de un nodo cualquiera de una lista:
• Partimos de una lista
no vacía, e insertaremos un nodo a continuación de uno nodo cualquiera que no sea el último de la lista:
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 11 Insertar a continuación de un nodo cualquiera (cont)
• El algoritmo sigue siendo muy
sencillo:: sencillo 1. Hacemos que nodo.siguiente apunte a lista.siguiente. lista.siguiente. 2. Hacemos que Lista.siguiente apunte a nodo. nodo. 3. Hacemos que nodo.anterior apunte a lista. lista. 4. Hacemos que nodo.siguiente. nodo.siguiente.anterior apunte a nodo. nodo.
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 12 Añadir elemento en una lista doblemente enlazada, caso general:
1. Si lista está vacía hacemos que Lista apunte a nodo.
nodo. Y nodo.anterior y nodo.siguiente a NULL. nodo. 2. Si lista no está vacía vacía,, hacemos que nodo.siguiente apunte a Lista.siguiente Lista.siguiente.. 3. Después que Lista.siguiente apunte a nodo. nodo. 4. Hacemos que nodo. nodo.anterior apunte a Lista. Lista. 5. Si nodo.siguiente no es NULL, entonces hacemos que nodo.siguiente..anterior apunte a nodo. nodo.siguiente nodo.
M.C.I. Kenneth Sánchez S.
U.C.R – Sede Guanacaste 13 ALGORITMO PARA BORRAR • Localizamos el nodo de valor v • ¿Existe? Existe? – SI: SI: • ¿Es el nodo apuntado por lista lista?? – SI: SI: Hacer que lista apunte a otro sitio sitio.. • ¿Es el primer nodo de la lista? lista? – NO NO:: nodo.anterior.siguiente = nodo.siguiente • ¿Es el último nodo de la lista? lista? – NO NO:: nodo.siguiente. nodo.siguiente.anterior = nodo.anterior • Borrar nodo