• No se han encontrado resultados

Guia Edoo2012

N/A
N/A
Protected

Academic year: 2021

Share "Guia Edoo2012"

Copied!
122
0
0

Texto completo

(1)

1 INTRODUCCION A LAS ESTRUCTURAS DE DATOS

1.1 Abstracción

Términos simples:

Es un proceso mental, mediante el cual se extraen los rasgos esenciales de algo para representarlos por medio de un lenguaje gráfico o escrito. Debido a que es un proceso mental es una acción subjetiva y creativa es decir: depende del contexto psicológico de la persona que la realiza.

Términos de la POO:

Constituye un principio de la POO que:

 “Enfatiza en detalles que son significativos y que suprime otros detalles que son por el momento irrelevantes”.

 “Denota las características esenciales de un objeto que lo distinguen de todas las otras clases de objetos”.

1.2 Importancia de la abstracción

Dato: unidad básica de la información, que por lo general por si solo no dice nada. Información: es el conocimiento que puede comunicarse, generalmente es el conjunto

de datos pero que tienen relación y que tienen sentido;

La abstracción: es una técnica o metodología que permite diseñar o modelar Estructuras

de Datos, Consiste en representar bajos ciertos lineamientos de formato las características esenciales de una Estructura de Datos.

Su importancia radica en que la abstracción es una capacidad para modelar una realidad por medio de herramientas computacionales.

1.3 Estructuras de Datos

Cualquier colección o grupo de datos organizados, de tal forma que tengan asociados un conjunto de operaciones para poder manipularlos.

La mayoría de lenguajes de programación de alto nivel disponen de tipos de datos estructurados o estructuras de datos predefinidas.

Ejemplo: Arreglos, que no son más que un conjunto de datos, todos del mismo tipo, con

una organización lineal y con métodos claros de acceso a través de sus subíndices. Las

(2)

Tipos de Estructuras

 Hacen referencia a un solo valor a la vez.  Ocupan una sola casilla de memoria

 Pueden ser: Entero, real, lógico carácter (donde: su tamaño depende del Lenguaje de Programación).

 Se caracteriza por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria es decir ésta estructura está formada:

Por uno o varios datos simples. Por uno o varios datos compuestos.

Porque pueden tener algún tipo de comportamiento (métodos).

ED:Estructura de almacenamiento + Operaciones de manipulación (métodos).

Clasificación de las Estructuras de Datos

ESTATICAS DINAMICAS

 Tienen una cantidad fija de memoria principal

 Delimitan el espacio que ocupan en memoria en tiempo de

compilación

 Ejemplo: Arreglos o Arrays, Cadenas

// declaración int [ ] A;

// crea un arreglo con 10

números // enteros

A = new int [ 10 ] ;

 No tienen limitación en el tamaño de memoria principal ocupada

 El espacio de memoria a ocupar se determina en tiempo de ejecución  Ejemplo: listas, árboles, grafos, etc.

public class Nodo{ // Atributos private int dato; private Nodo sig; // Constructor

public Nodo (Nodo ns){ sig = sig;

}

// Métodos a implementar para la // clase Nodo

}

TDA: Tipo de Dato Abstracto: Es el modelo, junto con varias operaciones

definidas sobre el modelo, con lo que se representa a la estructura y el comportamiento del mundo real. El TDA, especifica el ¿Qué? más no el ¿Cómo?

1.4 Tipo de Dato Abstracto ( T.D.A)

TDA es un modelo matemático de estructuras de datos que especifica los tipos de datos almacenados, las operaciones definidas sobre esos datos y los tipos de los parámetros de esas operaciones.

COMPUESTAS SIMPLES

(3)

Un TDA define lo que cada operación debe hacer, más no como lo debe hacer. En un lenguaje de programación como Java un TDA puede ser expresado por una interface, que es una simple lista de declaraciones de métodos.

Un TDA es materializado por una estructura de datos concreta, en Java, es modelada por una clase. Una clase define los datos que serán almacenados y las operaciones soportadas por los objetos que son instancia de la clase. Al contrario de la las interfaces, las clases especifican como las operaciones son ejecutadas (Implementación).

La técnica de la abstracción de datos establece que al diseñar una nueva Estructura de Datos – pasa a ser un TDA que luego podrá ser implementado en cualquier lenguaje de programación.

Especificación lógica de un TDA

Es un documento en el que se plasma la abstracción realizada al diseñar una Estructura de Datos y a partir del cual se implementa la Estructura de Datos. En dicho documento se definirán claramente todas las reglas en las que podrá usarse el TDA

Partes:

1. Elementos que conforman la Estructura de Datos

Describe el tipo de los datos individuales que guardara la estructura. Ejemplo: números enteros, números reales, caracteres, fechas, registro con los datos de un empleado.

2. Tipo de organización en que se guardara los elementos

Lineal: Si hay una relación de uno a uno entre los elementos. (Arreglos)

Jerárquica: Si hay una relación de uno a muchos entre los elementos. (Arboles)

Red: Relación de muchos a muchos entre los elementos (grafos)

(4)

3. Dominio de la estructura (opcional)

Se describirá la capacidad de la estructura de datos en cuanto al rango posible de datos por guardar.

4. Descripción de las operaciones de la estructura

Para cada operación se debe considerar los siguientes puntos: • Nombre de la operación

Descripción breve de su utilidad • Datos de entrada a la operación

• Datos que generan como salida la operación

• Precondición: condición que debe cumplirse ANTES de utilizar la operación para que se ejecute sin problemas.

• Postcondicion : condición en que queda el TDA DESPUES de ejecutar la operación.

“Definir claramente la especificación lógica del TDA, facilita la implementación y aplicación de la Estructura de Datos.”

Importante: Averigua varios ejemplos de aplicaciones dentro del campo informático, donde se identifique a una estructura de datos y el tipo de organización en su implementación INVESTIGA..!!! 1.5 Niveles de abstracción de datos

1.- Nivel (Lógico o abstracto)

Corresponde a la especificación lógica del TDA. En este nivel se define abstractamente a la Estructura de Datos y las operaciones relacionadas con ella, independientemente del lenguaje de programación en el que se implemente o utilice la Estructura.

2.- Nivel (Físico o de Implementación)

Se decide el lenguaje de Programación en el que se va a implementar la estructura de datos. Así como los tipos de datos ya definidos en el lenguaje de programación servirán para representar a la estructura. y luego se implementa cada una de las operaciones diseñadas en el TDA

3. – Nivel de Aplicación o de Uso:

El programador usará el TDA para resolver determinadas aplicaciones, el uso del TDA se limita a llamar a las operaciones sobre la estructura que se requiera cuidando siempre de cumplir las reglas de cada operación especificadas en el nivel lógico.

Analiza:

Identifica los niveles de abstracción en el siguiente ejemplo de la vida real como lo es: “Construir un edificio”.

Piensa en otros casos más, comenta con tus compañeros y con tu profesora !!!

Analiza:

Identifica los niveles de abstracción en el siguiente ejemplo de la vida real como lo es: “Construir un edificio”.

Piensa en otros casos más, comenta con tus compañeros y con tu profesora !!!

(5)

Ventajas de utilizar la Técnica de Abstracción de Datos

 Se tiene una implementación más clara, documentable y fácil de darle mantenimiento.

 Debido a la independencia de datos, se puede crear paquetes como unidades de software reutilizable, con los que se obtienen Estructuras de Datos genéricas.  Facilita y hace más rápido el desarrollo de aplicaciones.

Ejemplo de TDA:

En un sistema bancario las cuentas de cheques de los clientes pueden considerarse objetos. Todos ellos pertenecen a una cuenta llamada CUENTA _CHEQUES que definen para cada instancia los siguientes datos:

 Numero de la cuenta.  Nombre del cliente.

 Sucursal donde se abrió la cuenta.  Saldo de la cuenta.

