Estructuras Jerarquicas y Apuntadores

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 23

REPÚBLICA BOLIVARIANA DE VENEZUELA

UNIVERSIDAD NACIONAL EXPERIMENTAL


DE LOS LLANOS OCCIDENTALES
“EZEQUIEL ZAMORA”
PROGRAMA DE CIENCIAS BÁSICAS Y APLICADAS
SUBPROGRAMA DE INGENIERIA EN INFORMATICA
UNELLEZ - BARINAS

MÓDULO II

ESTRUCTURAS JERARQUICAS Y APUNTADORES

Profesor(a): Integrante:

Piñero C., Daniel A.


C.I: V-30.645.534
Sub-Proyecto: Algoritmo y Sección: P01
Período: 2022 - II
Programación 2

Barinas, Noviembre del 2022


Índice

Introducción 3

1.-Gestión dinámica de memoria 4

1.2-Tipo de datos puntero 4

2.-Operaciones con apuntadores 5

2.1.-Indirección 5

2.2.-Asignación 5

2.3.-Comparación 6

2.4.-Manejo de memoria dinámica con apuntadores 6

2.5.-Aplicaciones de los Apuntadores 8

3.- Operaciones con Árboles 8

3.1- Arboles N-Arios 10

3.2.-Recorrido de árboles 11

3.3.-Árboles de sintaxis 12

3.4.-Árbol binario de búsqueda 13

3.5.-Árboles binarios balanceados (AVL) 14

3.6.-Árbol-B 19

Conclusión 21

Referencias Bibliográficas 22

2
INTRODUCCIÓN

El lenguaje C proporciona elementos de programación que mejoran las aplicaciones en

todas las áreas de la ingeniería, adicional al conjunto de instrucciones, tiene un conjunto de

herramientas con propiedades importantes de programación que facilitan la implementación de

tareas específicas, estas herramientas de programación se basan en los apuntadores, estructuras y

unión de datos. En este capítulo se revisan aspectos y detalles de programación con variables

puntero o apuntadores, estructuras y uniones de datos; la presentación de los conceptos se apoyan

por medio de ejemplos didácticos de programación con código fuente en lenguaje C y

documentación detallada de los programas o sketch que se ejecutan directamente en las plataformas

electrónicas

Las estructuras de datos hasta ahora vistas se almacenan estáticamente en la memoria física

del ordenador. El espacio de memoria se reserva con anticipación y no cambia durante la ejecución

del programa y esto permite una comprobación de tipos en tiempo de compilación. La definición

