Listas Dinmicas 1 Listas n Listas Arrays Listas

  • Slides: 51
Download presentation
Listas Dinámicas 1

Listas Dinámicas 1

Listas n Listas Arrays ¨ Listas son flexibles y permiten cambio de implementación n

Listas n Listas Arrays ¨ Listas son flexibles y permiten cambio de implementación n Operaciones ¨ Insertar, n Borrar, Modificar, etc. Tipos de listas ¨ Simples ¨ Ordenadas ¨ Pilas ¨ Colas ¨ Doblemente ¨ Circulares enlazadas (LDE) 2

TAD Lista Simple: operaciones Creación de una lista crear. Lista (nombre. Lista) Comprobación del

TAD Lista Simple: operaciones Creación de una lista crear. Lista (nombre. Lista) Comprobación del estado lista. Llena (nombre. Lista) Booleano lista. Vacia (referencia. Nodo) Booleano Inserción de nodos Insertar (nombre. Lista, valor. Info, posicion) Insertar (nombre. Lista, valor. Info) Borrado de nodos Borrar (nombre. Lista, valor. Info) Búsqueda de un nodo Buscar (nombre. Lista, dato) informacion Buscar (nombre. Lista, dato) referencia. Nodo Pertenece (nombre. Lista, informacion) Booleano Recorrido de la lista recorrer(nombre. Lista) Acceso a los nodos Info (referencia. Nodo) Informacion Siguiente (referencia. Nodo) enlace Modificación de los nodos asignar. Info (referencia. Nodo, valor. Informacion) asignar. Enlace (referencia. Nodo, valor. Enlace) 3

Definición de la lista n n n Se compone de nodos enlazados. Se debe

Definición de la lista n n n Se compone de nodos enlazados. Se debe hacer en una clase separada. Sólo requiere conocer dónde se encuentra el primer nodo de la lista. Para el nombre de la referencia al primer nodo se hace uso de la metáfora: “cabeza de la lista” o “inicio”. Una lista vacía comenzaría con un valor null en el campo sig (siguiente) 4

¿Qué es un Nodo? n Un nodo es un registro con varios campos: unos

¿Qué es un Nodo? n Un nodo es un registro con varios campos: unos campos de datos y un campo apuntador. Los primeros son información y el último es una referencia al siguiente nodo de la lista. El último nodo de la lista contiene una referencia siguiente "null". 5