Y las siguientes Operaciones  Abrir cuenta

 Deposito  Retiro

 Consultar saldo

A continuación elaboramos la especificación lógica que contienen los siguientes puntos:

TDA: CUENTA _CHEQUES. 1.- Elementos que conforman la estructura de datos

Número de cuenta  cadena Nombre del cliente  cadena Sucursal donde se abrió  cadena Saldo de la cuenta  real

2.- Tipo de organización.

El tipo de organización es lineal entre los números de cuentas

3.- Dominio

Existe entre 0 y 10000 cuentas, el dominio será todos aquello números que se ubiquen dentro del rango establecido.

4.- Descripción de las operaciones

- ABRIR_CUENTA:

Utilidad: Esta operación se ejecutará al crear un objeto de la clase CUENTA_CHEQUES, e implica solicitar por teclado los datos correspondientes para guardarlos en los atributos del objeto y colocar el valor de cero al saldo inicial.

Datos de entrada:Nombre del cliente, Nombre de la sucursal, (Saldo inicial de la cuenta será cero) Datos de salida: Número de cuenta

Precondiciones: Ninguna

Postcondiciones: Los datos ingresados serán guardados en los atributos correspondientes del objeto. - DEPOSITAR

Utilidad: Agrega la cantidad especificada al saldo de la cuenta. Datos de Entrada: Monto a depositar

Datos de Salida: Saldo disponible aumentado Precondiciones: Número de la cuenta exista

Que la cantidad a depositar sea mayor a cero Postcondiciones: Saldo de la cuenta agregado la cantidad especificada - RETIRAR

(6)

Utilidad: Quita al saldo de la cuenta la cantidad espeficada, validando que sea posible retirar esa cantidad. Datos de Entrada: Monto a retirar

Datos de Salida: saldo disponible disminuido Precondiciones: Que el número de cuenta exista

Que el saldo disponible sea mayor que la cantidad especificado para el retiro. Postcondiciones: saldo disponible disminuido en la cantidad especificada

- CONSULTAR_SALDO

Utilidad: Mostrar en pantalla el saldo de la cuenta correspondiente Datos de Entrada: Número de cuenta

Datos de Salida: Saldo disponible

Precondiciones: Exista el número de cuenta Postcondiciones: Ninguna

1.6 Representación de una estructura de datos

Puede entenderse como el punto de conexión entre la especificación lógica de una TDA y su implementación en un lenguaje de programación particular.

Dentro del proceso de abstracción de datos la representación de una estructura corresponde al inicio del segundo nivel de abstracción es decir el nivel físico. Constituye un esquema de cómo se almacenarán los elementos de la Estructura de Datos, en la memoria de tal forma que se logre su óptimo aprovechamiento.

Tipos de representaciones para una Estructura de Datos

Independientemente de las facilidades de implementación que ofrezcan los lenguajes de programación, una Estructura de Datos puede representarse de dos formas:

1. Representación de una estructura de datos por posiciones

El lugar físico donde se almacena un elemento determina automáticamente su posición relativa en la estructura de datos. Se podría considerar como un espacio de almacenamiento contíguo donde:

cada lugar sirve para almacenar un elemento. Un elemento esta en un lugar K, por lo tanto

Tipos

1. Por posiciones

2. Por ligas Almacenamiento disperso Almacenamiento contiguo Tendrá la k- ésima posición dentro de la estructura El elemento K+1 estará después de K por lo tanto se almacenará en el lugar k+1

del espacio de

(7)

1 Elemento 1

2 Elemento 2 Existe una relación lineal

… Elemento 1  pos 1

K Elemento k Elemento 2  pos 2

K+1 Elemento k+1 …. Elemento N  pos N …

N Elemento N

Herramientas en los lenguajes de programación para desarrollar una representación por posiciones

Todos los lenguajes de programación proveen al programador de herramientas útiles para representar Estructuras de Datos en forma contigua, más conocidas como estructuras de datos implícitas del lenguaje.

1. Arreglos de elementos uniformes.- Solo almacenan un conjunto de elementos de un mismo tipo simple enteros, reales, cadenas o tipos compuestos registros con elementos de diferentes tipos

2. Registros de elementos de diversos tipos.- Permiten definir estructuras que contienen valores de diferentes tipos, almacenados como si fuera unidad.

3.- Archivos Secuenciales.- el almacenamiento es contiguo, son similares a los arreglos, permiten almacenar un conjunto de elementos aunque lo hace en la memoria secundaria.

Ventajas

- Fácil implementación.

- Rapidez de recorrido, debido a que la dirección de cada elemento está implícita en su posición física.

Desventajas

- Al realizar manipulaciones de los elementos

o Al agregar un nuevo elemento en algún lugar que no sea el último, se tiene que desplazar los elementos hacia abajo que están después de la posición de inserción deseada logrando que se genere un espacio para poder agregar un nuevo elemento.

o Al borrar un elemento que no sea el último deja un espacio no permitido entre los elementos, para lo cual se tiene que desplazar una posición hacia arriba los elementos, que están después del elemento borrado.

2. Representación de una estructura de datos por ligas

En este tipo de representación la ubicación física de un elemento no determina la posición relativa que tiene dentro de la Estructura de Datos.

El almacenamiento se realiza en forma dispersa: dos elementos contiguos en la Estructura de Datos no necesariamente deben estar almacenados físicamente en posiciones contiguas dentro del espacio de almacenamiento.

1 Elemento k Dir k+1

(8)

… Lista Uno:

Elemento k, el que sigue está en la

dirección Dir k+1, que es el

Elemento 1, el que sigue está en la

Dir 2 que es nula.

K Lista Dos.

K+1 Elemento 1 Dir 2 Elemento k+1, el que sigue tiene

dirección

… Nula Dir k+2

N Elemento k+1 Dir k+2

En necesario que cada elemento almacene la dirección física donde se ubica el elemento que le sigue en el Estructura de tal forma que puedan mantener una relación en donde está cada uno de los elementos.

Características

1.- La posición física del elemento no determina la posición relativa dentro de la Estructura de datos.

2.- El almacenamiento se realiza en forma dispersa.

3.- Es necesario que cada elemento almacena la dirección física del siguiente elemento.

4.- Cada elemento debe contener 2 o más campos (dato y dirección).

Ventajas

1.- La representación no es exclusiva debido a que mantiene una organización lineal

2.- Posibilidad de agregar y eliminar elementos de la estructura, sin tener que desplazar los elementos que ya estaban en ella.

3.- Permite un uso más eficiente del espacio de almacenamiento ya que puede crecer o decrecer en tiempo de ejecución, según requiera el usuario.

Desventajas

1.- Cada elemento deber “recordar” donde está alguno de los elementos, cada espacio es un elemento compuesto por (dato y la dirección del siguiente elemento).

2.- Las operaciones requieren mayor tiempo de procesamiento, debido a que el acceso no es directo, se requiere realizar un recorrido hasta encontrar el elemento deseado.

Herramientas en los Lenguajes de Programación para desarrollar una Representación por Ligas

En la mayoría no existen herramientas predefinidas, por lo tanto es el programador implementa las estructuras. Se recomienda el uso de apuntadores, un apuntador se define como un tipo capaz de almacenar una dirección de memoria, se considera como una referencia indirecta a un elemento.

(9)

2 ESTRUCTURAS DE DATOS BÁSICAS

2.1 Cadenas o Strings

Cadena: Es una secuencia finita de símbolos tomados como un conjunto de caracteres

(letras, números, caracteres especiales).

Strings: Internamente es un arreglo de caracteres, dependiendo del lenguaje de

Programación generalmente se considera el inicio de la cadena en la posición 0. La importancia del String radica en que la mayor parte de la información que se maneja actualmente en casi cualquier área del conocimiento puede verse como una secuencia de caracteres. Ejemplo: el nombre de una persona, el nombre del un libro, la información de un texto son vistas como cadenas de caracteres.

