Estructura de Datos en C (Schaum) – Luis Joyanes Aguilar, Ignacio Zahonero, Matilde Fernandez, Lucas Sanchez – 1ra Edición

Descripción

Dos de las disciplinas clásicas en todas las carreras relacionadas con la Informática y las Ciencias de la Computación son Estructuras de Datos y Algoritmos, o bien una sola disciplina, si ambas se estudian integradas en Algoritmos y Estructuras de Datos. El estudio de estructuras de datos y de algoritmos es tan antiguo como el nacimiento de la programación y se ha convertido en estudio obligatorio en todos los currícula desde finales de los años sesenta y sobre todo en la década de los setenta cuando apareció el Lenguaje Pascal de la mano del profesor Niklaus Wirtz, y posteriormente en la década de los ochenta con la aparición de su obra –ya clásica – Algorithms and Data Structures en 1986. ¿Porqué C y no C++/Java o Visual Basic/C#? Muchas Facultades y Escuelas de Ingeniería, así como Institutos Tecnológicos, comienzan sus cursos de Estructuras de Datos con el soporte de C y muchas otras con el soporte de C++ o Java, fundamentalmente, de hecho, en nuestra propia universidad, en algunas asignaturas relacionadas con esta disciplina se aprende a diseñar y construir estructuras de datos utilizando C++ o Java. ¿Existe una solución ideal?

Evidentemente, consideramos que no y cada una de ellas tiene sus ventajas y es la decisión del maestro y profesor quien debe elegir aquella que considera más recomendable para sus alumnos teniendo en cuenta el entorno y contexto donde se desarrolla su labor, al ser él quien llevará la dirección y responsabilidad de la formación de sus alumnos y pensará en su mejor futuro y encuadre dentro del currículo específico de su carrera. Sin embargo, hay muchas razones por las cuales pensamos que C es más apropiado que C++ o Java, para la introducción y formación a nivel medio, inclusive avanzado, en estructuras de datos, siempre que se recurra al paradigma estructurado, con soporte en tipos abstractos de datos y no al puro enfoque orientado a objetos en cuyo caso C++ o Java tienen, sin duda, todas las ventajas y sería necesario utilizar uno u otro lenguaje, y también como antes el profesor tendría siempre la última palabra. Una de estas razones es evidente y se deduce del propio nombre de los lenguajes. C++ es un C más es decir, un C más amplio y potente que se construyó para manejar complejidad a gran escala. Iguales razones, incluso aumentadas, se puede decir de Java, al ser un lenguaje más moderno, con mejores funcionalidades, orientado a la programación en Web…

El primer problema que se suele presentar al estudiante de estructura de datos que, probablemente, procederá de un curso a nivel básico, medio o avanzado de introducción o fundamentos de programación o bien de iniciación de algoritmos, es precisamente el modo de afrontar información compleja desde el principio. Aunque es verdad que C++1 tiene muchas ventajas sobre C, muchas de estas ventajas no se hacen evidentes hasta que un programa se “vuelve” o “hace” más complejo y, si me apuran, más completo. En este caso el paradigma orientado a objetos (POO) es una herramienta de programación y organizativa muy poderosa y con grandes ventajas para la enseñanza y posterior tarea profesional. Por otra parte, la mayoría de los estudiantes de informática, ciencias de la computación, ingeniería de sistemas o de telecomunicaciones, requieren conocer bien el flujo C-C++ y viceversa.

Por consiguiente, parece más natural enseñar primero las estructuras de datos en C y una vez conocidas y mejor dominadas las técnicas de diseño y construcción de estructuras de datos en C, y cuando se tenga constancia de que el alumno dispone de conocimientos, al menos, básicos de POO entonces intentar pasar a C++ o Java. Por otra parte, aunque a primera vista por su enfoque orientado a objetos, C++ podría ser más interesante, en el caso del análisis y diseño de algoritmos y estructuras de datos esta propiedad añade una complejidad inherente, ya que pensamos la idea conceptual de algoritmo encaja mejor en el paradigma estructurado, aunque luego la implementación en clases y objetos, puede darle una nueva potencialidad. Pensando en esta transición es la razón por la cual se ha incluido un capítulo dedicado a conceptos teórico-prácticos de orientación a objetos. En cualquier caso, el curso está soportando la comprensión del Tipo Abstracto de Datos (TAD) de modo que, aunque, se enseñan las estructuras de datos bajo la metodología estructurada, el estilo de programación empleado en el texto se basa en el estudio de tipos abstractos de datos como base para la formación en orientación a objetos.

