Estructuras de datos Es una colección de datos que se caracteriza por su organización y las operaciones que se definen en ella. Los datos de tipo estándar pueden se organizados en diferentes estructuras de datos: estáticas y dinámicas. Las estructuras de datos estáticas son aquellas en las que el espacio ocupado en memoria se define en tiempo de compilación y no puede ser modificado durante la ejecución del programa; por el contrario, en las estructuras de datos dinámicas el espacio ocupado en memoria puede ser modificado en tiempo de ejecución. Estructuras de datos estáticas son arrays (arreglos) y las estructuras dinámicas son listas, árboles y grafos (estas estructuras no son soportadas en todos los lenguajes). Arrays (arreglos) Un array o arreglo es una colección de datos del mismo tipo, que se almacenan en posiciones consecutivas de memoria y reciben un nombre común. Para referirnos a una posición o elemento en particular del arreglo, especificamos el nombre del arreglo y el número de la posición de ese elemento en el arreglo. En la siguiente figura se muestra un arreglo de enteros llamado c. Este arreglo contiene doce elementos. Nos podemos referir a cualquiera de estos elementos dando el nombre del arreglo seguido del número de posición del elemento especifico encerrado en corchetes (paréntesis cuadrados [ ]). Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez La posición del primer elemento de cualquier arreglo es la posición número cero. Así, nos referimos al primer elemento del arreglo c con c[0], al segundo elemento del arreglo c con c[1], al séptimo elemento del arreglo c con c[6] y, en general al i-ésimo elemento del arreglo c con c[i-1]. Los nombres de arreglo obedecen las mismas convenciones que cualquier otro tipo de variable. El número de posición en corchetes recibe el nombre más formal de subíndice, Un subíndice debe ser un entero o una expresión entera. Si un programa utiliza un expresión como subíndice, la expresión se evaluara para determinar el subíndice. Por ejemplo, si suponemos que la variable a es igual a 5 y la variable b es igual a 6, entonces el enunciado: c[a+b]+=2; Suma 2 al elemento c[11] del arreglo. Si quisiéramos calcular la suma en los valores contenidos en los tres primeros elementos del arreglo c y almacenar su suma en la variable suma, escribiríamos: Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez suma=c[0]+ c[1]+ c[2]; Si quisiéramos dividir el valor del séptimo elemento del arreglo c entre 2 y asignar el resultado a la variable x, escribiríamos: x= c[6] / 2; Declaración y asignación de almacenamiento de arreglos Los arreglos ocupan espacio en la memoria. El programador especifica el tipo de los elementos y usa el operador new para asignar espacio de almacenamiento al número de elementos requerido por cada arreglo. Para asignar memoria a los 12 elementos del arreglo c, usamos la siguiente declaración: int c[ ] = new int[12]; El arreglo anterior también puede realizarse en dos pasos como sigue: int c[ ]; c = new int[12]; //declara el arreglo //asigna memoria al arreglo Cuando se asigna espacio de almacenamiento a un arreglo, los elementos se inicializan automáticamente a cero en el caso de variables de tipos de datos primitivos numéricos, a false en el caso de variables boolean o a null en el caso de referencias. Para signar los valores de los elementos en cualquiera de los dos casos anteriores: c[0] = -45; c[1] = 6; c[2] = 0; c[3] = 72; c[4] = 1543; c[5] = - 89; c[6] = 0; c[7] = 62; c[8] = -3; c[9] = 1; c[10] = 6453; c[11] = 78; También se puede declarar y darle valores a los elementos del arreglo anterior de la siguiente manera: int c[ ] = {-45, 6, 0, 72, 1543, -89, 0, 62, -3, 1, 6453, 78}; Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez Ejemplo: Imprimir los valores correspondientes a cada uno de los elementos arreglo c. for(int i=0; i <=11; i++){ System.out.println(c[ i ]); } Estructuras dinámicas lineales de datos (Listas enlazadas) Hasta ahora se ha trabajado con estructuras para las que hemos reservado memoria n tiempo de compilación estáticas), como arrays, pero hay otro tipo de estructuras que pueden ampliar o limitar su tamaño mientras se ejecuta el programa (dinámicas). Nodo Es el elemento mínimo de almacenamiento, está compuesto por: Información – enlace Presentación: Listas Una lista es una secuencia de 0 o más elementos de un tipo dado almacenados en memoria. Son estructuras lineales, donde cada elemento de la lista, excepto el primero tiene un único predecesor y cada elemento de la lista, excepto el último, tiene un único sucesor. Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez El número de elementos de una lista se llama longitud. Si una lista tiene 0 elementos se denomina lista vacía. En una lista podremos añadir nuevos elementos o suprimirlos en cualquier posición. Estas están conformadas por un conjunto de nodos. Listas en lazadas Los elementos se almacenan en posiciones de memoria que no son contiguas o adyacentes, por lo que cada elemento necesita almacenar la posición o dirección del siguiente elemento de la lista. Son mucho más potentes y flexibles que los array. La inserción o borrado del elemento n-ésimo no requiere el desplazamiento de los otros elementos de la lista. Presentación (Tomando como ejemplo una lista de enteros): Limitantes: • No se puede retroceder. • No se puede perder la cabeza de la lista. Codificación: Para esto es necesario tener en cuenta varios aspectos: 1. El nodo es el componente principal de la lista, pues ella está compuesta solo por nodos. 2. El nodo es el encargado de almacenar la información que se desea guardar en la lista. 3. En un nodo se puede almacenar cualquier tipo de dato, incluidos los objetos. Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez Algoritmo base: El algoritmo base de una lista es la clase nodo, en este caso la llamaremos CNodo: public class CNodo { CNodo sig=null; int info; public CNodo() { } void crearNodo(int inf){ info=inf; } } Como podemos observar, esta clase tiene dos atributos: sig que nos servirá como apuntador hacia el siguiente nodo, e info que es que contendrá la información que almacenara el nodo. La clase anterior tiene dos métodos, uno es el constructor (CNodo) que como vimos en temas anteriores debe llevar el mismo nombre de la clase, y “crearNodo()” que es el encargado de darle valor a los atributos de la clase. Luego de crear la clase CNodo, se debe crear la clase lista, que en este caso la llamaremos CLista, esta siempre debe tener una cabeza y nunca la debemos dejar perder, pues nos servirá para recorridos posteriores. En la clase CLista se ubica todo lo relacionado con la manipulación de los datos a almacenar o almacenados, por ejemplo, los métodos de creación de la lista, inserción de nodos, conteo de nodos, etc. Como se muestra a continuación. public class CLista { CNodo cab=null; public CLista() { } //Crear lista String crearLista(CNodo nodo){ if(cab==null){ cab=nodo; return "Se creo la lista"; } else{ return "La lista ya existe"; } Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez } //Insertar nodo por la izquierda de la lista String insertarIzq(CNodo nodo){ if(cab!=null){ nodo.sig=cab; cab=nodo; return "Se inserto el nodo"; } else{ return "La lista no existe"; } } //Método para contar los nodos que tiene la lista int contar(){ int cont=0; CNodo tmp=new CNodo(); tmp=cab; if(cab==null){ cont=0; } else{ while(tmp.sig!=null){ cont++; tmp=tmp.sig; } if(tmp.sig==null){ cont++; } } return cont; } } Nota: Nótese el uso del nodo temporal para el recorrido de la lista, esto debido a la condición de no perder nunca la cabeza de la estructura de datos. Lo anterior lo vamos a enlazar con la siguiente interfaz: Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez Código fuente: Lo primero que se debe hacer es definir una instancia la clase CLista en el formulario: public class formularioPrincipal extends javax.swing.JFrame { public formularioPrincipal() { initComponents(); } CLista objLista=new CLista(); Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez Programación de los botones: botonCrearLista: // Crear lista CNodo objNodo=new CNodo(); objNodo.crearNodo(Integer.parseInt(textoInfo.getText())); textAreaImprimir.setText(objLista.crearLista(objNodo)); botonInIzq: // Insertar nodo por la izquierda CNodo objNodo=new CNodo(); objNodo.crearNodo(Integer.parseInt(textoInfo.getText())); textAreaImprimir.setText(objLista.insertarIzq(objNodo)); botonImprimir: // imprimir textAreaImprimir.setText(""); CNodo tmp=new CNodo(); tmp=objLista.cab; if(tmp!=null){ for(int i=1; i<=objLista.contar();i++){ textAreaImprimir.setText(textAreaImprimir.getText()+"\n"+tmp.info); tmp=tmp.sig; } } else{ textAreaImprimir.setText("No existe lista para imprimir"); } botonSalir: // Salir dispose(); Por ultimo enlazamos el formularioPrincipal con el main de la siguiente manera: public static void main(String[] args) { formularioPrincipal objFormulario=new formularioPrincipal(); } Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez Taller Completar el programa anterior para que pueda llevar a cabo las siguientes acciones: 1234- Insertar nodos por la derecha. Modificar la información de un nodo. Eliminar nodo por posición. Eliminar nodo por información. Programación Orientada a Objetos I I Profesor: Julio Cesar Meza Ramírez