Conceptualización de un String como un TDA

Se puede diseñar muchos TDA, que definen una String considerando que operaciones se tomarán como básicas para el funcionamiento de dicha estructura y cuál será el conjunto de caracteres que aceptarán como parte de él.

TDA: String

Elementos: Conjunto de letras mayúsculas y minúsculas, caracteres especiales y dígitos. Estructura: Existe una relación lineal, debido a que se considera como una cadena de caracteres.

Dominio: Suponiendo que los Strings pueden almacenar entre 0 y 80 caracteres, su dominio será el conjunto de todas las cadenas que puedan formar con la combinación de elementos de esa longitud.

Operaciones: - INICIALIZAR

Utilidad: Nos sirve para definir el espacio a ocupar en la memoria por el string. Datos de entrada: Tamaño de memoria para el String

Datos de salida: El string S es nulo (esta vacio) Precondición: Ninguna

Postcondición: el String S es nulo. - INSERTAR_CARÁCTER_AL_FINAL

Utilidad: añadir un carácter al final

Datos de entrada: String S y la letra L que se insertará al final de S. Datos de salida: String S modificado

Precondición: El numero de letras en S es menor que 80.

Postcondición: el string S tiene una letra más en el extremo derecho - BORRAR_ CARÁCTER_AL_INICIO

- Utilidad: Permite borrar un carácter al inicio del String - Datos de entrada: String S al que se le borrara la primera letra - Datos de salida: String S modificado

- Precondición: el String S exista y no sea nulo

- Postcondicion: el String S tiene una letra menos en el extremo izquierdo - CONCATENAR

Utilidad: Unir dos Strings S1 y S2 Datos de entrada: Strings S1 y S2. Datos de salida: String S1 modificado.

Precondición: La suma de la longitud de S1 y S2 debe ser menor que 80.

Postcondición: A string S1 se le agrega todos los caracteres de s2(en el extremo derecho); s2 no se modifica.

- BUSCAR_SUBSTRING

Utilidad: Buscar un Substring S2 en S1 Datos de entrada: Strings S1 y S2.

Datos de salida: verdadero si S2 está contenida en S1, falso en caso contrario Precondición: S1 y S2 existan

(10)

- OBTENER_ CARACTER

Utilidad: Sirve para encontrar un carácter dentro del String

Datos de entrada: String S donde se desea conocer cierto carácter y la posición i del carácter que se desea conocer.

Datos de salida: Carácter que se encuentra en la posición i del String S

Precondición: El String S no sea nulo e i debe ser un valor entre 1 y la longitud de S Postcondición: Ninguna

- VERIFICA_VACIO

Utilidad: Sirve para verificar si una cadena o String está vacía o no Datos de entrada: String S que será verificado

Datos de salida: Verdadero si el String S no tiene caracteres y Falso en caso contrario. Precondición: Ninguna.

Postcondición: Ninguna. - VERIFICAR_LLENA

Utilidad: Sirve para verificar si una cadena está llena o no Datos de entrada: String S que será verificado

Datos de salida: Verdadero si la cadena o String S contiene 80 caracteres y Falso en caso contrario Precondición: Ninguna

Postcondición: Ninguna - INVIERTE

Utilidad: Sirve para invertir el orden de los caracteres de un String. Datos de entrada: String S1 a invertir

Datos de salida: String S2

Precondición: la secuencia de la cadena S se invierte, de forma que el primer carácter toma el lugar del último, el segundo del penúltimo y así sucesivamente.

(11)

Representación del TDA String.

Se puede almacenar en la memoria mediante almacenamiento contiguo y también podrá utilizarse el almacenamiento no contiguo.

1. Uso de un Carácter Centinela

Los caracteres se almacenan en un arreglo con longitud predefinida.

Se delimitan por un carácter especial, denominado “Centinela”-equivale a un carácter nulo en la mayoría de los lenguajes de programación ‘\0’.

MARTES\00 1 2 3 4 5………...n Desventaja.

El carácter centinela ocupará un espacio dentro del String. No se conoce la longitud del String por lo que se debería programar un método que permita realizar dicha operación.

Los lenguajes de programación que utilizan este tipo de almacenamiento son: C Y C++.

2. Almacenamiento de la longitud del String

Los elementos del String se almacenan en un arreglo de longitud predefinida.

La Longitud actual del String se almacenan en la posición 0 y no forma parte del String. max

ASCII6MARTES.... 0 1 2 3 4 5 6 N

Desventaja.

Debido a que la longitud ocupa una posición de un carácter la longitud se restringe a 265.

El lenguaje de programación que utiliza este tipo de almacenamiento es el Pascal. A L M A C C O E N N T A I M G I U E O N T O

(12)

EJERCICIOS PROPUESTOS

1. Cree un método que permita generar y presentar la letras del alfabeto mayúsculas separadas por un guión

2. Cree un método que permita contar el número de letras A que existen dentro de una cadena.

3. Cree un método que permita contar el número de letras mayúsculas que existen dentro de una cadena.

4. Cree un método que permita contar el número de palabras que existe dentro de una frase.

5. Cree un método que permita cambiar de mayúsculas a minúsculas y viceversa 1. Lista encadenada de nodos con un caracter

Genera una lista encadenada donde cada nodo almacena un solo carácter y la dirección del siguiente nodo de la lista.

Ventaja.

Puede generar Strings de longitud infinita. Desventaja.

Desperdicio del 80% en la memoria debido al almacenamiento en tantas direcciones de nodos.

2. Lista encadenada de nodos con N caracteres

Genera una lista encadenada donde cada uno de los nodos almacena N caracteres, del String (N>1) y la dirección donde se encuentra el siguiente nodo.

Ventajas.

Genera Strings de longitud infinita y se disminuye el desperdicio de memoria.

Desventajas.

La implementación de sus operaciones es más compleja, ya que la información contenida en el String está almacenada en forma de substrings. A N L O M A C C O E N N T A I M G I U E O N T O M A R T E S

(13)

2.2 Arreglos Unidimensionales (Arrays)

¿Qué es un arreglo Unidimensional?

Es un tipo de dato estructurado, está formado por una colección finita y ordenada de datos del mismo tipo.

Además de conoce como una estructura natural, que es utilizada para modelar lista de elementos iguales, donde el tipo de acceso es “DIRECTO” debido al uso de un índice que indica la posición relativa del elemento dentro de la Estructura de Datos y además porque para acceder a cada elemento se lo hace directamente sin tener que consultar elementos anteriores o posteriores.

Representación en memoria.

TDA: ARREGLO.

Elementos: Números enteros.

Estructura: Lineal entre los elementos del arreglo.

Dominio: Los datos o elementos posibles a guardar estarán en el rango de 0-20 números. Operaciones:

- OBTENER

Utilidad: Regresa el elemento del arreglo A, que tiene un rango r. Datos Entrada: índice i

Datos Salida: elemento e

Precondiciones: elemento e, este guardado dentro del arreglo A. índice i sea < rango.

Postcondiciones: se produce una condición de error si el índice i<0 o si i > N-1, donde n es la cantidad actual de elementos.

- AGREGAR

Utilidad: Colocar un elemento e, en el arreglo A del rango r. Datos Entrada: el elemento nuevo e

Datos Salida: El arreglo A con un elemento mas Precondiciones: haya espacio en el arreglo

Analiza:

Se tienen las notas de un grupo de 90 estudiantes y necesitamos saber cuántos de estos estudiantes tienen tienen una nota superior al promedio del grupo. ¿Cómo podríamos resolver este problema?....

Piensa en varias soluciones, comenta con tus compañeros y con tu profesora…..!!!

Analiza:

Se tienen las notas de un grupo de 90 estudiantes y necesitamos saber cuántos de estos estudiantes tienen tienen una nota superior al promedio del grupo. ¿Cómo podríamos resolver este problema?....