Ver más
  • Prólogo
    Capítulo 1 Algoritmos, estructura de datos y programas
    1.1 Resolución de problemas de programación
    1.2 Abstracción de datos
    1.3 Análisis de un problema
    1.4 Diseño de un programa
    1.5 Implementación (codificación) de un programa
    1.6 Verificación
    1.6.1 Método básico de verificación formal
    1.6.2 descripción formal de tipos de datos
    1.6.3 el lenguaje de la lógica de primer orden
    Problemas resueltos básicos
    Problemas resueltos avanzados
    Problemas propuestos
    Capítulo 2 Análisis de algoritmos
    2.1 Medida de la eficiencia de un algoritmo
    2.1.1 Evaluación de la memoria
    2.1.2 Evaluación del tiempo
    2.2 Notación O-GRANDE
    2.2.1 Descripción de tiempos de ejecución
    2.2.2 Definición conceptual
    2.2.3 Definición formal
    2.2.4 Propiedades de la notación O
    2.2.5 Complejidad de las distintas sentencias y programas en C
    2.2.6 Funciones de complejidad de algoritmos más comúnmente consideradas
    2.2.7 Tabla comparativa de las distintas funciones de complejidad más usuales
    2.2.8 Inconvenientes de la notación O-grande
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 3 Arrays o arreglos (listas y tablas), estructuras y uniones en C
    3.1 Array unidimensional
    3.2 Array multidimensionales
    3.3 Array como parámetros a funciones
    3.4 Estructuras
    3.5 Uniones
    3.6 Enumeraciones
    3.7 Typedef
    Problemas resueltos
    Problemas avanzados
    Problemas propuestos
    Capítulo 4 Recursividad
    4.1 Algoritmos recursivos
    4.2 Casos en los que debe evitarse el uso de la recursividad
    4.3 Recursividad directa e indirecta
    4.4 Métodos para la resolución de problemas que usan recursividad
    4.4.1 Divide y vence
    4.4.2 Backtracking (retroceso)
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 5 Algoritmos de búsqueda y ordenación
    5.1 Búsqueda
    5.1.1 Búsqueda lineal
    5.1.2 Búsqueda binaria
    5.2 Clasificación interna
    5.3 Ordenación por burbuja
    5.4 Ordenación por selección
    5.5 Ordenación por inserción
    5.7 Métodos de ordenación por urnas
    5.7.1 BinSort
    5.7.2 RadixSort
    5.8 Ordenación rápida (QuickSort)
    5.9 Ordenación por mezcla
    5.10 Clasificación por montículo
    Problemas básicos
    Problemas de seguimiento
    Algoritmos avanzados
    Problemas propuestos
    Capítulo 6 Archivos y algoritmos de ordenación externa
    6.1 Archivos en C.
    6.2 Operaciones con archivos
    6.3 Ordenación externa
    6.4 Ordenación por mezcla directa
    6.5 Ordenación por mezcla natural
    6.6 Método de la mezcla equilibrada múltiple
    6.7 Método polifásico
    Problemas de seguimiento
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 7 Tipos abstractos de datos y objetos
    7.1 El papel de la abstracción
    7.2 El tipo abstracto de datos (TAD)
    7.2.1 Especificaciones de tipos abstractos de datos
    7.2.2 Implementación de tipos abstractos de datos
    7.3 Orientación a objetos
    Problemas resueltos básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 8 Listas, listas enlazadas
    8.1 Estructuras de datos dinámicas
    8.2 Punteros (apuntadores)
    8.3 Variables dinámicas
    8.4 Tipos puntero predefinidos NULL y void
    8.5 Conceptos generales sobre listas
    8.6 Especificación del tipo abstracto de datos lista
    8.7 Operaciones sobre listas enlazadas
    8.8 Especificación formal del tipo abstracto de datos lista ordenada
    8.9 Inserción y borrado de un elemento en lista enlazada simple
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 9 Modificaciones de listas enlazadas
    9.1 Listas doblemente enlazadas
    9.2 Inserción y borrado de un elemento en lista doblemente enlazada
    9.3 Listas circulares simplemente enlazadas
    9.4 Listas circulares doblemente enlazadas
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 10 Pilas y sus aplicaciones
    10.1 El tipo abstracto de datos pila
    10.2 Especificación del tipo abstracto de datos pila
    10.3 Implementación mediante estructuras estáticas
    10.4 Implementación mediante estructuras dinámicas
    10.5 Transformación de expresiones aritméticas de notación infija a postfija
    10.6 Evaluación de expresiones aritméticas
    10.7 Eliminación de la recursividad
    Problemas resueltos básicos
    Problemas resueltos avanzados
    Problemas propuestos
    Capítulo 11 Colas, colas de prioridad y montículos
    11.1 Colas
    11.2 Especificación formal
    11.3 Implementación con variables dinámicas
    11.4 Colas circulares
    11.5 Bicolas
    11.6 Especificación formal de TAD bicola sin restricciones
    11.7 Colas de prioridad
    11.8 Especificación del tipo abstracto de datos “cola de prioridad”
    11.9 Montículos
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 12 Tablas de dispersión y funciones hash
    12.1 Tablas de dispersión
    12.2 Funciones de transformación de clave
    12.3 Tratamiento de sinónimos
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 13 Árboles, árboles binarios y árboles ordenados
    13.1 Concepto de árbol
    13.2 Árbol binario
    13.2.1 Construcción de un árbol binario
    13.2.2 Recorridos
    13.3 Árboles binarios de expresiones
    13.3.1 Construcción a partir de una expresión en notación convencional
    13.4 Árboles binarios de búsqueda
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 14 Árboles binarios equilibrados
    14.1. Árbol binario equilibrado, árboles AVL
    14.2. Inserción en árboles AVL
    14.3. Rotaciones en la inserción
    14.4. La eliminación (o borrado en árboles AVL)
    14.5. Rotaciones en la eliminación
    Problemas de seguimiento
    Problemas básicos
    Problemas avanzados
    Problemas propuestos
    Capítulo 15 Árboles B
    15.1 Árboles B
    15.1.1 Búsqueda de una clave
    15.1.2 Inserción de información
    15.1.3 Borrado físico de un registro
    15.2 Realización de un árbol B en memoria externa
    15.3 Árboles B*
    15.4 Árboles B+
    Problemas de seguimiento
    Problemas propuestos
    Capítulo 16 Grafos I: representación y operaciones
    16.1 Conceptos y definiciones
    16.2 Representación de los grafos
    16.3 Tipo Abstracto de Datos Grafo
    16.4 Recorrido de un grafo
    16.5 Componentes conexas
    16.6 Componentes fuertemente conexas
    Problemas resueltos básicos
    Problemas resueltos básicos
    Problemas propuestos
    Capítulo 17 Grafos II: Algoritmos
    17.1 Ordenación topológica
    17.2 Matriz de caminos: Algoritmo de Warshall
    17.3 Problema de los caminos más cortos con un sólo origen: algoritmo de Dijkstra
    17.4 Problema de los caminos más cortos entre todos los pares de vertices: algoritmo de Floyd
    17.5 Concepto de flujo. Algoritmo de Ford Fulkerson
    17.6 Problema del arbol de expansión de coste mínimo
    17.7 Algoritmo de Prim y algoritmo de Kruskal
    Problemas resueltos básicos
    Problemas básicos
  • Citar Libro

Descargar Estructura de Datos en C (Schaum)

Tipo de Archivo
Idioma
Descargar RAR
Descargar PDF
Páginas
Tamaño
Libro
Español
458 pag.
2 mb

Déjanos un comentario

No hay comentarios

guest
0 Comentarios
Comentarios en línea
Ver todos los comentarios
0
Nos encantaría conocer tu opinión, comenta.x