1 / 18

Listas. Tratamiento de listas en Java

Listas. Tratamiento de listas en Java. Listas. Modelo. 10. 12. 13. 21. Modelo. Lista. Memoria estática. nombre. inicio. Memoria dinámica. NodoLista. n u l l. Aspectos sintácticos: clase Lista. La clase Lista identifica una referencia (puntero) a un objeto (o null ).

filia
Télécharger la présentation

Listas. Tratamiento de listas en Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Listas. Tratamiento de listas en Java

  2. Listas. Modelo.

  3. 10 12 13 21 Modelo. Lista Memoria estática nombre inicio Memoria dinámica NodoLista n u l l

  4. Aspectos sintácticos: clase Lista. • La clase Lista identifica una referencia (puntero) a un objeto (o null). • La declaración de la clase Lista debe incluir: • Las variables miembro. • El/los constructor/es. • [Opcional] Otros métodos que vayan a ser utilizados por objetos externos. • Ejemplo: public class Lista { NodoLista inicio; String nombre; public ListaEnlazada () { inicio = null; nombre = null; } // Otros métodos }

  5. Aspectos sintácticos: clase NodoLista • La estructura de datos que representa los nodos de una lista debe contemplarse como una clase (NodoLista.java). • Se debe declarar: • Las variables miembro (clave y sig). • El/los constructor/es. • El destructor [innecesario en Java]. • [Opcional] Otros métodos que vayan a ser utilizados por objetos externos. • Código: class NodoLista { int clave; NodoLista sig; NodoLista (int dato) { clave = dato; sig = null; } // otros métodos }

  6. Listas. Algoritmos básicos con listas

  7. Algoritmos básicos. • Una sola ejecución: • Insertar al principio. • Eliminar el primero. • Recorrido de la lista (recursivo): • Sin modificar la estructura: • Recorrido completo: Mostrar el contenido de una lista. • Modificando la estructura: • Recorrido completo: • Insertar al final. • Obtener el duplicado de una lista. • Destruir una lista.

  8. 21 null 10 13 Proceso único. nombre inicio • Insertar al principio. • Crear nuevo nodo con la información de entrada • Enlazar el nuevo nodo a la lista aux dato static void insertarAlPrincipio (Lista lista, int dato){ //¡ATENCION! No se verifica la introducción de claves repetidas. NodoLista aux; aux = new NodoLista (dato); aux.sig = lista.inicio; lista.inicio = aux; } Lista lista NodoLista

  9. Inserción al principio. Modelo simplificado. • Situación inicial. • Creación de un nuevo nodo. • Situación final.

  10. null 10 Modelo de funcionamiento desde el programa principal nombre nombre inicio inicio public static void main (String [ ] args) { Lista lista; //Declaración de la variable (puntero) lista de clase Lista Lista = new Lista (); // Construcción de un objeto de clase Lista insertarAlPrincipio (lista,10); //Ejecución del método insertarAlPrincipio } Memoria estática Memoria estática Memoria estática Memoria dinámica Memoria dinámica Memoria dinámica null Objeto de clase Lista Objeto de clase Lista Variable lista Variable lista Variable lista Objeto de clase NodoLista

  11. 21 null 10 13 Proceso único. nombre inicio • Eliminar el primero. ¿Y si la lista tiene un solo nodo? static void eliminarPrimero (Lista lista) { if (lista.inicio != null) lista.inicio = lista.inicio.sig; else System.out.println ("Error, lista vacia"); } Lista lista NodoLista

  12. Recorrido completo de la lista. Ejemplo: Mostrar el contenido. public void mostrarLista () { mostrarLista (inicio); } static void mostrarLista (NodoLista nodoLista) { if (nodoLista != null) { System.out.println (nodoLista.clave + " "); mostrarLista (nodoLista.sig); } else System.out.println ("FIN"); }

  13. Modificación de la estructura. Recorrido completo • Insertar al final. Algoritmo. • Módulo de llamada no recursivo (Lista). • Módulo recursivo (NodoLista). • Devuelve un objeto de la clase NodoLista. • Se inicializa el valor devuelto con el propio argumento:; • Se “reemplaza” el puntero nodoLista.sig por el valor devuelto: ); • En la fase de transición se genera el nuevo nodo. • El método solo surte efecto en la instancia de la fase de vuelta correspondiente al último nodo original. • Se recuerda que en Java los argumentos solo pueden pasarse “por valor”. resul = nodoLista; • nodoLista.sig = insertar (nodoLista.sig, dato);

  14. Modificación de la estructura. Recorrido completo. Insertar al final. Código static void insertarAlFinal (Lista l, int dato) { //¡ATENCION! No se verifica la introduccion de claves repetidas. l.inicio = insertarAlFinal (l.inicio,dato); } static NodoLista insertarAlFinal (NodoLista nodoLista, int dato) { NodoLista resul = nodoLista; if (nodoLista != null) nodoLista.sig = insertarAlFinal (nodoLista.sig, dato); else { resul = new NodoLista (dato); //resul.sig = nodoLista; (Innecesario, ya es null) } return resul; }

  15. nombre inicio null null 2 8 4 Modificación de la estructura. Recorrido completo . Insertar al final. Modelo físico. Instancia 3 Instancia 2 Instancia 1 null lanzadera 8 8 8 8 resul resul resul dato dato dato dato null nodoLista.sig = insertarAlFinal (nodoLista.sig, 8); nodoLista nodoLista nodoLista lista

  16. Modificación de la estructura. Recorrido completo. Insertar al final. Modelo simplificado • Situación inicial. • Fase de transición. • Fase de vuelta. Lista Lista Lista 8 8 null null nombre nombre nombre inicio inicio inicio NodoLista NodoLista NodoLista Instancia 3 resul 2 2 4 4 2 4 null null null null Instancia 2 Instancia 1

  17. Recorrido completo. Obtener el duplicado de una lista. • Combinación de algoritmos básicos: • Recorrido completo sin modificar estructura (lista origen). • Insertar (lista destino). Alternativas: • En la fase de ida: insertarAlFinal. • En la fase de vuelta: insertarAlPrincipio. static void duplicarLista (Lista listaO, Lista listaD) { listaD.inicio = duplicarLista (listaO.inicio); } static NodoLista duplicarLista (NodoLista nodoListaO) { NodoLista resul; NodoLista aux; if (nodoListaO != null) { resul = duplicarLista (nodoListaO.sig); aux = new NodoLista (nodoListaO.clave); aux.sig = resul; resul = aux; } else resul = null; return resul; }

  18. Recorrido completo. Obtener el duplicado de una lista. • Combinación de algoritmos básicos: • (lista origen) Recorrido completo sin modificar estructura • (lista destino) Insertar un nodo al principio de la lista en la fase de vuelta static void duplicarLista (Lista listaO, Lista listaD) { listaD.inicio = duplicarLista (listaO.inicio); } static NodoLista duplicarLista (NodoLista nodoListaO) { NodoLista resul; NodoLista aux; if (nodoListaO != null) { resul = duplicarLista (nodoListaO.sig); aux = new NodoLista (nodoListaO.clave); aux.sig = resul; resul = aux; } else resul = null; return resul; }

More Related