






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Muy bueno e interesante para aprender listas en programación en Java estudia mi ingeniero
Tipo: Guías, Proyectos, Investigaciones
1 / 11
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







¿Por qué son útiles las estructuras de datos?. Cual es la importancia de que quienes se forman como futuros Ingenieros de Sistemas conozcan muy bien todo lo relacionado con las Estructuras de Datos ?. La respuesta a estas preguntas está relacionada directamente con el papel que desempeña el Ingeniero de Sistemas en el diseño de nuevos sistemas de información. Una de las fases cruciales en la concepción de un sistema de información es la fase de DISEÑO, y para enfrentar las complejidades habituales del diseño los responsables de esta fase hacen uso de alguna forma de ABSTRACCION y en consecuencia, de alguna organización (estructura) de los datos.
¿En que consiste la Abstracción?. La complejidad del mundo que nos rodea sería un factor infranqueable para la mente humana si no hiciéramos habitualmente abstracciones de los distintos fenómenos de esta realidad que nos circunda. Así, por ejemplo, Un plano hecho por un arquitecto describe más o menos de manera completa la estructura de una casa que ha de construirse. De la misma forma que un mapa del Departamento del Cesar simplifica la adquisición de conocimiento por parte nuestra acerca de la realidad geográfica, física, hídrica, económica, etc, del departamento en el cual vivimos.
La abstracción es un proceso “ mental ” mediante el cual pasamos por alto ciertas características de un fenómeno y nos centramos en el detalle de aquellas que nos parecen relevantes, según el propósito que se persiga. Así las cosas, no necesitamos ver la casa terminada para tener una apreciación de ella; de la misma manera que no es necesario abordar un automóvil en Valledupar y dirigirnos al sur del Departamento para conocer como limitan los distintos municipios que conforman el Departamento.
En el desarrollo de Software, la abstracción es la clave para el logro de un buen producto final, toda vez que el desarrollo de un sistema informático se ve simplificado en gran medida mediante el uso de la abstracción en la fase de Diseño. Se trata entonces, en principio, de especificar en el Diseño la funcionalidad del sistema en términos generales lo cual se conoce también como “Especificaciones de alto nivel”. Una vez que se demuestre que esta abstracción del sistema es correcta, entonces se le pueden añadir mas detalles; finalmente, se hace una especificación detallada (llamada también de bajo nivel) del sistema que estamos diseñando y es esta ultima especificación la que podemos expresar utilizando la sintaxis de un lenguaje de programación dado. En este nivel suele utilizarse un tipo especial de abstracción llamado Abstracción de Datos , la cual involucra dos fases, a saber: Descripción abstracta (lógica) de los datos que se requieren, y también de las operaciones que pueden realizarse con ellos.
¿Qué es un Tipo Abstracto de Datos ( TAD )? Es un modelo matemático de los objetos de datos que constituyen un tipo de datos, así como de las funciones que operan sobre estos objetos. Así, por ejemplo, el TAD Matriz puede utilizarse para representar matrices matemáticas junto con las operaciones definidas sobre matrices. Igualmente, el TAD Vector_de_Registros_Alumnos puede utilizarse para representar un Arreglo unidimensional en el cual cada elemento consta de un Registro de información del alumno (Código, Nombre, Calificación), conjuntamente con las siguientes operaciones definidas sobre estos datos:
Registrar_Alumno( Cod ) : Inserta un registro de alumno en el vector Consultar_Alumno( Cod ) : Muestra la información de un alumno Corregir_nota( Cod ) : Actualiza la información de calificación del alumno Informe_de_notas( Cod ) : Muestra un listado de alumnos con todos los campos de cada registro.
Para concluir, diremos que un TAD es la suma de Las ESTRUCTURAS DE DATOS mas los PROCEDIMIENTOS o FUNCIONES que manipulan esos datos.
¿Qué es una ESTRUCTURA DE DATOS? Es una colección de variables en memoria que están relacionadas de alguna forma específica con el fin de facilitar el almacenamiento y acceso a la información.
¿Cómo se Clasifican las ESTRUCTURA DE DATOS?
Según el medio de almacenamiento, las estructuras de datos se clasifican en:
¿Cómo se Clasifican las ESTRUCTURA DE DATOS EN MEORIA PRINCIPAL?
Se clasifican en:
ARREGLOS UNIDIMENSIONALES (Vectores) ESTRUCTURAS DE DATOS ESTATICAS ARREGLOS MULTIDIMENSIONALES (Matrices)
Una ESTRUCTURA DE DATOS ESTATICA es aquella cuyo tamaño, en tiempo de Ejecución del programa NO puede alterarse una vez que se ha establecido; de ahí el calificativo de “ Estática ”. Las estructuras de datos estáticas se identifican por loas siguientes características:
1. - DEBEN SER DIMENSIONADAS PREVIAMENTE (Definir la cantidad máxima de datos a almacenar) 2 .- TODOS LOS ELEMENTOS EN LA ESTRUCTURA DEBEN SER DE IGUAL TIPO (Tipos de datos) 3 .- LOS ELEMENTOS DE LA ESTRUCTURA SE ALMACENAN EN POSICIONES CONSECUTIVAS DE RAM.
Una ESTRUCTURA DE DATOS DINAMICA es aquella cuyo tamaño, en tiempo de Ejecución del programa SI puede alterarse, es decir, “crecen” o se “contraen” según la intervención del usuario de la misma.
Gráficamente, podemos concebir una lista enlazada conteniendo nombres de alumnos en memoria RAM, como se indica en la siguiente figura:
Ahora bien, Que se necesita, desde el punto de vista ALGORITMICO, para crear esta estructura de datos en memoria RAM ????.
Lo primero es decidir el tipo de los datos que almacena cada nodo de la lista (Cadena, Carácter, Numérico entero, Numérico decimal, etc). A esto se le llama “Definir la estructura de información”.
Tenga en cuenta que cada nodo almacena por lo general más de un campo de información, es decir, que conjuntamente con el nombre del alumno puede estar la cédula, la asignatura que cursa, la dirección de correo, etc. Hagámoslo para la lista de la gráfica anterior y definamos el nodo con SINTAXIS de Lenguaje C++ así:
La anterior definición expresa que : C ada nodo de la estructura consta de: Nombre (cadena de 70 caracteres) y un apuntador SIG (Abreviatura de Siguiente) que señala al siguiente nodo de la lista.
Si el lenguaje escogido para la implementación del programa es PASCAL entonces habrá que definir la Estructura de Información que soportará nuestra lista enlazada simple así:
PROGRAM listas ; USES wincrt;
(* Declaro ahora mis Variables apuntadores *)
Ahora sí: Iniciemos el estudio en detalle de nuestra estructura de datos dinámica LISTA ENLAZADA SIMPLE , para lo cual, y aplicando los conceptos enunciados al inicio de esta lección, consideraremos un TIPO ABSTRACTO DE DATOS (TAD) “ PACIENTES ”, consistente en:
Registrar_Paciente añade un nodo a la estructura con información de un paciente Consultar_Historia Muestra en pantalla los datos de un paciente solicitado Actualiza_Informacion_Paciente Permite modificar DIAGNOSTICO y/o ESTRATO Informe_de_Pacientes Muestra en pantalla un Informe de pacientes Retirar_Historia_de_Paciente Borra un registro de paciente de la lista.
La TARIFA se calcula según el ESTRATO así:
ESTRATO TARIFA
Lo primero es DECLARAR LA ESTRUCTURA DE INFORMACIÓN en la cual se soportará nuestro TAD, para lo cual, arbitrariamente he decidido utilizar en este pseudocódigo sintaxis de lenguaje C++ así:
que si lo hiciéramos así entonces se PASARÍA del ULTIMO nodo de la lista.
CONSULTAR_HISTORIA (Versión 1.0) Seguir ‘S’; MQ Seguir = ´S´ Haga Escriba (“ Identificación a consultar? “); Lea (dato) P Cabeza; Encontro ‘N’ ; Cont 0
Encontro ‘S’; Pos P SINO P P ^. Sig ; FSI FMQ SI Encontro = ‘S’ Ent Escriba(“Encontrado el Paciente en la posición “, Cont ) SINO Escriba(“El Paciente consultado NO está en la lista ……. “) FSI Escriba(“Desea consultar Otro Paciente? [S/N] “); Lea (Seguir) FMQ FIN CONSULTAR_HISTORIA (Versión 1.0)
Estudie el algoritmo anterior y hágale una Prueba de Escritorio para lo cual suponga que deseamos
De igual manera, si buscamos la cédula 7310712 El algoritmo mostrará: “ Encontrado el Paciente en la posición : 4 ”. ( ¿ Puede usted explicar porqué esto ultimo? ). Observe que la Cedula 7310712 está en DOS posiciones distintas dentro de la lista (Posición 4 y posición 8 ), sin embargo, el algoritmo solo detecta la PRIMERA OCURRENCIA del elemento en la estructura de datos.
Si por exigencias del problema que estemos resolviendo necesitáramos detectar TODAS las ocurrencias del elemento entonces utilizaremos OTRA VERSION de este mismo algoritmo, como se muestra a continuación:
CONSULTAR_HISTORIA (Versión 2.0) Seguir ‘S’; MQ Seguir = ´S´ Haga Escriba (“ Identificación? “); Lea(dato) P Cabeza; Encontro ‘N’ ; Cont 0;
Cont Cont + 1
Encontro ‘S’ ; Pos P Escriba(“Encontrado el Paciente en la posición “, cont ) SINO P P ^. Sig ; FSI FMQ SI Encontro = ‘N’ Ent Escriba(“El valor consultado NO está en la lista ……. “) FSI Escriba(“Desea consultar Otro dato? [S/N] “); Lea (Seguir) FMQ CONSULTAR_HISTORIA (Versión 2.0)
Observe la forma de “ moverse ” al siguiente Nodo. NO podemos decir que a P P+1 , ya que NO se trata de una variable numérica sino de un APUNTADOR
Observe la forma de “ moverse ” al siguiente Nodo. NO podemos decir que a P P+1 , ya que NO se trata de una variable numérica sino de
Seguir ‘S’; MQ Seguir = ´S´ Haga Escriba (“ Cedula del Paciente cuya historia va a Retirar? “); Lea( dato )
Escriba(“ La lista está VACIA “) SINO P Cabeza; Encontro ‘N’ ; MQ ( Encontro = ’N’) AND ( P <> NIL) haga SI P ^.valor = dato ENT Encontro ‘S’ SINO P P ^.Sig FSI FMQ SI Encontro = ‘N’ ENT Escriba(“ No está ese dato en la lista ….”) SINO /* Está en el ULTIMO nodo???? */
/Entonces ubicamos OTRO apuntador ANTES de P / Q Cabeza MQ Q ^. Sig < > P Haga Q Q ^. Sig FMQ / Ya Q está apuntando a un nodo ANTES de P , entonces “ Desengancho ” el nodo al cual apunta P / Q ^. Sig P ^. sig / Y ahora “ Libero ” el nodo al cual apunta P / DELETE (P) SINO / Está en el PRIMER nodo???? / SI P = Cabeza ENT / Si, está en el PRIMERO …./ Cabeza Cabeza ^. Sig /* Y ahora “Libero” el nodo al cual apunta P / DELETE (P) SINO / Está en un nodo INTERMEDIO cualquiera / /Entonces ubicamos OTRO apuntador ANTES de P / Q Cabeza MQ Q ^.Sig < > P Haga Q Q ^. Sig FMQ / Ya Q está apuntando a un nodo ANTES de P , entonces “ Desengancho ” el nodo al cual apunta P / Q ^.Sig P ^. Sig / Y ahora “ Libero ” el nodo al cual apunta P */ DELETE (P) FSI FSI FSI FSI Escriba(“ Desea Borrar otro valor? [S/N] “); Lea( Seguir ) FMQ
FIN RETIRAR HISTORIA DE PACIENTE
En el algoritmo anterior, Observe usted que las secciones que están en colores ROJO y AZUL ( Que además están encerradas en recuadro) son idénticas; Esto le sugiere a usted algo???. Será posible entonces “REESCRIBIR” este algoritmo y hacer una Versión 2.0 del mismo que aproveche esta circunstancia que indico para que así el algoritmo resulte mas sencillo, mas corto????.