Clase nodo public class Nodo { int data; // almacena el dato Nodo sig;

Clase nodo public class Nodo { int data; // almacena el dato Nodo sig; //”liga” al próximo nodo } El campo data representa los datos que almacena el nodo. Puede ser de diferentes tipos de datos, además que éste puede contener la cantidad de datos que se ocupen. 6

Listas sig sig 7

Listas sig sig 7

Creación de una lista n Lista vacía 8

Creación de una lista n Lista vacía 8

Inserción de un nodo CASO 1. Inserción al principio de la lista 9

Inserción de un nodo CASO 1. Inserción al principio de la lista 9

Caso 1. Inserción al principio Insertarinicio (inicio, info) //este algoritmo inserta un nodo al

Caso 1. Inserción al principio Insertarinicio (inicio, info) //este algoritmo inserta un nodo al inicio de la lista// (nuevo: del tipo inicio) 1 - crear (nuevo); 2 - hacer nuevo. dato = info nuevo. sig = inicio = nuevo 10

Caso 2. Inserción en medio de la lista Caso 2. 1 Insertar antes de

Caso 2. Inserción en medio de la lista Caso 2. 1 Insertar antes de Caso 2. 2 Insertar después de inicio aux Ref nuevo info 11

Caso 2. 1 Insertar antes de Insert. Antes (inicio, info, ref) //aux, nuevo, T

Caso 2. 1 Insertar antes de Insert. Antes (inicio, info, ref) //aux, nuevo, T son variables de tipo inicio. OK es una variable boolean 1 - hacer aux = inicio, Ok = verdadero 2 - mientras (aux. dato != ref) y (Ok == verdadero) Si aux. sig != null T = aux, aux = aux. sig. Sino OK = falso 3 - Si Ok = = verdadero //se encontró el dato Crear (nuevo) nuevo. dato = info nuevo. sig =aux Si aux = = inicio //es el primer nodo entonces inicio = nuevo si no T. sig = nuevo 12

Caso 2. 2 Insert. Despues (inicio, info, Ref) //nuevo y aux so n variables

Caso 2. 2 Insert. Despues (inicio, info, Ref) //nuevo y aux so n variables del tipo de inicio, OK es boolean 1 - aux = inicio, OK = verdadero 2 - Mientras (aux. dato != ref) y (OK == verdadero) hacer si aux. sig != null entonces aux = aux. sig si no OK = Falso 3 - Si OK = = verdadero entonces crear (nuevo) nuevo. dato = info nuevo. sig = aux. sig = nuevo 13

Caso 3. Inserción al final de la lista Insertafinal (inicio, info) // nuevo y

Caso 3. Inserción al final de la lista Insertafinal (inicio, info) // nuevo y T son del tipo inicio 1 - Hacer T = inicio 2 - mientras T. sig != null recorrer la lista hasta llegar al final 3 - Crear (nuevo) 4 - nuevo. dato = info nuevo. sig = null T. sig = nuevo 14

Eliminar Nodos Casos 1 Eliminar el primer nodo Elimina primero (inicio) // Se redefine

Eliminar Nodos Casos 1 Eliminar el primer nodo Elimina primero (inicio) // Se redefine el apuntador inicio. //aux es del tipo inicio 1 - hacer Q = inicio; 2 - Si aux. sig != null //que si hay mas de un elemento Entonces inicio = aux. sig Sino inicio = null 3 - aux = null //quita aux 15

Caso 2 Eliminar en medio Caso 2. 1 Elimina nodo con X información Elimina.

Caso 2 Eliminar en medio Caso 2. 1 Elimina nodo con X información Elimina. Nodo. X (inicio, x) //aux y T son variables del mismo tipo de inicio, Ok es boolean 1 - Hacer aux = inicio , Ok = verdadero 2 - Repetir mientras (aux. dato != x) y (Ok) hacer Si aux. sig != null //hay más nodos entonces T = aux, aux = aux. sig si no Ok = falso 3 - Si Ok == falso entonces //el elemento x no existe si no si inicio == aux //x es el primer elemento de la lista entonces inicio = aux. sig si no T. sig = aux. sig aux = null 16

Caso 2. 2 Elimina nodo antes de X información inicio R T aux X

Caso 2. 2 Elimina nodo antes de X información inicio R T aux X Algoritmo Elimina. Antes. X (inicio, x) //aux , T y R son variables del mismo tipo de inicio (apuntador), Ok es boolean 1 - Si inicio. dato == x entonces //no hay nodo que precede a x sino aux = inicio; T = inicio; Ok = falso; mientras (( aux. info!=x) y (!Ok)) si aux. sig != null entonces R = T; T = aux; aux= aux. sig; si no Ok = verdadero; 2 - Si Ok entonces //el elemento x no existe si no si inicio. sig = aux //el elemento a eliminar es el primero entonces inicio = aux sino R. sig = aux; T = null; 17

Caso 3 Elimina ultimo nodo Elimina ultimo (inicio) //Se pone un null en el

Caso 3 Elimina ultimo nodo Elimina ultimo (inicio) //Se pone un null en el campo sig del penúltimo elemento y se quita el ultimo. //aux, T son del mimo tipo que inicio 1. Si inicio. sig == null //que la lista tiene un solo elemento Entonces inicio = null //quita (inicio) Si no aux = inicio 2. Mientras aux. sig != null hacer T = aux. sig 3. T. sig = null //quita T aux = null //quita aux 18

Recorrido de una lista dinámica Metodo Correlista (Nodo inicio); //imprime cada dato de la

Recorrido de una lista dinámica Metodo Correlista (Nodo inicio); //imprime cada dato de la lista { nodo aux = new nodo(); aux = inicio; while (aux. sig != null) { escribir (aux. dato); aux = aux. sig; } } 19

Buscar un nodo con alguna característica Método Busca (Nodo inicio, info){ //Devuelve exito con

Buscar un nodo con alguna característica Método Busca (Nodo inicio, info){ //Devuelve exito con falso o verdadero nodo aux = new nodo(); boolean exito = falso aux = inicio; while (aux. sig != null && aux. dato != info) aux = aux. sig; if ( aux. dato = = info ) exito = verdadero; return exito } 20

Filas Dinámicas 21

Filas Dinámicas 21

Características de una Fila n n n El primer elemento en llegar es el

Características de una Fila n n n El primer elemento en llegar es el primero en servir (FIFO Frist In Frist Out). El ultimo en llegar se agrega al final El apuntador posee la dirección del siguiente nodo El apuntador puede ser null o puede apuntar al siguiente nodo Esta estructura se utiliza en : ¨ Simulaciones ¨ Sistemas operativos etc… dato sig … 22

Operaciones de una Fila Crearfila (nodo inicio) n Agregarfila (nodo inicio, int dato) n

Operaciones de una Fila Crearfila (nodo inicio) n Agregarfila (nodo inicio, int dato) n Quitar. Fila (nodo inicio) n Vacio (nodo inicio) n 23

Clase nodo public class Nodo { int dato; // almacena el dato Nodo sig;

Clase nodo public class Nodo { int dato; // almacena el dato Nodo sig; //”liga” al próximo nodo } El campo data representa los datos que almacena el nodo. Puede ser de diferentes tipos de datos, además que éste puede contener la cantidad de datos que se ocupen. 24

Crea fila crea. Fila (nodo i){ nodo inicio = new nodo(); inicio = i;

Crea fila crea. Fila (nodo i){ nodo inicio = new nodo(); inicio = i; } incio sig 25

Agregar a una Fila un nodo Agrega(nodo inicio, int dato){ Si inicio. sig =

Agregar a una Fila un nodo Agrega(nodo inicio, int dato){ Si inicio. sig = null entonces inicio. sig = nuevo; Sino { nodo p = nuevo nodo(); p. sig = inicio. sig mientas(p. sig!= null) p = p. sig; } } incio sig dato sig null 26

Eliminar un elemento de la Fila int quitar(nodo inicio){ int d = -1; Si

Eliminar un elemento de la Fila int quitar(nodo inicio){ int d = -1; Si inicio. sig == null; regresa d; Sino { d = inicio. sig. dato; inicio. sig = inicio. sis. sig; } Regresa d; } incio sig dato sig null dato sig 27

Vaciar una fila Boolean vacia(nodo inicio){ Boolean vacia = false; Si inicio = null

Vaciar una fila Boolean vacia(nodo inicio){ Boolean vacia = false; Si inicio = null Regresa true Sino Regresa vacia } null incio sig dato sig 28

Pilas Dinámicas 29

Pilas Dinámicas 29

Características n Se remueve del tope y se agrega en el tope de la

Características n Se remueve del tope y se agrega en el tope de la pila (LIFO Last In Frist Out). Operaciones Creapila (nodo inicio) Quitar (nodo inicio) = pop Agregar (nodo inicio, int dato) = push Vacia (nodo inicio) 30

Crear una Pila crea. Pila (nodo i){ Nodo inicio = new nodo(); inicio =

Crear una Pila crea. Pila (nodo i){ Nodo inicio = new nodo(); inicio = i } incio sig null 31

Agregar un nodo a la Pila (push) agrega. Nodo (nodo inicio, int dato){ nodo

Agregar un nodo a la Pila (push) agrega. Nodo (nodo inicio, int dato){ nodo nuevo = new nodo() nuevo. dato = info nuevo. sig = inicio. sig; inicio. sig = nuevo } nuevo incio sig dato sig null 32

Quitar elemento de la Pila (pop) int pop (nodo inicio){ int d = -1;

Quitar elemento de la Pila (pop) int pop (nodo inicio){ int d = -1; Si inicio. sig == null; regresa d; Sino { d = inicio. sig. dato; inicio. sig = inicio. sis. sig; } Regresa d; } incio sig dato sig 33

Para verificar si un apila esta vacía Boolean vacia(nodo inicio){ Boolean vacia = false;

Para verificar si un apila esta vacía Boolean vacia(nodo inicio){ Boolean vacia = false; Si inicio != null Regresa true Sino Regresa vacia } incio sig dato sig 34

Lista doblemente enlazada 35

Lista doblemente enlazada 35

Nodo public class Nodo { private int data; // al macena el dato private

Nodo public class Nodo { private int data; // al macena el dato private Nodo sig; //”liga” al próximo nodo private Nodo ant; // ”liga” al anterior nodo } ant sig 36

Operaciones de una lista doblemente enlazada Añadir o insertar elementos. n Buscar elementos. n

Operaciones de una lista doblemente enlazada Añadir o insertar elementos. n Buscar elementos. n Borrar elementos. n Moverse a través de la lista, siguiente y anterior. n sig ant Inicio fin 37

Añadir elemento a una lista vacía 1 -nodo = anterior y nodo=siguiente a NULL.

Añadir elemento a una lista vacía 1 -nodo = anterior y nodo=siguiente a NULL. 38

Insertar nuevo nodo Caso 1 Insertar nodo en la primera posición Nuevo nodo inserta.

Insertar nuevo nodo Caso 1 Insertar nodo en la primera posición Nuevo nodo inserta. Nodo( nodo) 1 -. Nodo=siguiente // debe apuntar a Lista. 2 -. Nodo=anterior y Lista=anterior. 3 -. Lista=anterior //debe apuntar a nodo. null 1 2 Dato … 3 39

Caso 2 Insertar un elemento en la última posición Insertar. Ultimo(nodo) 1 -. Nodo=siguiente

Caso 2 Insertar un elemento en la última posición Insertar. Ultimo(nodo) 1 -. Nodo=siguiente y Lista=siguiente (NULL). 2 -. Lista=siguiente // debe apuntar a nodo. 2 3 -. Nodo=anterior //apuntará a Lista. Dato 1 3 Dato null 40

Caso 3 Insertar un nodo en medio. Insertar. Medio (nodo ) 1 -. Nodo=siguiente

Caso 3 Insertar un nodo en medio. Insertar. Medio (nodo ) 1 -. Nodo=siguiente apunte a lista=siguiente. 2 -. Lista=siguiente //apunte a nodo. 3 -. Nodo=anterior //apunte a lista. 4 -. Nodo=siguiente=anterior // apunte a nodo. Dato 3 4 2 Dato null 1 41

Eliminar Caso 1 Eliminar el único nodo En este caso, ese nodo será el

Eliminar Caso 1 Eliminar el único nodo En este caso, ese nodo será el apuntado por Lista. 1 -. Eliminamos el nodo. 2 -. Hacemos que Lista apunte a NULL. 42

Caso 2. 1 Eliminar el primer nodo elimina. Primer( nodo) 1 -. Si nodo

Caso 2. 1 Eliminar el primer nodo elimina. Primer( nodo) 1 -. Si nodo apunta a Lista // hacemos que Lista apunt Lista=siguiente. 2 -. Hacemos que nodo=siguiente=anterior// apunte a NULL 3 -. Borramos el nodo apuntado por nodo. 43

Caso 2. 2 Eliminar un nodo intermedio elimina. Medio(nodo) 1 -. Si nodo apunta

Caso 2. 2 Eliminar un nodo intermedio elimina. Medio(nodo) 1 -. Si nodo apunta a Lista=siguiente 2 -. nodo= siguiente 3 -. Nodo = anterior 4 -. Borramos el nodo apuntado por nodo 44

Caso 3 Eliminar el último nodo elimina. Ultimo(nodo) 1 -. Si nodo apunta a

Caso 3 Eliminar el último nodo elimina. Ultimo(nodo) 1 -. Si nodo apunta a Lista=anterior. 2 -nodo=anterior=siguiente apunte a NULL 3 -. Borramos el nodo apuntado por nodo. 45

Lista Circular 46

Lista Circular 46

Circular n Una lista circular es una lista lineal en la que el último

Circular n Una lista circular es una lista lineal en la que el último nodo a punta al primero. inicio fin 47

Operaciones de una lista circular las operaciones que se pueden realizar sobre las listas

Operaciones de una lista circular las operaciones que se pueden realizar sobre las listas circulares : ¨ Añadir o insertar elementos. ¨ Buscar o localizar elementos. ¨ Borrar elementos. ¨ Moverse a través de la lista 48

Insertar un elemento Insertar elemento en la lista vacía n lista apunta a nodo.

Insertar un elemento Insertar elemento en la lista vacía n lista apunta a nodo. n lista->siguiente apunte a nodo. Insertar elemento en una lista no vacía 1. Hacemos que nodo = siguiente apunte a lista = siguiente. 2. Después que lista = siguiente apunte a nodo. 49

Eliminar un elemento de la lista n Eliminar el único nodo de la lista.

Eliminar un elemento de la lista n Eliminar el único nodo de la lista. 2. lista = siguiente mientras lista = siguiente sea distinto de nodo. Hacemos que lista = siguiente apunte a nodo = siguiente. 3. Eliminamos el nodo. 1. n Eliminar un nodo en una lista circular con más de un elemento 1. Borramos el nodo apuntado por lista. 2. Hacemos que lista valga NULL. 50

Eliminar un elemento de la lista n Caso general 1. 2. 3. 4. Copiamos

Eliminar un elemento de la lista n Caso general 1. 2. 3. 4. Copiamos el contenido del nodo = siguiente sobre el contenido de nodo. Hacemos que nodo = siguiente apunte a nodo = siguiente. Eliminamos nodo = siguiente. Si lista es el nodo = siguiente, hacemos lista = nodo. 51