y manipulación de estos objetos se realiza en Pascal mediante los punteros (variables cuyo

contenido son posiciones de memoria. También hablaremos sobre un apuntador siendo variable

que contiene la dirección de memoria de otra variable. Los apuntadores se utilizan para dar claridad

y simplicidad a las operaciones a nivel de memoria. Lenguaje C es un lenguaje de alto nivel porque

permite programar a bajo nivel. La programación a bajo nivel se refiere a la manipulación de los

recursos físicos de un equipo computacional. Los apuntadores permiten manipular de manera

directa las localidades de memoria RAM de la computadora.

3
1.-Gestión dinámica de memoria

1.2-Tipo de datos puntero

Hasta ahora, los tipos de datos que hemos visto (a excepción de strings y ficheros) eran

estructuras de datos estáticas, es decir, estructuras que no pueden cambiar de tamaño a lo largo

de todo el programa. Pero en los lenguajes dinámicos se pueden crear estructuras de datos

dinámicas, estructuras que sí que pueden variar su tamaño durante la ejecución del programa.

Además es posible crearlas y destruirlas en cualquier punto del programa, de manera que las

reglas de ámbito no las afectan directamente.

Este tipo de variables tienen sin embargo una diferencia muy importante con las variables

estáticas y es que en general no tienen nombre que las identifique. Por eso necesitamos utilizar

unas variables especiales para referenciar las variables dinámicas: los punteros.

Un puntero es una variable que contiene una posición de memoria, y por tanto se dice que

apunta a esa posición de memoria.

Ejemplo:

Puntero Variable dinámica

P 1000

Declaración de un puntero en C++:

typedef tipo * NombreTipo; NombreTipo

variable;

O directamente:

tipo * variable;

Ejemplo:

Declaración de un puntero a entero en C++:

4
typedef int * Ptr_int; Ptr_int p_i;

O directamente:

int * p_i

El tipo de dato al que apunta el puntero (en el ejemplo int) se denomina tipo base del

puntero.

Se debe tener en cuenta que cuando declaramos una variable de tipo puntero sólo se

reserva memoria para el puntero, NO para la variable a la que apunta.

Para obtener el contenido de una variable dinámica a la que apunta el puntero, utilizaremos

el operador de indirección * seguido del nombre del puntero.

Ejemplo:

*p_i = 5; cout << *p_i;

2.-Operaciones con apuntadores

2.1.-Indirección

Consiste en obtener el contenido de la variable a la que apunta el puntero. Se realiza, como

ya hemos visto, con el operador *.

2.2.-Asignación

A un puntero sólo se le puede asignar otro puntero, una dirección de memoria o la

constante NULL (dirección nula). Esta constante se utiliza normalmente para inicializar los

punteros.

Es importante distinguir entre la asignación de punteros y la asignación entre contenidos

de las variables dinámicas.

Ejemplo:

int *p, *q;

p = new int;

5
p
*p = 2;
q = new int;
*q = 5; q

p = q; *p = *q;

p p q

2.3.-Comparación

Sobre los punteros también están definidos los operadores de comparación, aunque los

únicos que se deben utilizar son los operadores de igualdad (==) o desigualdad (<>) de punteros,

ya que el resto de comparaciones no tienen sentido.

2.4.-Manejo de memoria dinámica con apuntadores

La memoria dinámica que se almacena en el heap es aquella que se utiliza para almacenar

datos que se crean en el medio de la ejecución de un programa. En general, este tipo de datos puede

llegar a ser casi la totalidad de los datos de un programa. Por ejemplo, supóngase un programa que

abre un fichero y lee una colección de palabras.

¿Cuántas palabras y de qué tamaño hay en el fichero?

Hasta que no se procese el fichero en su totalidad, no es posible saberlo. La manipulación

de memoria en C se hace con un mecanismo muy simple, pero a la vez muy propenso a errores.

Los dos tipos de operaciones son la petición y liberación de memoria. El ciclo es sencillo, cuando

se precisa almacenar un nuevo dato, se solicita tanta memoria en bytes como sea necesaria, y una

vez que ese dato ya no se necesita la memoria se devuelve para poder ser reutilizada. Este esquema

6
se conoce como “gestión explícita de memoria” pues requiere ejecutar una operación para pedir la

memoria y otra para liberarla.

Las cuatro operaciones principales para gestionar memoria en C son

 void *malloc(size_t size). Es la función para reservar tantos bytes consecutivos de memoria

como indica su único parámetro. Devuelve la dirección de memoria de la porción reservada.

La memoria no se inicializa a ningún valor.

 void *calloc(size_t nmemb, size_t size). Reserva espacio para tantos elementos como

indica su primer parámetro nmemb, y cada uno de ellos con un tamaño en bytes como indica

el segundo. En otras palabras, reserva nmemb * size bytes consecutivos en memoria. Al

igual que la función anterior devuelve la dirección de memoria al comienzo del bloque

reservado. Esta función inicializa todos los bytes de la zona reservada al valor cero.

 void free(void *ptr). Función que dado un puntero, libera el espacio previamente

reservado. El puntero que recibe como parámetro esta función tiene que ser el que se ha

obtenido con una llamada de reserva de memoria. No es necesario incluir el tamaño. Una

vez que se ejecuta esta llamada, los datos en esa porción de memoria se consideran basura,

y por tanto pueden ser reutilizados por el sistema.

 void *realloc(void *ptr, size_t size). Función para redimensionar una porción de memoria

previamente reservada a la que apunta el primer parámetro al tamaño dado como segundo

parámetro. La función devuelve la dirección de memoria de esta nueva porción

redimensionada, que no tiene por qué ser necesariamente igual al que se ha pasado como

parámetro. Los datos se conservan intactos en tantos bytes como el mínimo entre el tamaño

antiguo y el nuevo.

7
2.5.-Aplicaciones de los Apuntadores

Los apuntadores son usados principalmente en la creación de árboles, grafos y otras

estructuras de datos como métodos de búsqueda y para la asignación de memoria dinámica.

A continuación un ejemplo en C++ donde una función opera 2 punteros y modifica su valor original

por su cuadrado, para su posterior uso.

3.- Operaciones con Árboles:

Los árboles son unas estructuras de datos, formadas por nodos y enlaces, que guardan

información sobre los nodos anteriores y posteriores.

Los árboles son utilizados en algoritmos de ordenación, clasificación y búsqueda. En el

desarrollo de compiladores, los árboles se utilizan para representar expresiones de sintaxis del

8
lenguaje de programación. En inteligencia artificial, los árboles se utilizan para programación de

toma de decisiones, árboles de juegos, árboles de resolución, etc.

 Preorden: (raíz, izquierdo, derecho). Para recorrer un árbol binario no vacío en preorden,

se deben realizar las siguientes operaciones recursivamente en cada nodo, comenzando con

el nodo de raíz:

1. Visite la raíz

2. Atraviese el sub-árbol izquierdo

3. Atraviese el sub-árbol derecho

 Inorden: (izquierdo, raíz, derecho). Para recorrer un árbol binario no vacío en inorden

(simétrico), se deben realizar las siguientes operaciones recursivamente en cada nodo:

1. Atraviese el sub-árbol izquierdo

2. Visite la raíz

3. Atraviese el sub-árbol derecho

 Postorden: (izquierdo, derecho, raíz). Para recorrer un árbol binario no vacío en postorden,

se deben realizar las siguientes operaciones recursivamente en cada nodo:

1. Atraviese el sub-árbol izquierdo

2. Atraviese el sub-árbol derecho

3. Visite la raíz

En general, la diferencia entre preorden, inorden y postorden es cuándo se recorre la raíz.

En los tres, se recorre primero el sub-árbol izquierdo y luego el derecho.

 En preorden, la raíz se recorre antes que los recorridos de los subárboles izquierdo

y derecho

 En inorden, la raíz se recorre entre los recorridos de los árboles izquierdo y

derecho, y

9
 En postorden, la raíz se recorre después de los recorridos por el subárbol izquierdo

y el derecho

Preorden (antes), inorden (en medio), postorden (después).

3.1- Arboles N-Arios:

Un árbol n-ario es una estructura re cursiva, en la cual cada elemento tiene un número

cualquiera de árboles n-arios asociados. Estos árboles corresponden a la generalización de un árbol

binario. La diferencia radica en que esta estructura puede manejar múltiples sub árboles asociados

a cada elemento, y no solamente 2, como en el caso de los árboles binarios.

Conceptos que se extienden de árboles binarios:

• Nodo: elemento del árbol.

• Raíz: nodo inicial del árbol.

• Hoja: nodo sin hijos.

• Camino: nodos entre dos elementos incluyéndolos.

• Rama: camino entre la raíz y una hoja.

• Altura: número de nodos en la rama más larga.

• Peso: número de nodos en el árbol.

Orden de un elemento:

• Número de subárboles asociados.

• Una hoja es un elemento de orden 0.

Orden de un árbol n-ario:

• Máximo orden de sus elementos.

Implementación genérica:

10
3.2.-Recorrido de árboles:

En ciencias de la computación, el recorrido de árboles se refiere al proceso de visitar de una

manera sistemática, exactamente una vez, cada nodo en una estructura de datos de árbol

(examinando y/o actualizando los datos en los nodos). Tales recorridos están clasificados por el

orden en el cual son visitados los nodos. Los siguientes algoritmos son descritos para un árbol

binario, pero también pueden ser generalizados a otros árboles.

Comparado a las estructuras de datos lineales como las listas enlazadas y arreglos

unidimensionales, que tienen un método canónico de recorrido, las estructuras arborescentes

pueden ser recorridas de muchas maneras diferentes.

Comenzando en la raíz de un árbol binario, hay tres pasos principales que pueden ser

realizados y el orden en la cual son realizados define el tipo de recorrido. Estos pasos (en ningún

orden particular) son: ejecución de una acción en el nodo actual (referido como “visitando” el

nodo), recorriendo al nodo hijo de la izquierda, y recorriendo al nodo hijo de la derecha. Así el

proceso más fácilmente descrito a través de la recursión.

Los nombres dados para un estilo particular de recorrido vienen de la posición del elemento

de raíz con respecto a los nodos izquierdo y derecho. Imagine que los nodos izquierdo y derecho

son constantes en espacio, entonces el nodo raíz pudiera colocarse a la izquierda del nodo izquierdo

(pre-orden), entre el nodo izquierdo y derecho (in-orden), o a la derecha del nodo derecho (post-

11
orden). Con el fin de ilustrar, se asume que los nodos izquierdos tienen siempre prioridad sobre los

nodos derechos. Este ordenamiento puede ser invertido mientras el mismo orden sea asumido para

todos los métodos de recorrido.

3.3.-Árboles de sintaxis

En lenguajes formales y lingüística computacional, un árbol de sintaxis abstracta (AST), o

simplemente un árbol de sintaxis, es una representación de árbol de la estructura sintáctica

simplificada del código fuente escrito en cierto lenguaje de programación.

Cada nodo del árbol denota una construcción que ocurre en el código fuente. La sintaxis es abstracta

en el sentido que no representa cada detalle que aparezca en la sintaxis verdadera. Por ejemplo, el

agrupamiento de los paréntesis está implícito en la estructura arborescente, y una construcción

sintáctica tal como IF condición THEN puede ser denotada por un solo nodo con dos ramas.

12
Esto hace a los árboles de sintaxis abstracta diferente de los árboles de sintaxis concreta,

llamados tradicionalmente árboles de parser, que son a menudo construidos por la parte parser de

la traducción del código fuente y el proceso de compilación (a pesar quizás de un nombramiento

no intuitivo). Una vez construido, información adicional es agregada al AST por procesamiento

subsecuente, ej., análisis semántico.

3.4.-Árbol binario de búsqueda

Un árbol binario de búsqueda también llamado BST (acrónimo del inglés Binary Search

Tree) es un tipo particular de árbol binario que presenta una estructura de datos en forma de árbol

usada en informática.

Para una fácil comprensión queda resumido en que es un árbol binario que cumple que el

subárbol izquierdo de cualquier nodo (si no está vacío) contiene valores menores que el que

contiene dicho nodo, y el subárbol derecho (si no está vacío) contiene valores mayores.

Para estas definiciones se considera que hay una relación de orden establecida entre los

elementos de los nodos. Que cierta relación esté definida, o no, depende de cada lenguaje de

programación. De aquí se deduce que puede haber distintos árboles binarios de búsqueda para un

mismo conjunto de elementos.

13
La altura h en el peor de los casos es siempre el mismo tamaño que el número de elementos

disponibles. Y en el mejor de los casos viene dada por la expresión H = [Log2(c+1)].

El interés de los árboles binarios de búsqueda (ABB) radica en que su recorrido en in orden

proporciona los elementos ordenados de forma ascendente y en que la búsqueda de algún elemento

suele ser muy eficiente.

Dependiendo de las necesidades del usuario que trate con una estructura de este tipo, se

podrá permitir la igualdad estricta en alguno, en ninguno o en ambos de los subárboles que penden

de la raíz. Permitir el uso de la igualdad provoca la aparición de valores dobles y hace la búsqueda

más compleja.

3.5.-Árboles binarios balanceados (AVL)

Existen diferentes tipos y variaciones de los árboles binarios, y una de las más importantes

es la de los árboles binarios balanceados, árboles binarios de búsqueda balanceados, o simplemente,

árboles AVL.

Un árbol binario balanceado (también conocidos simplemente como árboles AVL en honor

a sus creadores Adelson-Velski y Landis) es un árbol binario de búsqueda (ABB) en el que las

alturas de los dos subárboles de cada nodo difieren a lo más en 1.

El balance de un nodo en un árbol binario en general y de un árbol AVL en particular, se

define como la altura de su subárbol izquierdo menos la altura de su subárbol derecho:

| altura(arbolIzquierdo) - altura(arbolDerecho) | < 2

También existe la correspondiente definición simétrica: la altura de su subárbol derecho

menos la altura de su subárbol izquierdo; pero en este blog se adoptará la primera. Por convención,

la altura de un árbol AVL nulo o vacío se define como -1.

Durante el proceso de inserción o eliminación puede ocurrir un desbalance, es decir, que el valor

absoluto de la altura de alguno de los nodos del árbol AVL sea mayor que 1.

14
En caso de existir desbalance en alguno de los nodos, es decir, una condición que incumpla lo

establecido por la expresión anterior, se tiene que re balancear el árbol para que éste siga siendo un

árbol AVL válido.

En este sentido, existen cuatro casos que corrigen el balanceo de un árbol AVL:

1. Caso 1: rotación simple derecha.

2. Caso 2: rotación simple izquierda.

3. Caso 3: rotación doble izquierda derecha.

4. Caso 4: rotación doble derecha izquierda.

A continuación se describen dos de estos cuatro casos, debido a que los otros dos son

simétricos y pueden derivarse fácilmente a partir de los que se presentan.

Rotación simple

El primer caso de rebalanceo, la rotación derecha también conocida como rotación simple, se

ilustra en la siguiente figura:

La figura (a) muestra hasta antes de la inserción del elemento representado por el cuadrado

rojo (cuadrado más obscuro), un árbol AVL balanceado. El balance puede determinarse

gráficamente por los niveles representados por líneas horizontales punteadas: el balance para los

nodos A y B es 0 y 1 respectivamente. Al insertar el elemento representado por el cuadrado rojo

(cuadrado más obscuro), se presenta un desbalance sobre el nodo B: ahora el balance para los nodos

A y B es 1 y 2 respectivamente.

15
Por otro lado, la figura (b) muestra la solución al desbalanceo descrito en el párrafo anterior.

Para visualizarlo mejor, imagine que en la figura (a), en el nodo representado por B existe una

polea fija, de tal forma que al "jalar" z hacia abajo, el subárbol izquierdo de B representado por A

sube, mientras que B baja convirtiéndose en el subárbol derecho de A. Note cómo y pasa de ser

subárbol derecho de A, a ser subárbol izquierdo de B.

Para el caso de la rotación izquierda el proceso es análogo pero de manera simétrica, al de la

rotación derecha descrita en esta sección.

Ejemplo:

Considere el árbol AVL (asegúrese de que en efecto sea un árbol AVL y determine que el

balance de cada uno de los nodos que se presenta es correcto) que aparece en la siguiente figura en

(a):

La rotación simple derecha se presenta al insertar los elementos 1 o 3, los cuales se

resaltan y presentan en la figura (b).

El nodo desbalanceado es el que contiene al elemento 8 (¿Por qué?). La aplicación del

Caso 1 de rotación dará como resultado el árbol AVL que aparece en la figura (c) dependiendo

16
del elemento (1 o 3) que se haya insertado, de tal forma que la rotación simple derecha se realiza

sobre el nodo que contiene al elemento 8 de la figura (b).

Observe cómo la aplicación de la rotación simple corrige el balance general del árbol, de

tal forma que el balance obtenido es casi perfecto.

Antes de continuar, asegúrese de comprender el proceso de rebalanceo aplicado a la figura

anterior, así como de determinar por su propia cuenta, el balance de cada uno de los nodos para

los tres incisos.

Rotación doble

El caso de rebalanceo que implica una rotación doble es un proceso un poco más elaborado

que el de la rotación simple, ya que como su nombre lo indica, implica dos rotaciones. La

rotación doble izquierda derecha se muestra en la siguiente figura:

Ante una situación como la que se presenta en la figura (a) la solución está dada por la

figura (c). Ahora bien, existe un paso intermedio entre éstas, mismo que está representado por la

figura (b) y es el que se explicará a continuación:

17
 La figura (a) muestra, hasta antes de la inserción del elemento representado por el cuadrado

rojo (cuadrado más obscuro), un árbol AVL balanceado. El balance puede determinarse

gráficamente por los niveles representados por líneas horizontales punteadas: el balance para los

nodos A, B y C es 0, 0 y 1 respectivamente. Al insertar cualquiera de los elementos representados

por el cuadrado rojo (cuadrado más obscuro), se presenta un desbalance sobre el nodo C: ahora el

balance para los nodos A, B y C es -1, (1 o -1 según sea el elemento insertado) y 2 respectivamente.

 Aunque C es el nodo desbalanceado, observe que el balance no se corrige si se realiza una

rotación derecha sobre C (asegúrese de comprobarlo). Por otro lado, note los signos de los balances

generados por la inserción del elemento que provoca el desbalance.

 En base a lo anterior, la figura (b) muestra una rotación izquierda sobre A aunque el

nodo A no está desbalanceado. Note que el balance no se ha corregido todavía, ya que el balance

de A es 0 o 1, el de B es 2 o 1, y el de C 2.

 Ahora bien, partiendo de la figura (b), una nueva rotación derecha sobre C generará el árbol

de la figura (c) mejorando significativamente el balance general de la mayoría de los nodos.

Asegúrese de comprender la doble rotación izquierda derecha explicada hasta aquí antes de

continuar. El caso de la rotación doble derecha izquierda es simétricamente análogo o lo descrito

con anterioridad.

Ejemplo:

Para ilustrar la rotación doble, considere el árbol AVL que aparece en la siguiente figura en (a).

Una vez más y antes de continuar, compruebe que dicho árbol es un árbol AVL y que los balances

propuestos son correctos.

18
La rotación doble se presenta al insertar cualquiera de los elementos 5 o 7 (figura (b)).

La aplicación de la rotación doble dará como resultado el árbol AVL que aparece en la

figura (c) dependiendo del nodo que se haya insertado. Se deja como ejercicio para el lector generar

el paso intermedio y comparar su resultado con el de la figura (c). El paso intermedio consiste en

hacer una rotación izquierda sobre 4 en la figura (b), y posteriormente una rotación derecha sobre

8; estas dos rotaciones deberán generar la figura (c). Una vez más observe los signos de los balances

en la rotación simple y en la doble; y asegúrese de comprender los procesos de balanceo aplicados

en los ejemplos.

3.6.-Árbol-B

En las ciencias de la computación, los árboles-B o B-árboles son estructuras de datos de

árbol que se encuentran comúnmente en las implementaciones de bases de datos y sistemas de

archivos. Al igual que los árboles binarios de búsqueda, son árboles balanceados de búsqueda, pero

cada nodo puede poseer más de dos hijos.1 Los árboles B mantienen los datos ordenados y las

inserciones y eliminaciones se realizan en tiempo logarítmico amortizado.

La idea tras los árboles-B es que los nodos internos deben tener un número variable de

nodos hijo dentro de un rango predefinido. Cuando se inserta o se elimina un dato de la estructura,

la cantidad de nodos hijo varía dentro de un nodo. Para que siga manteniéndose el número de nodos

dentro del rango predefinido, los nodos internos se juntan o se parten. Dado que se permite un

19
rango variable de nodos hijo, los árboles-B no necesitan re balancearse tan frecuentemente como

los árboles binarios de búsqueda auto-balanceables. Pero, por otro lado, pueden desperdiciar

memoria, porque los nodos no permanecen totalmente ocupados. Los límites (uno superior y otro

inferior) en el número de nodos hijo son definidos para cada implementación en particular. Por

ejemplo, en un árbol-B 2-3 (A menudo simplemente llamado árbol 2-3), cada nodo sólo puede

tener 2 o 3 nodos hijos.

Un árbol-B se mantiene balanceado porque requiere que todos los nodos hoja se encuentren a la

misma altura.

Los árboles B tienen ventajas sustanciales sobre otras implementaciones cuando el tiempo

de acceso a los nodos excede al tiempo de acceso entre nodos. Este caso se da usualmente cuando

los nodos se encuentran en dispositivos de almacenamiento secundario como los discos rígidos. Al

maximizar el número de nodos hijo de cada nodo interno, la altura del árbol decrece, las

operaciones para balancearlo se reducen, y aumenta la eficiencia. Usualmente este valor se coloca

de forma tal que cada nodo ocupe un bloque de disco, o un tamaño análogo en el dispositivo.

Mientras que los árboles B 2-3 pueden ser útiles en la memoria principal, y además más fáciles de

explicar, si el tamaño de los nodos se ajusta para caber en un bloque de disco, el resultado puede

ser un árbol B 129-513.

Los creadores del árbol B, Rudolf Bayer y Ed McCreight, no han explicado el significado

de la letra B de su nombre. Se cree que la B es de balanceado, dado que todos los nodos hoja se

mantienen al mismo nivel en el árbol. La B también puede referirse a Bayer, o a Boeing, porque

sus creadores trabajaban en los Boeing Scientific Research Labs por ese entonces.

20
CONCLUSIÓN

El modelo jerárquico de base de datos es uno de los primeros en aparecer, solo podían

modelar relaciones pero se podía arreglar usando los Vínculos Virtuales. Los vínculos virtuales

posibilitan las relaciones, el principal problema del este sistema es el de la poca independencia de

los programas con respecto al almacenamiento de datos. La implementación de productos se

efectúa con punteros, esto facilitaba para que el usuario pueda conseguir un diseño físico de la base

de datos.

21
REFERENCIAS BIBLIOGRÁFICAS

Cortes, F. y Monjaraz, J. (s.f.). Arduino. Aplicaciones en Robótica y Mecatrónica. Alfaomega.

Recuperado de:

https://libroweb.alfaomega.com.mx/book/890/free/data/lecturas_complementarias/cap5/ard

uino_Cap5_Web.pdf.

Larrea, R. (s. f.). Modelo Jerárquico. Recuperado de:

https://www.monografias.com/trabajos79/modelo-jerarquico/modelo-jerarquico

Wikipedia (2022). Árbol-B. Recuperado de: https://es.wikipedia.org/wiki/%C3%81rbol-

B#/media/Archivo:B-tree_example.svg

Wikipedia (2022). Árbol de sintaxis abstracta. Recuperado de:

https://es.wikipedia.org/wiki/%C3%81rbol_de_sintaxis_abstracta

Wikipedia (2022). Recorrido de árboles. Recuperado de:

https://es.wikipedia.org/wiki/Recorrido_de_%C3%A1rboles#Ejemplo

Álvarez, J. (s.f.). Memoria Dinámica y Punteros. Recuperado de:

https://www.infor.uva.es/~jvalvarez/docencia/tema2.pdf

García, E y Solano, J. (s.f.). Aplicaciones de apuntadores. Recuperado de: http://odin.fi-

b.unam.mx/salac/practicasEDAA/eda1_p2.pdf

Barber, F. y Ferrís, R. (s.f.). Gestión dinámica de memoria. Recuperado de:

http://informatica.uv.es/iiguia/AED/oldwww/2004_05/AED.Tema.08.pdf

22

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy