LISTAS DOBLEMENTE ENLAZADAS Una lista doblemente enlazada, est constituida por nodos que contienen tres campos: - Un campo para almacenar los datos. - Un campo de enlace que almacena la direccin de memoria del siguiente nodo. - Un campo de enlace que almacena la direccin de memoria del nodo anterior.
Representacin grfica:
Representacin grfica de una lista enlaza doble con datos:
Los punteros en una lista doblemente enlazada, se identifican de la siguiente manera:
Donde: p = puntero auxiliar o temporal. dato(p) = B, valor del dato apuntado por p. siguiente(p) = puntero que sigue despus de p, y apunta al siguiente nodo. anterior(q) = puntero que es anterior a p, y apunta al nodo anterior.
Las listas doblemente enlazadas se pueden recorrer en ambos sentidos a partir de cualquier nodo. Ocupan ms espacio en la memoria, que una lista enlazada simple, para una misma cantidad de informacin.
p siguiente(p) dato(p) Puntero siguiente Puntero anterior Dato D C primero NULO A NULO B D C primero NULO A NULO B anterior(p) UNSM: FISI: LP1-Ing. Humberto Valdera Rodrguez 2014 2
OPERACIONES EN UNA LISTA DOBLEMENTE ENLAZADA Las operaciones que se realizan en una lista doblemente enlazada, son las siguientes: - Insertar en una lista vaca, para lo cual se necesita crear una lista. - Insertar en una lista no vaca, la cual puede ser: al inicio, en el intermedio o al final de la lista. - Mostrar los elementos de la lista. - Buscar un elemento en la lista. - Eliminar un elemento, que puede estar: al inicio, en el intermedio o al final de la lista.
CREAR UNA LISTA Al crear una lista, sta no tiene nodo, ni elemento alguno, es decir est vaca, significa que el puntero al cual le llamaremos primero, apunta a NULO.
En forma grfica:
En seudocdigo: primero = NULO
INSERTAR ELEMENTOS EN LISTA DOBLEMENTE ENLAZADA
Insertar elemento en una LISTA VACA El proceso es el siguiente: 1) Crear un nuevo nodo, haciendo que un puntero auxiliar p, apunte al nuevo nodo.
En forma grfica:
En seudocdigo: p = nuevo nodo
2) Ingresar el dato en el nuevo nodo, haciendo que dato(p) capture al dato ingresado.
En forma grfica:
En seudocdigo: leer: dato(p)
3) Preguntamos: primero = NULO? Respuesta: S - Hacer que el puntero primero, apunte al nuevo nodo. - Hacer que el puntero sig(p), apunte a NULO. - Hacer que el puntero ant(p), apunte a NULO.
primero NULO p sig(p) ant(p) p sig(p) 2 ant(p) UNSM: FISI: LP1-Ing. Humberto Valdera Rodrguez 2014 3
En forma grfica:
En seudocdigo: primero = p sig(p) = NULO ant(p) = NULO
4) Resultado final:
Insertar elemento al INICIO de una LDE no vaca El proceso es el siguiente: 1) Crear un nuevo nodo, haciendo que un puntero auxiliar p, apunte al nuevo nodo.
En forma grfica:
En seudocdigo: p = nuevo nodo
2) Ingresar el dato en el nuevo nodo, haciendo que dato(p) capture al dato ingresado.
En forma grfica:
En seudocdigo: leer: dato(p)
3) Preguntamos: primero = NULO? Respuesta: No Hacer que un puntero auxiliar q, apunte al primero. Hacer que un puntero auxiliar w, apunte a sig(q).
En forma grfica:
NULO 2 NULO primero p sig(p) ant(p) p sig(p) 1 ant(p) primero NULO p sig(p) 2 ant(p) NULO NULO 2 NULO primero q w UNSM: FISI: LP1-Ing. Humberto Valdera Rodrguez 2014 4
En seudocdigo: q = primero w = sig(q)
4) Preguntamos: dato(p) < dato(q)? Respuesta: S Hacer que sig(p) apunte a primero. Hacer que primero apunte al nuevo nodo. Hacer que ant(p) apunte al ant(q)
En forma grfica:
En seudocdigo: sig(p) = primero primero = p ant(p) = ant(q) o ant(p) = NULO
Insertar elemento al FINAL de una LDE no vaca El proceso es el siguiente: 1) Crear un nuevo nodo, haciendo que un puntero auxiliar p, apunte al nuevo nodo.
En forma grfica:
En seudocdigo: p = nuevo nodo
2) Ingresar el dato en el nuevo nodo, haciendo que dato(p) capture al dato ingresado.
En forma grfica:
En seudocdigo: leer: dato(p)
3) Preguntamos: primero = NULO? Respuesta: No Hacer que un puntero auxiliar q, apunte al primero. Hacer que un puntero auxiliar w, apunte a sig(q).
En forma grfica:
En seudocdigo: q = primero w = sig(q)
4) Preguntamos: dato(p) < dato(q)? Respuesta: No Preguntar: w NULO? Respuesta: S Mientras la respuesta es S, preguntamos: dato(p) < dato(w)? Respuesta: No Hacer que el puntero q, apunte a w. Hacer que el puntero w, apunte a sig(q)
En forma grfica:
p sig(p) ant(p) p sig(p) 4 ant(p) NULO 1 NULO primero 2 q w q w NULO 1 NULO primero 2 q w UNSM: FISI: LP1-Ing. Humberto Valdera Rodrguez 2014 6
En seudocdigo: q = w w = sig(q)
Los punteros q y w, avanzan hasta que la respuesta de la pregunta w NULO?, sea No, entonces se procede a insertar el elemento al final de la lista, de la siguiente manera: Hacer que sig(q), apunte al nuevo nodo. Hacer que sig(p), apunte a NULO. Hacer que ant(p), apunte a ant(q)
En forma grfica:
En seudocdigo: sig(q) = p sig(p) = NULO ant(p) = ant(q)
Insertar elemento en el INTERMEDIO de una LDE El proceso es el siguiente: 1) Crear un nuevo nodo, haciendo que un puntero auxiliar p, apunte al nuevo nodo.
En forma grfica:
En seudocdigo: p = nuevo nodo
2) Ingresar el dato en el nuevo nodo, haciendo que dato(p) capture al dato ingresado.
En forma grfica:
En seudocdigo: leer: dato(p)
3) Preguntamos: primero = NULO? Respuesta: No Hacer que un puntero auxiliar q, apunte al primero. Hacer que un puntero auxiliar w, apunte a sig(q).
En forma grfica:
En seudocdigo: q = primero w = sig(q)
4) Preguntamos: dato(p) < dato(q)? Respuesta: No Preguntar: w NULO? Respuesta: S Mientras la respuesta es S, preguntamos: dato(p) < dato(w)? Respuesta: No Hacer que el puntero q, apunte a w. Hacer que el puntero w, apunte a sig(q)
En forma grfica:
p sig(p) ant(p) p sig(p) 3 ant(p) q w q w q w 4 NULO 1 NULO primero 2 4 NULO 1 NULO primero 2 UNSM: FISI: LP1-Ing. Humberto Valdera Rodrguez 2014 8
En seudocdigo: q = w w = sig(q)
Los puntero q y w, avanzan hasta que la respuesta de la pregunta dato(p) < dato(w)?, sea S, entonces se procede a insertar el elemento en el intermedio respectivo de la lista, de la siguiente manera: Hacer que sig(p), apunte a w. Hacer que sig(q), apunte al nuevo nodo. Hacer que ant(p), apunte a ant(w) Hacer que ant(w), apunte al nuevo nodo.
En forma grfica:
En seudocdigo: sig(p) = w sig(q) = p ant(p) = ant(w) ant(w) = p
5) Resultado final:
q w 4 NULO 1 NULO primero 2 p sig(p) 3 ant(p) 3 4 NULO 1 NULO primero 2