UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

10.7. Realizaciones de tablas de datos en lenguaje C

Tras realizar el modelado completo de una aplicación, finalmente para los datos no persistentes, usualmente se debe traducir a un código concreto en el lenguaje de programación que corresponda, que sea capaz de definir las estructuras de datos necesarias para soportar dichos datos. Así mismo, se deben implementar en el lenguaje de programación concreto, aquellas funciones encargadas de realizar las manipulaciones de datos.

A menudo, la misma información se puede almacenar de diferentes formas utilizando un mismo lenguaje de programación. Por ejemplo, en el lenguaje de programación C, para almacenar información no persistente de una tabla modelada (por ejemplo la de fotos o la de autores), se pueden utilizar entre otros los siguientes métodos:

  1. Con una tabla estática de N elementos. El problema de esta solución es que normalmente el número de elementos de la tabla es indefinido, y al poner memoria estática estamos poniendo un límite máximo de N elementos, si hubiera más de esos elementos la aplicación no funcionaría correctamente. Por otro lado, si N es muy grande y el número de elementos actuales pequeños, se estaría utilizando mucha más memoria de la necesaria. En contrapartida, en cuanto a ventajas de esta solución tendremos que las operaciones de búsqueda son mucho más rápidas que por ejemplo una lista enlazada.

  2. Con una zona de memoria contigua que puede cambiar de tamaño para ajustarse al número de elementos que realmente hay. En este caso se tendrá un puntero que apunte al principio de esa área de memoria. Todos los elementos de la tabla están en posiciones continuas y no se tiene más memoria de la necesaria reservada, ya que se ajusta la memoria al número de elementos que realmente hay. Para ello, la primera reserva de memoria se hará con un malloc, y seguidamente cuando haya que añadir o eliminar un elemento se hará un realloc para ajustar el tamaño del área de memoria reservada para ajustarla aumentando o reduciendo memoria respectivamente.

  3. Con una lista enlazada, en la que cada elemento de la tabla es un elemento de la lista enlazada. Según se van incluyendo nuevos elementos, se insertan a la lista enlazada, y según se van eliminando elementos, se liberan dichas porciones de memoria de la lista enlazada y se enlaza adecuadamente.

  4. Con una tabla de hash, teniendo varias listas enlazadas. Cada elemento de la tabla de datos modelada, ocupará una posición de la tabla de hash, según el resultado de realizar una función de hash sobre uno de los campos del elemento. Así se obtendrá el índice de la tabla de hash donde se ubicará dicho elemento. Luego, cada una de las posiciones de la tabla de hash, tendrá su propia lista enlazada. Este método de almacenamiento, hace que en lugar de tener una sola lista enlazada se tengan M (tamaño de la tabla de hash), de forma que los tiempos de búsqueda en la lista enlazada se reducen, a costa de ocupar más memoria. Tal como se vio en una sesión anterior, dicha longitud M se puede aumentar o decrementar según el concepto de densidad.

Hasta ahora, se ha comentado en esta sección sobre implementaciones posibles en C de diferentes tablas de datos. Por otro lado, es interesante pensar también en cómo implementar la relación entre esas tablas, como por ejemplo las tablas de fotos y autores. Entre los métodos posibles para implementar dicha relación, están los siguientes, que se pueden combinar con cada uno de los 4 métodos que acabamos de ver:

  1. Relacionar un elemento foto con su elemento de autor a través de un campo de la tabla que sea un entero, que será el mismo en los dos elementos.

  2. Relacionar un elemento foto con su elemento autor a través de un puntero, tal que un campo del elemento foto tendrá un puntero al inicio del área de memoria donde se encuentra la información del autor correspondiente. Así, varias fotos apuntarán a la misma área de memoria correspondiente a su respectivo autor. En este caso, hay que notar que el campo AUTOR_ID no existiría en la tabla de autores, sino que su función se reemplazaría por dicho puntero. Es de notar, que no siempre es necesario que un determinado modelado de datos en genérico mapee luego exactamente todos sus campos en un lenguaje de programación específico, como es este el caso.

Como ejemplo, la siguiente figura muestra el caso en el que fotos y autores se almacenan en una lista encadenadad, y como la relación entre los dos elementos se implementa mediante punteros.

10.7.1. Preguntas de autoevaluación

Para cada afirmación seleccione verdadero o falso

  1. En lenguaje C la información no persistente se puede almacenar en la memoria principal de diferentes formas.

    • Verdadero

    • Falso

  2. Las tablas estáticas permiten almacenar un número indefinido de elementos.

    • Verdadero

    • Falso

  3. Si almacenamos la información en listas enlazadas estas no permiten establecer relaciones entre los elementos de las listas.

    • Verdadero

    • Falso