Piensa en varias soluciones, comenta con tus compañeros y con tu profesora…..!!! 100 A[0] 101 A[1] 102 A[2] 103 A[3] 104 A[4] . . . .

(14)

Postcondiciones: El arreglo con un elemento agregado. - MODIFICAR

Utilidad: Sustituir el elemento e del arreglo A de rango r en el índice i. Datos Entrada: elemento ea, y el nuevo elemento ne

Datos Salida: mensaje

Precondiciones: El arreglo este creado y no este vacio

Post condiciones: Se produce un mensaje de error, si el elemento no se encuentra en el arreglo. - ELIMINAR

Utilidad: quitar el elemento e del arreglo A de rango r en el índice i. Datos Entrada: elemento e

Datos Salida: mensaje indicando que la operación ha tenido éxito.

Precondiciones: el arreglo no este vacio y que el elemento se encuentre en el arreglo

Postcondiciones: Se produce un mensaje de error, si el elemento no se encuentra en el arreglo.

Representación de Arreglos

Manejo de arreglos en Java.

Los arreglos son considerados como objetos cuyo tamaño se determina en tiempo de compilación y no puede ser modificado en tiempo de ejecución.

Pueden contener. Tipos de datos (int, char, boolean, float)

Objetos de clases (los del API, o los definidos por el usuario). Se hace uso del operador [ ].

Dispone de una función miembro para consultar la longitud de arreglo length. Declaración de un arreglo.

<tipo dato/clase> [ ] identificador;

<tipo_dato/clase> identificador [ ]; Ejemplos: String [ ] días_Semana; int [ ] edades_Estudiantes; double [ ] notas; char [ ] vocales;

boolean [ ] productos disponibles. Creación de los arreglos.

Reservar el espacio en memoria y se requiere de un constructor que es el operador (new).

(15)

edades_Estudiantes = new int[20]; notas = new double[10];

vocales = new char[5];

Se puede declarar y crear el arreglo:

• Declarar y crear un arreglo vacio. String [ ] días_Semana=new String [7];

• O también: declarar y crear un arreglo con valores iníciales. int [ ] edades_Estudiantes={15,20,23,18};

Errores.

1. Crear arreglos estáticos en tiempo de compilación. int [4]edades;

2. Asignar valor a un arreglo sin haber determinado su tamaño. int [ ] edades;

edades [0]=15;

Principales Operaciones

1. Lectura

Saber el contenido o el valor del arreglo de una determinada posición.

Ejemplo.

int [ ] edades={15,18,20,25};

Sintaxis: Nombre_Arreglo[subindice];

edades[3]; retorna el 25 ya que está en la posición 3. 2. Escritura y actualización

Sintaxis: Nombre_Arreglo[subíndice]=”valor”;

Edades [1]=28; Ejemplo de actualización de la posición 1. 3. Presentación de los elementos arreglos.

Se lo hace a través de un recorrido. for(int i<0;i<edades.length;i++){

System.out.println(edades [i]); }

Recuerda: Java utiliza los siguientes api: Vector, Collection, Array

que son clases y/o interfaces que permiten almacenar cualquier clase de objetos como elementos y que pueden ser usados independientemente como unidimensionales o multidimensionales.

(16)

EJERCICIOS PROPUESTOS

1. Crear un método que rellene un arreglo con los números enteros comprendidos entre 2 y 20.

2. Escriba un método que rellene un arreglo con los números pares comprendidos entre 1 y 40.

3. Escribir un método, que rellene un arreglo con diez números enteros consecutivos a partir de un número pasado como parámetro y haga una copia de ese arreglo en otro.

4. Escribir un método, que permita ingresar por teclado diez elementos en un arreglo, determine la posición del arreglo en la que se encuentra el máximo valor de los elementos ingresados.

2.3 Arreglos Bidimensionales (Matrices)

¿Qué es un arreglo bidimensional?

Un arreglo bidimensional es un conjunto de datos homogéneos finito y ordenado donde se hace referencia a cada elemento por medio de dos índices: renglón (fila) y columna. Arreglos bidimensionales más conocidos como matrices (mxn), donde m representa a las filas y n a las columnas. También conocidos como arreglos de arreglos, su manipulación es similar a los arreglos unidimensionales sin acceso directo la única variación es que se requiere tantos índices como dimensiones se tengan.

Para calcular el número de elementos que están en la Matriz se realiza la siguiente operación:

ne=n elementos1* n elementos2*… n elementos n. ne=m*n

ne=3*2 ne=6.

Representación de una matriz

MATRIZ COLUMNAS FILAS 0 1 2 .. N 0 P(0,0) P(0,1) P(0,2) …p(0,N-1) 1 P(1,0) P(1,1) P(1,2) …p(1,N-1) 2 P(2,0) P(2,1) P(2,2) …p(2,N-1) Analiza:

Se requiere representar el número de accidentes mensual por región del Ecuador ¿Cómo podríamos resolver este problema?.... Piensa en varias soluciones, comenta con tus compañeros y con tu profesora…..!!!

Analiza:

Se requiere representar el número de accidentes mensual por región del Ecuador ¿Cómo podríamos resolver este problema?....

Piensa en varias soluciones, comenta con tus compañeros y con tu profesora…..!!!

(17)

…M P(M,0) P(M,1) P(M,2) …p(M-A,N-1)

Manejos de Arreglos Bidimensionales (Matrices)

Declaración:

<Tipo/Clase> [ ][ ]identificador; double [ ][ ]x;

Creación:

1. Un arreglo bidimensional vacio: double [ ][ ]x=new double[3][2]; 2. Con valores iniciales

double [ ][ ]x={{1.0,2.0},{6.0,5.0},{10.0,8.0}};

Operaciones Básicas

1. Lectura: Obtener un elemento contenido en la matriz: double r = x [1][1]=5;

2. Modificación: Actualizar al elemento: x [2][0]=4.0;

3. Presentación: Utilizar un ciclo repetitivo que recorre las filas(i); y otro ciclo anidado que recorre a las columnas(j).

for(int i=0; i<n;i++){ for(int j=0;j<n;j++){

System.out.println(x[i][j]); }

(18)

EJERCICIOS PROPUESTOS

Implementar la clase Matriz

Matriz + n: entero //dimensión de la matriz - x[ ][ ]:doublé // array bidimensional //constructores

+ Matriz(n: entero) + Matriz(x [ ][ ]double) //métodos de la clase Matriz + suma(a: Matriz,b Matriz): Matriz + resta(a: Matriz,b Matriz): Matriz

+ multiplicacion(a: Matriz,b Matriz): Matriz + productoEscalar(double,a: Matriz): Matriz + transpuesta(a: Matriz): Matriz

+ sumaDiagonal(): double +sumElemSobDiagonal():double +sumElemBajoDiagonal():double +triBaseSup(Matriz a):double +triBaseInf(Matriz a):double +triBaseIzq(Matriz a):double +triBaseDer(Matriz a):double +triVerticeSup(Matriz a):double +triVerticeInf(Matriz a):double +triVerticeIzq(Matriz a):double +triVerticeDer(Matriz a):double +Rombo(Matriz a):double +Arbol(Matriz a):double +Reloj(Matriz a):double IMPLEMENTACION DE LA CLASE MATRIZ public class Matriz {         /** Miembros dato */     public int n;      //dimension     private double[][] x; //Array bidimensional     //Constructores     public Matriz(int n) {         this.n=n;         x=new double[n][n];         for(int i=0; i<n; i++){       for(int j=0; j<n; j++){       x[i][j]=0.0;       }         }     }     public Matriz(double[][] x) {         this.x=x;         n=x.length;    }     //Para mostrar los datos redefinimos la funcion toString     //de la Clase base Object de la cual deriva implicitamente Matriz     public String toString(){         String texto="\n";         for(int i=0; i<n; i++){

(19)

      for(int j=0; j<n; j++){       texto+="\t "+(double)Math.round(1000*x[i][j])/100;       }       texto+="\n";         }         return texto;   } 2.4 Conjuntos

Es una colección de elementos del mismo tipo cuyo orden y cantidad de repeticiones es observada.

Entre sus principales características tenemos:  Es un contenedor de objetos distintos  No hay elementos duplicados

 En la implementación de la estructura conjunto el ordenamiento juega un papel muy importante

TDA CONJUNTOS

Elementos: Puede ser cualquier tipo de objetos (elementos diferentes). Estructura: Tiene una estructura lineal entre los objetos del conjunto.

Dominio: Son todos los datos posibles a guardar dentro del rango definido por el usuario en relación con el tipo de aplicación de la estructura.

OPERACIONES:

- UNION : A∪B={x ∈A o x ∈B}

Utilidad: Que se reemplaza en A con la unión A y B, esto es ejecutar A← A∪B . O se puede crear un nuevo conjunto C.

Datos de Entrada: Dos conjuntos { }A, { }B.

Datos de Salida: El conjunto {}A modificado o también puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan.

Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la unión - INTERSECCION : A∩B={x ∈A y x∈B}

Utilidad: Se reemplazará en {}A con la intersección del conjunto A y B, esto es ejecutar A← A∩B . O se puede crear un nuevo conjunto C.

Datos de Entrada: Dos conjuntos { }A, { }B.

Datos de Salida: El conjunto {}A modificado o también puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan.

Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la intersecsión. - DIFERENCIA: A−B={x ∈A y x∉B}

Utilidad: Reemplaza en A con la diferencia A y B, esto es ejecutar A← A−B . O se puede crear un nuevo conjunto C.

Datos de Entrada: Dos conjuntos { }A, { }B.

Datos de Salida: El conjunto {}A modificado o también puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan.

Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la diferencia del conjunto {}A, y {}B.

En algunos lenguajes de programación éstas operaciones se realizan sobre el primer conjunto o sea el conjunto A ó se

Analiza:

¿Cómo sería el proceso que se aplican los motores de búsqueda de Información en Internet?

Piensa en varias soluciones, comenta con tus compañeros y con tu profesora…..!!!

Analiza:

¿Cómo sería el proceso que se aplican los motores de búsqueda de Información en Internet?

Piensa en varias soluciones, comenta con tus compañeros y con tu profesora…..!!!

(20)

definir a éstas operaciones sin alterar al conjunto A,

devolviendo en un nuevo conjunto que podría ser el conjunto C. Manipulación de conjuntos en Java

En el api de Java encontramos, el paquete Java.util que incluye la interfaz SET, que nos permite manipular conjuntos de elementos y tiene como características las siguientes:

• Un conjunto no puede contener elementos duplicados

• Incluye métodos parecidos a los definidos en el TDA mencionado anteriormente. A continuación se muestra:

Correspondencia entre TDA CONJUNTO y la Interfaz Java.util.Set

TDA CONJUNTO Interfaz Java.util.Set

Unión addAll (collection c):boolean

Intersección retainAll(collection c):boolean Diferencia removeAll(collection c):boolean

Ejemplo de representación de la operaciones básicas(inserción y eliminación); operaciones con subconjuntos y las operaciones entre conjuntos(Unión, Intersección

y Diferencia) de la Estructura Conjunto en Java MODELADO Conjunto +a: SortedSet //Constructor +Conjunto() +getA():SortedSet +setA(a:SortedSet):void //metodos de Conjunto +inserta(e:Object):void +elimina(e:Object):void +subconjuntosup(e:Object):SortedSet +subconjuntoinf(e:Object):SortedSet

+subconjuntoentre(Object ei, Object ef):SortedSet +union(SortedSet a, SortedSet b):SortedSet +interseccion(SortedSet a, SortedSet b):SortedSet +diferencia(SortedSet a, SortedSet b):SortedSet

IMPLEMENTACION DE CONJUNTO import java.util.*; public class Conjunto {     public SortedSet a;     public Conjunto() {         a= new TreeSet();     }     public SortedSet getA() {         return a;     }     public void setA(SortedSet a) {         this.a = a;     }

(21)

    public void inserta(Object e){         if(a.add(e)==false){       System.out.println("Elemento :"+ e +" repetido!!..No se pudo insertar");         }     }     public void elimina(Object e){         if(a.remove(e)){       System.out.println("Elemento  : "+e+" : ha sido eliminado");         }else{       System.out.println("No existe el elemento a eliminar");         }     }     public SortedSet subconjuntosup(Object e){         SortedSet b=new TreeSet();         b=a.tailSet(e);         return b;     }     public SortedSet subconjuntoinf(Object e){         SortedSet b=new TreeSet();         b=a.headSet(e);         return b;     }     public SortedSet subconjuntoentre(Object ei, Object ef){         SortedSet b=new TreeSet();         b=a.subSet(ei, ef);         return b;     }     public SortedSet union(SortedSet a, SortedSet b){         a.addAll(b);         return a;     }     public SortedSet interseccion(SortedSet a, SortedSet b){         a.retainAll(b);         return a;     }     public SortedSet diferencia(SortedSet a, SortedSet b){         a.removeAll(b);         return a;     } } 2.5 Archivos o ficheros

La estructura de datos tipo archivo (ficheros) es la única estructura de datos que se almacena en memoria secundaria o externa (disco o cinta). Un archivo de datos es una estructura constituida simplemente por colecciones de datos que se pueden guardar, para uso posterior mediante la ejecución de programas adecuados. Otra característica importante de los archivos es que permite almacenar gran cantidad de información. Esta colección de datos sirve para la entrada y salida a la computadora y se maneja con un programa en contraste con archivos y registros, el tamaño de esta colección no es fija y está limitada solo por la cantidad de memoria secundaria (disco o cinta) disponible. Es decir, los archivos son dinámicos, esto es que se pueden hacer archivos de datos más grandes o más pequeños según sean las necesidades.

(22)

Los archivos no están limitados por la memoria donde están contenidas las estructuras. Cada archivo se puede manipular por un identificador.

Un archivo está compuesto por un conjunto de registros que es una colección de los elementos de información sobre una entidad particular, los diferentes elementos se conocen como campo que pueden guardar información diferente, y estos pueden a su vez contener subcampos los que están compuestos de caracteres.

Métodos de acceso a un archivo

Un método de acceso, no es más que la forma como recuperar la información del archivo, a veces se pude procesar dato por dato, en otras veces se podría acceder rápidamente a un dato sin recuperar los datos anteriores.

Existen dos métodos para acceder a un archivo de datos: acceso secuencial y acceso aleatorio.

Acceso Secuencial

Exige el tratamiento elemento a elemento es necesario una exploración secuencial comenzando desde el primer elemento hasta llegar al elemento buscado.

Acceso Aleatorio o Directo

Permite procesar o acceder a determinado elemento mediante una dirección en el soporte de almacenamiento.

Representación Grafica

Representación de la Estructura Archivo

1. SECUENCIAL: Entre sus principales características tenemos más sencillos de implementar, no es eficiente cuando la cantidad de datos a almacenar es grande, deben actualizarse en forma periódica para reflejar los cambios dados en la información almacenada. Ejemplo: archivo que almacena los datos de los clientes de un banco, al obtener dinero de un cajero automático.

a b c puntero elementos Acceso a un archivo secuencial Acceso directo Índice (posición)

Acceso a un archivo directo

Δ

R1 R2 R3 R

….

Rn

(23)

2. INDEXADOS: Entre sus principales características tenemos: que este tipo de archivos requiere que se conozca la dirección donde se encuentra el dato a buscar, se compone de un archivo de datos(secuencial) y un archivo de índices(guarda las llaves o clave del archivo secuencial, o sea la dirección del dato correspondiente en disco).

Tipos de archivos

Texto: Solo permiten acceso

secuencial y su unidad constitutiva es el carácter.

Acceso directo: Se puede acceder

secuencial o aleatoriamente y está compuesto por bytes.

Con tipo o Serializables: Se puede acceder secuencialmente, y solo trabaja con objetos. Implementación de un archivo tipo texto.

MODELADO: ArchivoTexto + f : File +bw : BufferedWriter +br: BufferedReader //Constructor ArchivoTexto(dir:String) ArchivoTexto(dir:String, nom:String) //Métodos del Archivo

+escribir(dato:String):void +leer():void

+info():void +lista():void +listaFiltro():void

Filtro implements FilenameFilter +extension:String

//Constructor

+Filtro(extension:String) //Redefinición método accept Archivo de Índices Llave Dirección 10008 001 10209 003 10321 006 Número de cuenta(llave)

Archivo de datos (Secuencial) 001 10008 María del Cisne

Calderón …. 002 003 10209 María Gabriela Gonzaga … 004 005

006 10321 María José Salinas … 007 008 … 300 301 … N

(24)

+accept(dir:File, name String ):boolean CLASE ARCHIVOTEXTO import java.io.*; public class ArchivoTexto {     public File f=null;     public BufferedWriter bw=null;     public BufferedReader br=null;     public ArchivoTexto(){     }     public File getF() {         return f;     }     public void setF(File f) {         this.f = f;     }     public boolean verifica(String dir, String nom){         //Comprobar si hay un archivo con ese nombre en el directorio         File fa=new File(dir);         File[] lf=fa.listFiles();         boolean existe=false;         for(int i=0; i<lf.length; i++){       if(lf[i].getName().equalsIgnoreCase(nom)){       fa=lf[i];       existe=true;       setF(fa);       break;       }         }         return existe;     }     public void abrir(String da,String na){         this.f = new File(da,na);     }     public void escribir(String dato)throws IOException{        //*************ESCRIBIR EN EL ARCHIVO*************************         //Recuerda que la filosofia de acceso a la lectura y escritura a los archivos,         //siempre es la misma. Buffer, que envuelve a Reader, que a su vez envuelve         //al archivo (o stream).         //Para escribir utilizamos en el metodo .write() del buffer         //int pos=(int)f.length();         if(f.exists()){       bw = new BufferedWriter(new FileWriter(getF(),true));         }else{       bw = new BufferedWriter(new FileWriter(getF()));         }         bw.write(dato+"\n");         bw.close();     }     public void leer()throws IOException{         //*************LEER EL ARCHIVO**********************************         //Manejar el buffer Reader es muy sencillo ya que simplemente deberemos de

(25)

        //ejecutar lecturas por linea.          System.out.println("El contenido del Archivo es:");          br = new BufferedReader(new FileReader(getF()));          String texline=br.readLine();          while(texline!=null){       System.out.println(texline);       texline = br.readLine();          }          br.close();    }    public void info(){         if( f.exists() ){       System.out.print( "El Archivo existente " );       System.out.println( "Nombre: "+f.getName() );       System.out.println( "Camino: "+f.getPath() );       System.out.println("Directorio padre:"+f.getParent());       System.out.print( (f.canRead() ? "  se puede Leer" : "") );       System.out.println( (f.canWrite() ? " y se puede Escribir" : "") );       System.out.println( "La longitud del Archivo es: "+ f.length() +"Bytes" );         }else{       System.out.println( "El Archivo no existe." );         }    }    public void lista(){        System.out.println(" ******* lista de los archivos de este directorio *******");         File fa=new File("/home/usuario/Documentos");         String[] lf=fa.list();         for(int i=0; i<lf.length; i++){       System.out.println(lf[i]);         }    }    public void listaFiltro(){        System.out.println("***** lista de los archivos de este directorio con filtro ***\n");         File fa=new File("/media/RESPALDO/");         String[] lf=fa.list(new Filtro(".odt"));         for(int i=0; i<lf.length; i++){       System.out.println(lf[i]);         }    } } CLASE FILTRO import java.io.*; /**  *  * @author Ing. Mire  */ public class Filtro implements FilenameFilter{     String extension;     Filtro(String extension){         this.extension=extension;     }     public boolean accept(File dir, String name){         return name.endsWith(extension);     } }

(26)

Ejemplo de manejo de un archivo tipo de acceso Aleatorio

MODELADO:

Log +Rf : RandomAccessFile //Constructor

+Log(nom: String, t: String) //Métodos Archivo Aleatorio +escribirfinal(dato:String):void

+escribirposicion(dato:String, pos: int).void +leer():void +cerrar():void +info():void import java.io.*; public class ArchivoAleatorio {     public RandomAccessFile Rf;     /** Creates a new instance of ArchivoAleatorio */     public ArchivoAleatorio(String nom, String t) throws IOException{         Rf = new RandomAccessFile(nom, t);     }     public void escribirfinal(String dato){         try{        // Nos vamos al final del fichero, Incorporamos la cadena al fichero         Rf.seek( Rf.length());       Rf.writeBytes(dato);          }catch (Exception  e){       System.out.print("Ha ocurrido un error....El directorio no existe");          }     }     public void escribirposicion(String dato, int pos){         try{           Rf.seek(pos);       Rf.writeBytes(dato);         }catch (Exception e){       System.out.println("Fichero no existe.");         }     }     public void leer(){       //  Presentamos los datos del archivo, mediante el acceso secuencial         try{       Rf.seek(0);       String linea=Rf.readLine();       while(linea!=null){       System.out.println(linea);       linea = Rf.readLine();       }         }catch (Exception e){       System.out.println("Fichero no existe");         }     }     public void cerrar() throws IOException{

(27)

        Rf.close();     }     public void info()throws IOException{         System.out.println("El puntero esta en la posicion :"+Rf.getFilePointer());         System.out.println("El tamaño del archivo es: " + Rf.length());         System.out.println("El puntero esta en la posicion :"+Rf.getFilePointer());     } }

Ejemplo de manejo de un archivos Serializables MODELADO Clase Datos Datos #nombre:String #telefono: String #direccion:String

+Datos(String n, String t, String d); +getNombre():String

+getTelefono():String +getDireccion():String +to String(): String

Clase de Lectura ContadoInput -f:FileInputStream -fi:ObjectInputStream +abrir():void +cerrar():void +leer():Datos Clase de Escritura ContactoOutput -f:FileOutputStream -sf:ObjectOutputStream +abrir():void +cerrar():void +escribir(Datos d):void

IMPLEMENTACIÓN DE ARCHIVOS SERIALIZABLES CLASE DATOS public class Datos implements java.io.Serializable {     protected String nombre;     protected String telefono;     protected String direccion;     /** Creates a new instance of Datos */     public Datos(String n, String t, String d){         nombre = n;         telefono = t;         direccion = d;     }     public String getNombre() {

(28)

        return( nombre );         }     public String getTelefono() {         return( telefono );         }     public String getDireccion() {         return( direccion );         }     @Override    public String toString(){         String texto="\n";         texto ="\t"+nombre+"\t"+telefono+"\t"+direccion + "\n";         return texto;      }  } CLASE ESCRITURA import java.io.*; public class Escritura {     public FileOutputStream f;     public ObjectOutputStream sf;          /** Creates a new instance of Escritura */     public Escritura() {     }     //Abrir el fichero;     public void abrir(File a) throws IOException{       f= new FileOutputStream(a,true);       sf = new ObjectOutputStream(f);      }     //Escribir en el fichero     public void escribir(Datos d) throws IOException {         if (sf != null)       sf.writeObject(d);     }     //Cerrar el fichero     public void cerrar() throws IOException{         if (sf != null)       sf.close();     } } CLASE LECTURA import java.io.*; public class Lectura {

/** Creates a new instance of Lectura */ private FileInputStream f;

private ObjectInputStream fi; public Lectura() {

}

public void abrir(File a) throws IOException { f = new FileInputStream(a);

(29)

fi = new ObjectInputStream(f); }

public Datos leer() throws IOException, ClassNotFoundException{ Datos da = null;

if (fi!= null){ try{

da = (Datos) fi.readObject(); }catch (EOFException eof){

System.out.print("Fin de archivo"); }

}

return da; }

public void cerrar() throws IOException{ if (fi != null){ fi.close(); } } } CLASE EJECUTORA import java.io.*; public class EjecutorArchivoSerializable {     public static void main( String argv[] )throws IOException  {         File a=new File("/home/usuario/Documentos/agenda.odt");         Escritura bw = new Escritura();         Lectura br = new Lectura();         bw.abrir(a);         bw.escribir(new Datos("Marco","2546788","Las Pitas"));         bw.escribir(new Datos("Andres","2545609","Argelia"));         bw.cerrar();         br.abrir(a);         try{       while(br!=null){       System.out.print(br.leer());       }         }catch (Exception e){        System.out.println("No hay mas objetos");         }         br.cerrar();     } } EJERCICIOS PROPUESTOS

1. Generar las letras del abecedario mayúsculas y minúsculas combinadas, guardar en un archivo de texto o aleatorio y presentarlas de la siguente manera:

AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp QqRrSsTt UuVvWwXx YyZz

2. Generar la tabla de sumar del 1 al 12 y guardar en un archivo de texto o aleatorio.

(30)

1+2=3 1+3=4 1+4=5 1+5=6 1+6=7 1+7=8 1+8=9 1+9=10 1+10=11 1+11=12 1+12=13 TABLA DEL2 2+1=3 2+2=4 2+3=5 2+4=6 2+5=7 2+6=8 2+7=9 2+8=10 2+9=11 2+10=12 2+11=13 2+12=14 … y asi sucesivamente...

3. Generar los números del fatorial hasta el 12 y guardar en un archivo de texto o aleatorio. 1! =1*=1 2! =1*2*=2 3! =1*2*3*=6 4! =1*2*3*4*=24 5! =1*2*3*4*5*=120 6! =1*2*3*4*5*6*=720 y asi sucesivamente...

(31)

3 ESTRUCTURA LISTA

3.1 Descripción Lógica de la Estructura Lista

Una lista, es una colección de elementos homogéneos, entre los elementos existe una relación lineal, en donde cada elemento indica la dirección donde se encuentra el siguiente elemento de la lista.

Representación:

Una lista se puede representar de dos formas:

Estática: su tamaño se limita en tiempo de compilación Ej.: arreglos

Dinámica: su tamaño puede crecer indefinidamente en tiempo de ejecución Ej.:

listas enlazadas simples, listas enlazadas dobles, listas circulares, pilas y colas.

Características

 En cada elemento o nodo de la lista a excepción del primero, tiene un único predecesor se debe indicar donde se encuentra el siguiente elemento.

 Cada elemento de la lista, a excepción del último tiene un único sucesor.  Las listas son flexibles y permiten cambios en la implementación.

Partes de un nodo Campo dato o info Campo de enlace

Campo dato o info: contiene uno o varios datos y/o objetos Campo de enlace: es la referencia hacia el otro nodo de la lista. Representación de la estructura en memoria:

Por lo general un nodo de una lista se abstrae en una clase. Ejemplo:

Class Nodo{ int dato;

Nodo siguiente;

public Nodo (Nodo sig){ Siguiente = sig; }

// métodos de la clase } // fin de la clase Nodo

(32)

3.2 Operaciones

En una lista se pueden efectuar las siguientes operaciones:

Insertar: Agregar un nuevo nodo a la lista

Eliminar: Quitar un nodo de la lista

Buscar: Permite encontrar un nodo dentro de la lista

Modificar: Actualiza la información de un determinado nodo dentro de la lista

3.3 Tipos de listas

3.3.1 Listas Simplemente Enlazadas

Es una colección de elementos homogéneos cuya relación lineal es determinada por la posición del elemento en la lista.

Una lista simplemente enlazada se caracteriza por lo siguiente:

 En cada nodo existe un solo enlace o referencia hacia el siguiente nodo.  Solo el último nodo de la lista contendrá una referencia nula o apuntara a null.  Esta dada en un solo sentido.

Java inicializa los campos de referencias de un objeto a null durante la construcción del objeto, no es necesario asignar explícitamente null a un campo de enlace.

Pero sin embargo no olvide estas asignaciones de null en su código fuente, su ausencia reduce la claridad del código.

TDA:LISTA ENLAZADA SIMPLE

Elementos: los elementos de una lista simplemente enlazada, son conocidos como nodos, que almacenan datos simples o estructurados.

Estructura: Lineal entre los nodos que forman la lista enlazada simple, cada nodo tiene un único sucesor y predecesor

Dominio: si la lista no está vacía el rango serán los elementos que tendrán las posiciones 0,1,2,3…N donde N es la cantidad de elementos de la lista.

OPERACIONES:

- INSERTAR-INICIO

Utilidad: añadir un elemento al inicio de la lista L Analiza:

Piensa en varias aplicaciones informáticas de la vida real, en donde se utilice la estructura: Lista Simplemente Enlazada, comenta con tus compañeros y con tu profesora…..!!!

Analiza:

Piensa en varias aplicaciones informáticas de la vida real, en donde se utilice la estructura: Lista Simplemente Enlazada, comenta con tus compañeros y con tu profesora…..!!!

(33)

Datos de entrada: la lista L y el nuevo elemento.

Datos de salida: la lista L con el nuevo elemento al inicio. Precondición: Ninguna

Postcondicion: La lista L contiene un elemento nuevo al inicio. - INSERTAR-FIN

Utilidad: añadir un elemento al final de la lista L Datos de entrada: la lista L y el nuevo elemento. Datos de salida: la lista L con el nuevo elemento al final. Precondición: Ninguna

Postcondicion: La lista L contiene un elemento nuevo al final. - INSERTAR-ENTRE-NODOS

Utilidad: añadir un nuevo nodo en un orden especifico dentro de la lista L Datos de entrada: la lista L ,el nuevo elemento y el nodo predecesor

Datos de salida: la lista L con el nuevo elemento insertado en el lugar que le corresponde. Precondición: La lista contenga nodos

Postcondición: La lista L contiene al elemento nuevo en el orden que le corresponde. - ELIMINAR-INICIO

Utilidad: quitar un elemento del inicio de la lista L Datos de entrada: la lista L.

Datos de salida: la lista L con un nodo menos y el valor del nodo eliminado Precondición: la lista L no este vacía

Postcondicion: La lista con un nodo menos (el del inicio) - ELIMINAR-FIN

Utilidad: quitar un elemento del final de la lista L Datos de entrada: la lista L.

Datos de salida: la lista L con un nodo menos y el valor del nodo eliminado Precondición: la lista L no este vacía

Postcondicion: La lista con un nodo menos (el del final) - ELIMINAR- ENTRE-NODOS

Utilidad: quitar un nodo de un orden específico de la lista Datos de entrada: la lista L, y el elemento a eliminar Datos de salida: la lista L con un elemento menos

Precondición: la lista L no esté vacía y que contenga el nodo a eliminar

Postcondición: La lista L contiene un elemento menos y corresponde al que se elimino - BUSCAR-NODO

Utilidad: recorrer la lista L, hasta encontrar un determinado nodo dentro de la lista L Datos de entrada: la lista L ,el elemento a buscar

Datos de salida: verdadero si se ha encontrado el nodo caso contrario falso Precondición: la lista no esté vacía

Postcondición: Ninguna - MODIFICAR-NODO

Utilidad: modificar un elemento de la lista L

Datos de entrada: la lista L ,el elemento a modificar y el nuevo valor para modificar el elemento de la lista L. Datos de salida: Ninguna

Precondición: la lista no esté vacía

Postcondición: La lista L con un elemento modificado.

Nivel físico: Implementación de operaciones de Listas Enlazadas Simples CASOS PARA LA INSERCIÓN DE NODOS:

(34)

2.- Cuando el nodo se debe insertar antes del primer nodo 3.- Cuando el nodo se debe insertar después del último nodo 4.- Cuando el nodo se debe insertar entre nodos

PASOS PARA LA SOLUCIÓN

Caso 1: Cuando la lista enlazada simple no existe 1.- Leer (valor)

2.- Se crea un nodo y se asigna su referencia a top 3.- Inicializar su campo de no enlace

Caso 2: Cuando el nodo se debe insertar antes de primero 1.- Leer (valor)

2.- Crear un nuevo nodo temporal

3.- Inicilizar el campo de no enlace del nodo temporal

4.-Asignar la referencia de inicio de la lista (top),al campo de enlace del nodo temporal 5.-Asignar la referencia del nodo temporal al inicio de la lista

Caso 3: Cuando el nodo a insertarse después del último nodo 1.- Leer (valor)

2.-Crear un nodo temporal

3.- Inicializar el campo de no enlace del nodo temporal 4.- Declarar una variable de referencia aux (auxiliar) 5.- Recorrer la lista hasta el final

6.-Asignar la referencia del nodo temporal al campo de enlace del último nodo de la lista

Caso 4 : cuando el nodo debe insertarse entre nodos 1.- Leer(valor)

2.- Leer (valor) nodo predecesor 3.-Crear un nodo temporal

4.- Inicializar el campo de no enlace del nodo temporal 5.- Declarar una variable de referencia aux(auxiliar) 6.- Recorrer la lista hasta encontrar el nodo predecesor

7.-Asignar al campo de enlace del nodo temporal la referencia del nodo sucesor 8.- Asignar la referencia del nodo temporal al campo de enlace del nodo predecesor

CASOS PARA LA ELIMINACIÓN DE NODOS:

1.- Borrar el primer nodo

2.- Borrar cualquier nodo que no sea el primero

PASOS PARA LA SOLUCIÓN Caso1: borrar el primer nodo

1.- Asignar el enlace del campo siguiente del nodo referenciado por top a top.

Caso 2 : borrar cualquier nodo que no sea el primero 1.- Leer(valor)

(35)

3.- Asignar al campo de enlace del nodo predecesor la referencia del nodo sucesor al que se desea eliminar. Si el nodo a eliminar es el último asignar null al campo de enlace del nodo predecesor.

BUSCAR UN NODO

1.- Leer (valor)

2.- Recorrer la lista hasta encontrar el valor

MODELADO:

ListaSimple - dato: Object // campo dato

- sig:ListaSimple // campo de enlace al siguiente nodo - top: ListaSimple // apuntador de cabecera de la lista simple + ListaSimple( )

+ getDato ( ) : Object +getSig ( ) : ListaSimple +setDato( dato: Object): void +setSig(sig.ListaSimple):void +esVacia( ):Boolean //Inserción de Nodos +insertaVacia(d:Object):void //Caso 1 +insertaInicio(d:Object):void //Caso 2 +insertaFinal(d:Object):void //Caso 3

+entreNodos(np: Object, d:Object):void // Caso 4 //Eliminación de Nodos

+eliminaInicio( ): void // Caso 1

+eliminaNodo( d:Object): void //Caso 2 y 3 //Búsqueda +buscarNodo( ):boolean //Modificar nodo +modificaNodo(d:Object, nd:Object):void //Varios +presenta( ):void +cuentaNodos( ):int +cuentaRepetidos(d:Object):int IMPLEMENTACIÓN EN JAVA public class ListaSimple {     private Object dato;     private ListaSimple sig;     private ListaSimple top;     public ListaSimple() {         setDato(null);         setSig(null);     }     public Object getDato() {         return dato;     }     public void setDato(Object dato) {         this.dato = dato;     }     public ListaSimple getSig() {         return sig;     }

(36)

    public void setSig(ListaSimple sig) {         this.sig = sig;     }     public boolean esVacia() {         if (top == null) {       return true;         } else {       return false;         }     }     //Insercion de Nodos     public void insertaVacia(Object d) {         if (esVacia()) {       top = new ListaSimple();       top.setDato(d);       System.out.println("El nodo insertado es el primero");         } else {       System.out.println("No se ejecuto la operacion, la lista ya contine elementos.");         }     }     public void insertarInicio(Object d) {         if (!esVacia()) {       ListaSimple temp = new ListaSimple();       temp.setDato(d);       temp.setSig(top);       top = temp;         } else {       System.out.println("No puede insertarse al inicio... La lista no contienen nodos");       insertaVacia(d);         }     }     public void insertaFinal(Object d) {         if (!esVacia()) {       ListaSimple temp = new ListaSimple();       temp.setDato(d);       ListaSimple aux;       aux = top;       while (aux.getSig() != null) {       aux = aux.getSig();       }       aux.setSig(temp);         } else {       System.out.println("No se puede insertar al final...La lista esta vacia");         }     }     public void entreNodos(Object np, Object d) {         if (!esVacia()) {       ListaSimple aux;       aux = top;       while ((aux.getDato().equals(np) == false) && (aux.getSig() != null)) {       aux = aux.getSig();       }       if (aux.getDato().equals(np)) {       ListaSimple temp = new ListaSimple();       temp.setDato(d);       temp.setSig(aux.getSig());

(37)

      aux.setSig(temp);       } else {       System.out.println("No se puede insertar...Nodo predecesor no existe");       }         } else {       System.out.println("No se puede insertar...La lista esta vacia");         }     } EJERCICIOS PROPUESTOS

Implementar los métodos correspondientes a la Lista Simple: eliminación de nodos, búsqueda, modificación y varios.

En java también existe un Api propio para trabajar con listas simples, con la clase ArrayList … INVESTIGA..!!!

3.3.2 Lista Circulares

Una lista circular es aquella en donde la referencia siguiente del último nodo en vez de ser null apunta al primer nodo de la lista. El concepto se aplica tanto a listas de enlace simple como doblemente enlazadas. Se obtiene al considerar el primer nodo de la lista es el sucesor del último nodo.

Se utilizan con frecuencia en procesamiento repetitivo de nodos en un orden específico.

Características

 No podemos hablar de primer y último nodo,

 Para su implementación es necesario utilizar un apuntador general a la lista  No existen direcciones nulas, excepto cuando la lista está vacía

 Si la lista contiene un solo nodo, el campo de enlace entonces apuntara a si mismo

 Es posible llegar a cualquier nodo a partir de cualquier posición donde se encuentre apuntando a la variable de referencia llamada lista

Representación

Analiza:

Piensa en varias aplicaciones informáticas de la vida real, en donde se utilice la estructura: Lista Circular, comenta con tus compañeros y con tu profesora…..!!!

aba| Analiza:

Piensa en varias aplicaciones informáticas de la vida real, en donde se utilice la estructura: Lista Circular, comenta con tus compañeros y con tu profesora…..!!!

Referencias

Documento similar

Árbol completo es un árbol cuyos nodos corresponden a los nodos numerados (la numeración se realiza desde la raíz hacia las hojas y, en cada nivel, de izquierda a derecha) de 1 a

Y en el caso específico del CEDH, valor orientativo mediado por la jurisprudencia del TEDH (6). El derecho a la inviolabilidad del domicilio que proclama el artículo 18.2 CE

Lomo de salmón glaseado al mango y asado al horno de carbón, servido con un topping de pico de gallo y mango fresco, una guarnición de ensalada mézclum y verdura asada de

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

[r]

Primeros ecos de la Revolución griega en España: Alberto Lista y el filohelenismo liberal conservador español 369 Dimitris Miguel Morfakidis Motos.. Palabras de clausura

95 Los derechos de la personalidad siempre han estado en la mesa de debate, por la naturaleza de éstos. A este respecto se dice que “el hecho de ser catalogados como bienes de