You are on page 1of 146

Estructura de Datos

Manual Autoformativo Interactivo

Walter F. Jesús Videla


Datos de catalogación bibliográfica

Estructura de Datos. Manual Autoformativo Interactivo


Walter F. Jesús Videla
Primera edición

Huancayo, abril de 2017

De esta edición
© Universidad Continental
Av. San Carlos 1980, Huancayo-Perú
Teléfono: (51 64) 481-430 anexo 7361
Correo electrónico: recursosucvirtual@continental.edu.pe
http://www.continental.edu.pe/

Versión e-book
Disponible en http://repositorio.continental.edu.pe/
ISBN electrónico N.° 978-612-4196-

Dirección: Emma Barrios Ipenza


Edición: Eliana Gallardo Echenique
Asistente de edición: Andrid Poma Acevedo
Asesoría didáctica: Karine Bernal
Corrección de textos: Eliana Gallardo Echenique
Diseño y diagramación: Francisco Rosales Guerra

Todos los derechos reservados. Cada autor es responsable del contenido de su propio texto.

Este manual autoformativo no puede ser reproducido, total ni parcialmente, ni registrado en o transmitido
por un sistema de recuperación de información, en ninguna forma ni por ningún medio sea mecánico, foto-
químico, electrónico, magnético, electro-óptico, por fotocopia, o cualquier otro medio, sin el permiso previo
de la Universidad Continental.
Índice

INTRODUCCIÓN 7

ORGANIZACIÓN DE LA ASIGNATURA 8
RESULTADO DE APRENDIZAJE: 8
UNIDADES DIDÁCTICAS 8
TIEMPO MÍNIMO DE ESTUDIO 8

UNIDAD I
REPRESENTACIÓN DE DATOS Y ESTRUCTURAS DE CONTROL 9

DIAGRAMA DE ORGANIZACIÓN DE LA UNIDAD I 9


ORGANIZACIÓN DE LOS APRENDIZAJES 10

Tema N.º 1: Representación de datos 11


Introducción al tema 11
1. ¿En qué consiste la estructura de datos? 11
2. ¿Por qué se denomina estructura de datos? 12
3. Representación de datos 12

Tema n.º 2: Estructuras de control 22


Introducción al tema 22
1. ¿Por qué usar estructuras de control? 22
2. La estructura de control condicionada simple 23
3. La estructura de control condicional doble 25
4. La estructura de control múltiple 26

Tema n.º 3: Estructuras de control repetitivas 29


Introducción al tema 29
1. Estructuras de control repetitivas 29
2. La instrucción FOR 31
Lectura seleccionada n.º 1: 33
Actividad N.º 1 33

Glosario de la Unidad I 34

Bibliografía de la Unidad I 35

Autoevaluación n.º 1 36
UNIDAD II
ARREGLOS Y MATRICES 39

DIAGRAMA DE ORGANIZACIÓN DE LA UNIDAD II 39


ORGANIZACIÓN DE LOS APRENDIZAJES 40

Tema n.º 1: Arrays unidimensionales, bidimensionales y multidimensionales. Operaciones con ellos 41


Introducción 41
1. Definición 41
2. Creación de arreglos 42
3. Operaciones con arreglos 42
4. Conversión de arreglos multidimensionales a unidimensionales 47
5. Arreglo de arreglos 50

Tema n.º 2: Matrices 52


1. Definición 52
2. Implementación 53
3. Operaciones con matrices 55
4. Matrices especiales 59
Lectura seleccionada n.º 02: Gestión dinámica de memoria 59
Actividad N.° 02 60

Glosario de la Unidad II 61

Bibliografía de la Unidad II 62

Autoevaluación de la Unidad II 62

UNIDAD III
ESTRUCTURAS LINEALES Y NO LINEALES DE DATOS 65

DIAGRAMA DE ORGANIZACIÓN 65
ORGANIZACIÓN DE LOS APRENDIZAJES 66

Tema n.º 1: Pilas, colas y listas 67


1. Pilas 67
2. Colas 69
3. Listas 73

Tema N.º 2: Grafos 78


1. Definición 78
2. Representación de grafos 79
3. Operaciones con grafos 81

Tema n.º 3: Árboles 89


1. Definición 89
2. Implementación de árboles 90
3. Árbol binario 90
Lectura seleccionada n.º 3 97
Actividad N.º 3 97
Actividad N.º 4 97

Glosario de la Unidad III 98

Bibliografía de la Unidad III 98

Autoevaluación N.º3 100

UNIDAD IV
Organización de datos y archivos 103

DIAGRAMA DE ORGANIZACIÓN 103


ORGANIZACIÓN DE LOS APRENDIZAJES 104

Tema N.º 1: Tablas Hash 105


1. Definición 105
2. Función de dispersión 105
3. Resolución de colisiones 107

Tema N.º 2: Modelo de datos relacional 112


1. Base de datos 112
2. El modelo entidad-relación 112
3. Fundamentos del modelo entidad-relación 114
4. Estructura de una base de datos relacional 116
5. Interactuación Aplicación–Base de datos 120

Tema N.º 3: Organización de archivos 124


1. Archivo 124
2. Organización de archivos 125
Lectura seleccionada n.º 04 137
Actividad N.º 4 138
Actividad N.º 5 138
Glosario de la Unidad IV 139

Bibliografía de la Unidad IV 140

Autoevaluación N.º 4 141

ANEXO: Solucionario de las autoevaluaciones 144


Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

INTRODUCCIÓN

E
l presente manual autoformativo corresponde a • Unidad III: Estructuras lineales y no lineales
la asignatura de Estructura de Datos de la mo-
dalidad virtual de la Universidad Continental y • Unidad IV: Organización de datos y archivos
constituye el material didáctico más importante para
Durante su desarrollo se describirán conceptualmen-
su estudio.
te y con ejemplos las principales estructuras de datos
Al finalizar la asignatura de estructura de datos us- como arreglos, matrices, colas, listas, grafos y árbo-
ted estará en capacidad de elaborar y programar al- les de búsqueda.
goritmos más eficientes en términos de tiempo de
Se sugiere seguir esta secuencia de pasos:
procesamiento y uso de memoria, garantizándole el
desarrollo de software de calidad. Los temas a tratar a) Realizar el estudio de los contenidos
son los siguientes:
b) Estudiar las lecturas seleccionadas
• 
Unidad I: Representación de datos y estructu-
ras de control c) Desarrollar la autoevaluación

• Unidad II: Arreglos y matrices d) Desarrollar las actividades programadas

El autor

7
ORGANIZACIÓN DE LA ASIGNATURA

RESULTADO DE APRENDIZAJE:
Al finalizar la asignatura, el estudiante será capaz de seleccionar las estructuras de datos adecuadas para los
algoritmos, de acuerdo a la problemática planteada.

UNIDADES DIDÁCTICAS
UNIDAD I UNIDAD II UNIDAD III UNIDAD IV
Representación de datos y Estructuras lineales y no Organización de datos y
Arreglos y matrices
estructuras de control lineales de datos archivos

Resultado de aprendizaje Resultado de aprendizaje Resultado de aprendizaje Resultado de aprendizaje


Al finalizar la unidad, el Al finalizar la unidad, el Al finalizar la unidad, el Al finalizar la unidad, el
estudiante será capaz de estudiante será capaz de se- estudiante será capaz de estudiante será capaz de
seleccionar las estructuras leccionar las estructuras de seleccionar las estructuras reconocer la organización de
de control adecuadas, según arreglos y matrices, según la lineales y no lineales, en datos y archivos a través del
la problemática propuesta. problemática propuesta. la solución de diversos estudio de casos.
problemas.

TIEMPO MÍNIMO DE ESTUDIO


UNIDAD I UNIDAD II UNIDAD III UNIDAD IV
1.ª y 2.ª semanas 3.ª y 4.ª semanas 5.ª y 6.ª semanas 7.ª y 8.ª semanas
12 horas 20 horas 20 horas 12 horas

8
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

UNIDAD I

REPRESENTACIÓN DE DATOS Y ESTRUCTURAS DE


CONTROL

DIAGRAMA DE ORGANIZACIÓN DE LA UNIDAD I

CONTENIDOS

AUTOEVALUACIÓN EJEMPLOS

BIBLIOGRAFÍA ACTIVIDADES

9
ORGANIZACIÓN DE LOS APRENDIZAJES

Resultado de aprendizaje de la Unidad I:


Al finalizar la unidad, el estudiante será capaz de seleccionar las estructuras de control adecuadas, según la problemática propuesta.

CONOCIMIENTOS HABILIDADES ACTITUDES


Tema n.º 1: Representación de datos 1. Identifica los conceptos de represen- 1. Demuestra perseverancia y esfuerzo
1. ¿En qué consiste la estructura de tación de datos. durante el desarrollo de los ejerci-
datos? cios.

2. ¿Por qué se denomina estructura de 2. Describe las estructuras de control


datos? simple, doble y múltiple. 2. Toma conciencia de la importancia
3. Representación de datos de la asignatura en su formación
profesional.
3. Identifica y compara las estructuras
Tema n.º 2: Estructuras de control de control repetitivas.
3. V
 alora las relaciones entre sus com-
1. ¿Por qué se deben usar estructuras pañeros.
de control?
2. Estructura de control condicionada
simple
3. Estructura de control condicionada
doble
4. Estructura de control condicionada
múltiple

Tema n.º 3: Estructura de control


repetitivas
1. Estructura de control repetitiva
2. La instrucción FOR

Lectura seleccionada n.º 1:


El concepto de datos estructurados

Autoevaluación de la Unidad I

10
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Tema N.º 1:
Tema N.º 1: Representación de datos

UNIDAD I
Representación de datos
Introducción al tema
El objetivo de esta primera unidad es brindar los conceptos fundamentales sobre los
que se elaboran los demás contenidos de la asignatura. Por ello, en este primer tema
se describe en qué consisten las estructuras de datos y qué relación guardan con los
Introducción al tema
algoritmos. A continuación, se detallan las formas de representar los datos en el
computador, diferenciando entre datos simples y datos estructurados. Asimismo, es
El objetivo de esta primera
primordial, para launidad es brindar losde
implementación conceptos fundamentales
tales estructuras sobre los que se
la comprensión delelaboran
tema delos demás

Tema N.º 1
contenidos
las denominadas estructuras de control, las cuales se abordan como último acápite.de datos
de la asignatura. Por ello, en este primer tema se describe en qué consisten las estructuras
y qué relación
Se debe guardan
aclararcon los algoritmos.
que, aunque tenganA continuación,
un nombrese detallan las formas
relacionado de representar
al título del curso,los datos en el
más
computador,
están diferenciando
vinculadas alentre datos
diseño desimples y datos estructurados. Asimismo, es primordial, para la imple-
algoritmos.
mentación de tales estructuras la comprensión del tema de las denominadas estructuras de control, las cuales
1. ¿En
se abordan como qué consiste
último acápite. la
Seestructura de datos?
debe aclarar que, aunque tengan un nombre relacionado al título del curso,
más están vinculadas al diseño de algoritmos.
Posiblemente a usted le resulten familiares algunas de estas frases: “se cayó el
sistema”, “el programa está lento”, “se colgó el software, reinicia la máquina”, entre
otras. Descartando la existencia de problemas técnicos con el computador y la red
1. ¿En qué consiste la estructura de datos?
de datos, el siguiente factor que puede afectar el rendimiento de un software es la
calidad de los algoritmos que emplea para procesar la información. Precisamente, la
Posiblemente a usted
estructura de le resulten
datos familiares
se refiere al algunas
conjunto de de
estas frases: para
técnicas “se cayó el sistema”
desarrollar , “el programa
software, o está
lento”, “se colgó el software, reinicia la máquina” , entre otras. Descartando
exactamente algoritmos, que utilicen de una manera eficiente los recursos de la la existencia de problemas técnicos
con el computadora.
computador y laTal red eficiencia
de datos, elessiguiente
medida, factor que puede afectar
principalmente, el rendimiento
en términos de un software
de tiempo de es
la calidad de los algoritmos
procesamiento y usoquedeemplea para procesar la información. Precisamente, la estructura de datos se
memoria.
refiere al conjunto de técnicas para desarrollar software, o exactamente algoritmos, que utilicen de una manera
Weiss
eficiente (2000)deconsidera
los recursos la computadora.que Tal
muchos algoritmos
eficiencia es medida,requieren
principalmente,una enrepresentación
términos de tiempo de
apropiada de los
procesamiento y uso de memoria.datos para lograr ser eficientes. Esta representación junto con las
operaciones permitidas se llama estructura de datos.
Weiss (2000) considera que muchos algoritmos requieren una representación apropiada de los datos para lograr
ser eficientes.
RECUERDA:Esta representación junto con las operaciones permitidas se llama estructura de datos.

RECUERDA:
Un algoritmo es “un conjunto de instrucciones claramente especificadas que el
ordenador debe seguir para resolver un problema” (Weiss, 2000, p. 103).
Un algoritmo es “un conjunto de instrucciones claramente especificadas que el ordenador debe seguir para
resolver
Launfigura
problema” (Weiss,
1 ilustra esta2000, p. 103).
descripción.
La figura 1 ilustra esta descripción.
Figura 1 Representación de un algoritmo
Algoritmo

Paso 1 Paso 2 Paso n

Fuente: Elaboración propiaFigura 1 Representación de un algoritmo


Fuente: Elaboración propia
2. ¿Por qué se denomina estructura de datos?

Usted recordará que por definición todo computador transforma datos en


información útil para el usuario; por ejemplo, si se ingresa la operación (5 + 2) se
espera que el computador lo interprete, lo procese y devuelva el resultado 7. En
lenguaje C++ podría trabajarse un programa como el siguiente: 11
2. ¿Por qué se denomina estructura de datos?
UNIDAD I

Usted recordará que por definición todo computador transforma datos en información útil para el usuario; por
ejemplo, si se ingresa la operación (5 + 2) se espera que el computador lo interprete, lo procese y devuelva el
resultado 7. En lenguaje C++ podría trabajarse un programa como el siguiente:

void main()
{
int a, b;
cin>> a;
cin>> b;
Tema N.º 1

cout<< “La suma es: ”<< a+b << endl;


}

Programa 1.1

Una tarea muy sencilla ¿verdad?

¿Pero qué sucede cuando se debe procesar mayor cantidad de datos, por ejemplo, calcular la cantidad de notas
aprobatorias de una lista de 50 estudiantes?

1ª opción: Se elabora un programa que solicite cada nota (una por una), mientras un contador va incrementándo-
se en la unidad cada vez que identifica una nota mayor que 10.

¿Cuánto tiempo tomaría la digitación? ¿Y si se ingresa mal un dato?

2ª opción: Se puede solicitar cada nota y guardarla en una variable independiente; al final se compran por sepa-
rado para determinar si son aprobatorias.

¿Cuántas líneas de código tendría este programa?

Entonces, frente a estos inconvenientes se propone disponer los datos en estructuras (de ahí “estructura de
datos”) como, por ejemplo, arreglos —o arrays por su denominación en inglés—, a fin de agilizar las tareas de
lectura y escritura de los mismos, mientras se minimiza el esfuerzo de procesamiento, la cantidad de líneas de
código, el tiempo de programación, etc.

3. Representación de datos

3.1. Tipos de datos


Para que un programa funcione debe estar en la capacidad de recibir, procesar y almacenar diferentes tipos
de datos. Aunque cada lenguaje de programación maneja sus propios tipos, en términos generales su pueden
considerar los siguientes:

• Numérico: 1, -5, 3.67, etc.

• Texto o cadena: “ABC”, “Palabra”, “wjesus@continental.edu.pe”, etc.

• Fecha / hora: 07/09/15, 12/12/16 15:23, etc.

• Lógico: Verdadero, falso.

Sahni (2005) denomina a este universo de posibles valores como “objetos de datos” (o Data Objects), y lo define
como un conjunto de instancias o valores.

12
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Para que unFigura 2. Representación


programa de la memoria
pueda guardar un determinado de uso
valor hace un de
computador
las llamadas “variables”, las cuales físi-
camente se traducen en espacios reservados de memoria: imagine a la memoria de la computadora como una
gran tabla en la que en cada celda se puede almacenar un dato; al crearse una variable y asignársele
5 un nombre,

UNIDAD I
Figura
el software 2. Representación
reserva unaPalabra de
de estas celdas. la memoria
Observe de un
la siguiente computador
figura:
Dato de tipo entero
Dato de tipo cadena 5
Palabra
Dato de tipo entero
Fuente: Elaboración propia
Dato de tipo cadena

Tema N.º 1
Para recuperar al valor correspondiente
Fuente: Elaboración bastará
propia con referenciar (llamar) al
nombre de laFigura
variable creada.
2. Representación de la memoria de un computador
Fuente: Elaboración propia
ParaEl recuperar
programa al 1.2valor
muestra un ejemplo debastará
correspondiente cómo crear una variable,
con referenciar asignarle
(llamar) al un
valor
nombre y
de luego
la recuperarlo.
variable creada.
Para recuperar al valor correspondiente bastará con referenciar (llamar) al nombre de la variable creada.

El programavoid main()un ejemplo de cómo crear una variable, asignarle un valor y luego recuperarlo.
El1.2 muestra
programa 1.2 muestra un ejemplo de cómo crear una variable, asignarle un
{
valor y luego recuperarlo.
void main() int a; // Declarar la variable “a” de tipo entero
a=5; // La variable recibe el valor de 5
void main()
{ cout<<“El valor ingresado es: ”<< a << endl; // Recuperar el
{
int a; // a;
Declarar//laDeclarar
variablela“a” de tipo“a” entero // valor de a
int variable de tipo entero
}
a=5; a=5; // La//variable recibe
La variable el valor
recibe de 5 de 5
el valor
Programa 1.2
cout<<“El valorvalor
cout<<“El ingresado es: ”<<
ingresado es: a”<<<< aendl;
<< endl;// Recuperar
// Recuperar el
el
// valor de a // valor de a
} } 3.2. Datos simples y datos estructurados
Programa 1.2
Programa 1.2 Según manifiesta Cruz (2011, p. 8), “la principal característica de los datos
3.2.simples
Datos es que ocupan
simples y datos solo una casilla de la memoria, por lo tanto, hacen
estructurados
referencia a un único valor a la vez”, mientras que “los datos estructurados se
3.2. Datos simples
Según y datospor
caracterizan
manifiesta estructurados
Cruzel hecho
(2011, dep. que conprincipal
8), “la un solo característica
nombre (o también de los datosllamado
identificador
simples es que de variables)
ocupan solo se hace
una referencia
casilla de la amemoria,
un grupo de porcasillas de memoria”;
lo tanto, hacen
Según manifiestaa suCruz
veza
referencia cada
(2011, uno
p.
un único8), de
“la los elementos
principal
valor vez”, omientras
componentes
a la característica de los
quedatos desimples
“los un dato
datos es estructurado
que ocupan solo
estructurados puede
seuna casi-
caracterizan por el hecho de que con un solo nombre (o también llamadoesta
ser
lla de la memoria, un
por dato
lo simple
tanto, hacen u otro estructurado.
referencia a un único Comparando
valor a la vez” , las figuras
mientras que 2 y
“los 3, notará
datos estructurados
se caracterizan diferencia.
identificador de de
por el hecho variables)
que con se un hace referencia
solo nombre a un grupo
(o también llamado deidentificador
casillas de de memoria”;
variables) se hace
referencia aa un
su grupo
vez cada uno dedelos
de casillas elementos
memoria”; a suo vez
componentes
cada uno dede losun dato estructurado
elementos o componentespuede de un dato
Figura
ser un dato 1.3. Representación
simple de un dato
u otro uestructurado. estructurado
Comparando las en la memoria de un
estructurado puede ser un dato simple otro estructurado. Comparando lasfiguras
figuras 22 y 3,notará
y 3, notará esta
esta diferencia.
diferencia. computador
Nombre del arreglo
Figura 1.3. Representación de un dato estructurado en la memoria de un
computador
Mi_arreglo
Nombre del arreglo
0 1 2 3
Mi_arreglo
Índices
0 1 2 3

Cabe1.3.
Figura precisar que ladefigura
Representación un dato3estructurado
es sólo una en larepresentación, ya que las casillas
memoria de un computador
de un dato estructurado, si bien operan en conjunto, Índices no necesariamente son
adyacentes.
Cabe precisar Es3 precisamente
que la figura esta característica
es sólo una representación, ya que laslacasillas
que permite realizar
de un dato una primera
estructurado, si bien ope-
clasificación
Cabe
ran en conjunto, de las
no necesariamenteestructuras
precisar que la sonfigura de datos:
3 es sólo
adyacentes. una representación,
Es precisamente ya quelalas
esta característica quecasillas
permite realizar
de un
una primera dato estructurado,
clasificación si bien
de las estructuras operan en conjunto, no necesariamente son
de datos:
• Basadas
adyacentes. en arreglosesta
Es precisamente (o Arrays), también
característica denominadas
la que ”contiguas”.
permite realizar una primera
• Basadas •
clasificaciónBasadas en punteros
de las(oestructuras
en arreglos (o Linked),
de datos:
Arrays), también también denominadas
denominadas ”contiguas”. ”enlazadas”.

• Basadas en arreglos (o Arrays), también denominadas ”contiguas”.


• Basadas en punteros (o Linked), también denominadas ”enlazadas”. 13
• Basadas en punteros (o Linked), también denominadas ”enlazadas”.

La segunda forma de clasificarlas es según la “figura” que describen al graficarlas, pudiendo ser lineales y no
UNIDAD I

lineales; a su vez estas se subclasifican de la siguiente manera:

• Estructuras lineales

o Arreglos

o Pilas

o Colas
Tema N.º 1

o Listas

• Estructuras no lineales

o Árboles

o Grafos

Todos estos tipos de estructuras serán descritos al detalle a lo largo del presente manual.

3.3. Estructuras de datos basadas en arreglos (estructura contigua)


Cada instancia de una estructura de datos tipo lista lineal es una colección ordenada de elementos. Cada una de
estas instancias es de la forma (e0 , e1 , e2 , …, en −1 ) donde:

• n es un número natural finito, que representa el ancho o tamaño de la lista.

• ei representa cada elemento de la lista e i es su índice.


Aunque resulte obvio mencionar que precede a , a y así sucesivamente, es necesario recalcar que esta relación
de precedencia solo se da en listas lineales.

Algunos ejemplos de listas lineales son los siguientes:

• La lista de estudiantes de esta clase (ordenadas por el nombre)

• La lista de puntajes de un examen ordenados por mayor a menor

• La lista de arribos de vuelos aéreos, ordenados del más reciente al más antiguo

3.3.1. Operaciones con una lista lineal

a) Crear la lista

b) Destruir la lista

c) Determinar si la lista está vacía

d) Determinar el tamaño de la lista

e) Encontrar un elemento a partir de su índice

f) Encontrar el índice de un elemento dado

g) Borrar un elemento dado a partir de su índice

14
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

h) Insertar un nuevo elemento en un índice determinado

i) Listar los elementos in orden (ascendente o descendentemente)

UNIDAD I
3.3.2. Abstracción de una lista lineal:

Es posible representar una lista lineal al margen de algún lenguaje de programación (de ahí el término “abstrac-
to”) de la siguiente forma:

Lista Lineal
{
Instancias

Tema N.º 1
Colección finita ordenada de cero o más elementos.
Operaciones
Empty() : Retorna verdadero si la lista está vacía; de lo contrario, falso.
Size() : Retorna el número de elemento de la lista (tamaño)
Get(índice) : Retorna el elemento de la posición (índice) especificada.
IndexOf(x) : Retorna el índice del elemento x (primera ocurrencia). Si el elemento no existe,
devuelve -1.
Erase(índice) : Borra el elemento cuyo índice es especificado.
Insert(índice, x) : Inserta el elemento x en la posición indicada como índice.
Output() : Muestra (imprime) la lista de elementos de izquierda a derecha.
}

Tomada de Data Structures, Algorithms, and Applications in C++, por Sahni (2005), p. 141.

Por ejemplo, al declarar la siguiente lista lineal L = {Apple, HP, Toshiba, Vaio}, los resultados de las operaciones
indicadas serían (considerar L original para cada caso):

L.Empty() : Falso
L.Size() : 4
L.Get(2) : “HP”
L.IndexOf(“Toshiba”) : 2 (el primer elemento tiene índice 0)
L.Erase(1) : {Apple, Toshiba, Vaio}
L.Insert(3, “Assus”) : {Apple, HP, Toshiba, Assus, Vaio}
L.Output() : {Apple, HP, Toshiba, Vaio}

Ahora intente usted, con la siguiente lista: M = {a, b, c, d}

M.Empty() :
M.Size() :
M.Get(0) :
M.Get(2) :
M.Get(-3) :
M.IndexOf(“c”) :
M.IndexOf(“q”) :
M.Erase(1) :
M.Insert(0, “e”) :
M.Insert(2, “f”) :
M.Output() :

3.3.3. Representación de arreglos

Cada elemento de un arreglo puede ser asignado o localizado empleando una fórmula matemática; la más sen-
cilla, y usada de forma natural, es la siguiente:

15
Ubicación (i) = i formula (a)
UNIDAD I

Esta fórmula significa que el i-ésimo elemento de la lista se encuentra en la posición i. Observe el siguiente caso:

Se decide guardar la lista [5, 2, 4, 8, 1] en un arreglo de tamaño 10. Haciendo uso de la fórmula los elementos,
Figura
se ubicarían como 4. Ubicación de elementos en un arreglo con la fórmula (a)
sigue:

5 2 4 8 1
Figura 4. Ubicación de elementos en un arreglo con la fórmula (a)
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
Figura
5 4. Ubicación
2 4 de elementos
8 1 en un arreglo con la fórmula (a)
Esto debido a que,
Figura si se reemplazan
4. Ubicación de elementos los valores
en un de la
arreglo con i, fórmula
se tiene:
(a)
Tema N.º 1

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
5 2 4 8 1
• Ubicación(0) = 0
Esto debido
[0] a que, [1]
Estosi debido
se reemplazan
[2] a que, los
[3] si valores
[4] de i, se
se reemplazan tiene:
[5] [6]
los valores de[7] [8]
i, se tiene: [9]
• Ubicación(1) = 1
• • =
Ubicación(0) Ubicación(2)
0 a que, si= 2
Esto •debido
Ubicación(0) =se0reemplazan los valores de i, se tiene:
• Ubicación(3) = 3
• Ubicación(1) = 1
• • =
Ubicación(1) Ubicación(4)
1 =4
• Ubicación(0)
• Ubicación(2) =0 =2
• Ubicación(1)
• Ubicación(3) =1 =3
• ¿Le= pareció
Ubicación(2) 2 demasiada obvia la primera fórmula? Cuando se trata de
• Ubicación(2)
• Ubicación(4) =2 =4
estructurar datos, no es la única que existe.
• Ubicación(3) = 3
• Ubicación(3) = 3
• Ubicación(4)
¿Le pareció =demasiada
4 obvia la primera fórmula? Cuando se trata de
Si se emplea la fórmula:
• estructurar
Ubicación(4) = 4 datos, no es la única que existe.
¿Le pareció demasiada obvia la primera fórmula? Cuando se trata de
Ubicación(i) es=laTamaño del existe.
arreglo – i – 1 formula(b)
¿Le parecióestructurar
demasiada datos,
Si se emplea
obvia nofórmula:
la la
primera única que
fórmula? Cuando se trata de estructurar datos, no es la única que existe.

Si se emplea seAl
Si la asignarlalos
emplea
fórmula:
valores se ubicarían de derecha a izquierda, así:
fórmula:
Ubicación(i) = Tamaño del arreglo – i – 1 formula(b)
Figura 5. Ubicación de elementos en un arreglo con la fórmula (b)
Al Ubicación(i) = Tamaño
asignar los valores del arreglo
se ubicarían de –derecha
i – 1 a izquierda,
formula(b)
así:

Al asignar los valores se 1 8 4 2 5


Figura
Al asignar 5.ubicarían
los valoresdesederecha
Ubicación de a izquierda,
elementos
ubicarían enasí:
de derecha unaarreglo con
izquierda, la fórmula (b)
así:
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
Figura 5. Ubicación de elementos en un arreglo 1 con la fórmula
8 4 (b)
2 5
Debido a que:
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
1 8 4 2 5
• Ubicación(0) = 10 – 0 – 1 = 9
[0] [1]
Debido a[2] que: 5. [3]
Figura [4]elementos
Ubicación de [5]en un arreglo
[6] con [7]la fórmula [8]
(b) [9]
• Ubicación(1) = 10 – 1 – 1 = 8
• Ubicación(2) = 10 – 2 – 1 = 7
Debido
• aUbicación(0)
que: = 10 – 0 – 1 = 9
Debido a que: • Ubicación(3) = 10 – 3 – 1 = 6
• Ubicación(1) = 10 – 1 – 1 = 8
• Ubicación(4) = 10 – 4 – 1 = 5
• • Ubicación(0)
10 – 0 – 1==10
• =Ubicación(2)
Ubicación(0) 9 =–100 –– 12 =
–91=7
• Ubicación(1)
• Ubicación(3) = 10=–10 1 –– 13 =
–81=6
La fórmula que se emplee para asignar/localizar un elemento específico en el
• • Ubicación(2)

Ubicación(1) Ubicación(4)
= 10 –también= 10 =– 2
10 –– 14 =
– 7
1 – 1 = 8 afectará la1 forma =5
arreglo cómo se insertan y eliminan nuevos
• Ubicación(3) = 10 – 3 – 1 = 6
elementos.
• • Ubicación(4)
La =
Ubicación(2) fórmula 1==10
10 – 2 –que 7se–emplee
4 – 1 =para
5 asignar/localizar un elemento específico en el
arreglo también afectará la forma cómo se insertan y eliminan nuevos
Revisemos el caso para la fórmula (a): al insertarse un nuevo valor (7) en la
• La fórmula
= 10 que
– 3 –se
elementos.
Ubicación(3) 1 =emplee
6 para asignar/localizar un elemento específico en el
posición 2 del arreglo, los elementos [4, 8, 1] deberían correr una posición
arreglo también afectará la forma cómo se insertan y eliminan nuevos
hacia la derecha.
• Ubicación(4) = 10 – 4 –el
elementos.
Revisemos 1= 5 para la fórmula (a): al insertarse un nuevo valor (7) en la
caso
posición 2 del arreglo, los elementos [4, 8, 1] deberían correr una posición
La fórmulaRevisemos
que se emplee
hacia para asignar/localizar
laelderecha.
caso para la fórmula un(a):
elemento específicoun
al insertarse ennuevo
el arreglo
valortambién afectará
(7) en la la forma
cómo se insertan y eliminan
posición nuevos elementos.
2 del arreglo, los elementos [4, 8, 1] deberían correr una posición
hacia la derecha.
Revisemos el caso para la fórmula (a): al insertarse un nuevo valor (7) en la posición 2 del arreglo, los elementos
[4, 8, 1] deberían correr una posición hacia la derecha.

16
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Figura 6. Proceso de inserción de un nuevo elemento en un arreglo que


emplea la fórmula (a)

Paso a)

UNIDAD I
5 2 4 8 1
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

Paso b)

5 2 4 8 1

Tema N.º 1
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

Paso c)

5 2 7 4 8 1
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

Por el
Figura contrario,
6. Proceso al eliminar
de inserción de unun elemento,
nuevo elementotodos los que
en un arreglo queseemplea
ubiquen a la derecha
la fórmula (a)
de él deberán correr una posición hacia la izquierda.

Por el contrario,El programa


al eliminar 1.3 muestra
un elemento, todoslalos
implementación
que se ubiquen a de la operación
la derecha de inserción
de él deberán deposición
correr una
un
hacia la izquierda. nuevo elemento a partir de la fórmula (a).

#include
El programa <iostream>
1.3 muestra la implementación de la operación de inserción de un nuevo elemento a partir de la
using
fórmula (a). namespace std;

const
#include int N = 10; // Tamaño del arreglo
<iostream>
int miArreglo[N];
using namespace std; // Creación del arreglo con N elementos

const int N = 10; // Tamaño del arreglo


// Procedimiento para inicializar la matriz
int miArreglo[N];
void init() // Creación del arreglo con N elementos
{
miArreglo[0] = 5; //Insertar en la posición 0, el elemento 5
// Procedimiento para inicializar
miArreglo[1] la matriz
= 2; //Insertar en la posición 1, el elemento 2
void init() miArreglo[2] = 4; //Insertar en la posición 2, el elemento 4
{ miArreglo[3] = 8; //Insertar en la posición 3, el elemento 8
miArreglo[0] = 5; //Insertar
miArreglo[4] en la en
= 1; //Insertar posición 0, el 4,
la posición elemento 5
el elemento 1
};
miArreglo[1] = 2; //Insertar en la posición 1, el elemento 2
miArreglo[2] = 4; //Insertar en la posición 2, el elemento 4
// Función que= determina
miArreglo[3] si laenmatriz
8; //Insertar está vacía
la posición 3, el elemento 8
bool empty()
miArreglo[4] = 1; //Insertar en la posición 4, el elemento 1
}; {
bool vacío = true;
int determina
// Función que i = 0; si la matriz está vacía
while (vacío==true && i<=N)
bool empty()
{
{
if (miArreglo[i] == 0)
bool vacío = true;vacío = false;
int i = 0; i++;
while }(vacío==true && i<=N)
{ return vacío;
}; if (miArreglo[i] == 0)
vacío = false;
i++;
// Procedimiento para insertar un elemento en el arreglo
}

17
return vacío;
};
UNIDAD I

// Procedimiento para insertar un elemento en el arreglo


void Insert(int indice, int elemento)
{
// Si la lista está vacía insertar el elemento en la posición [0]
if (empty() == true)
miArreglo[0] = elemento;
else
// Correr una posición a la derecha a partir de la posición del nuevo ele-
Tema N.º 1

mento
{
int i = 0;
while ((N-1)-i >= indice)
{
miArreglo[(N-1)-i] = miArreglo[(N-1)-(i+1)];
i++;
}
}
// Insertar el nuevo valor
miArreglo[indice] = elemento;
};

// Procedimiento para imprimir los elementos del arreglo


void Output()
{
cout<<endl;
cout<<”Elementos del arreglo”<<endl;
for (int i=0; i<=N; i++)
cout<<”Elemento[“<<i<<”]: “<<miArreglo[i]<<endl;
};

// PROGRAMA PRINCIPAL
void main()
{
init(); // Insertar valores iniciales
Output(); // Mostrar en pantalla
Insert(2,7); // Insertar, en la posición 2, el elemento 7
Output(); // Mostrar en pantalla
Insert(5,9); // Insertar, en la posición 5, el elemento9
Output(); // Mostrar en pantalla
system(“Pause”);
};

Programa 1.3

3.4. Estructuras de datos basadas en punteros (estructura enlazada)


En este tipo de estructuras, los elementos pueden almacenarse en cualquier ubicación de la memoria. Por con-
siguiente, para crear una lista cada elemento tiene un enlace o puntero (o dirección) al siguiente elemento de la
misma.

Como se vio, en el caso anterior la dirección es determinada por una fórmula matemática; en este tipo de repre-
sentación las direcciones están distribuidas a lo largo de la lista.

18
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Figura 7. Representación de una lista basada en punteros


La figura 7 ilustrala la lista L = {e0, e1, e2, en}
e Figura
d1 7. Representación
e d2 de una lista
e basada
d3 en punteros
e NULL
0 1 2 n

UNIDAD I
#d1 #d2 #d3
e0
(Primer d1
nodo) e1 d2 e2 d3 en nodo)
(Ultimo NULL
#d1 #d2 #d3
(Primer nodo) (Ultimo nodo)

ei di+1
Campo
Campo de #dx
datos ei di+1 enlace
Campo de Campo
#dx
datos enlace

Tema N.º 1
Dirección
del nodo
Dirección
del nodo
Como puede apreciar, a diferencia de una lista de tipo arreglo, en esta
representación cada elemento (ei) ocupa su propio nodo. A su vez, cada nodo
Como puede apreciar, Figura a diferencia
7. Representación de lista
de una una listaen punteros
basada de tipo arreglo, en esta
tiene un “campo enlace” donde se almacena la dirección (en memoria) del
representación
siguiente elemento cada(d1, d2, …).(ei) ocupa su propio nodo. A su vez, cada nodo
elemento
tiene un “campo enlace”
Como puede apreciar, a diferencia de una lista donde se arreglo,
de tipo almacena la representación
en esta dirección (encada memoria)
elementodel(ei) ocupa
siguiente
Asimismo,
su propio nodo. elemento
A su vez,para
cadaubicar (d1,
nodo tiene d2, …).
un determinado
un “campo enlace”elementodondedesela lista es lanecesario
almacena ubicarse
dirección (en memoria) del
en el primer
siguiente elemento (d1, d2,nodo
…). y “saltar” hasta el nodo del elemento deseado a través de los
Asimismo,
campos enlace. para ubicar un determinado elemento de la lista es necesario ubicarse
Asimismo, paraen elubicar
primer nodo y “saltar”
un determinado hastadeellanodo
elemento lista esdelnecesario
elemento deseado
ubicarse en ela primer
travésnodo
de los
y “saltar”
campos
La lista enlace.
mostrada en la figura 7 es
hasta el nodo del elemento deseado a través de los campos enlace. llamada “Lista enlazada simple” debido a que
cada nodo tiene solo un enlace; también es denominada “estructura tipo cadena”
La
La lista mostrada lista
debido en amostrada
que los
la figura 7 es en
nodosla figura
llamada están 7 dispuestos
“Lista es llamada
enlazada “Lista
de
simple” enlazada
izquierda
debido simple”
a derecha
a que cada nodo debido
y a que
el valor
tiene solo de enlace;
un
cada
enlace nodo
del tiene
último solo
nodo un enlace;
es NULL. también es denominada “estructura
también es denominada “estructura tipo cadena” debido a que los nodos están dispuestos de izquierda a dere- tipo cadena”
cha y el valordebido
de enlacea que los nodos
del último nodo es están
NULL.dispuestos de izquierda a derecha y el valor de
enlace del Eliminar
3.4.1. último nodo es NULL. de una lista enlazada
elementos
3.4.1. Eliminar elementos de una lista enlazada
3.4.1.
Observe Eliminar
el siguiente elementos de unapara
procedimiento listaeliminar,
enlazada por ejemplo, el elemento 1
Observe el siguiente de una lista enlazada:
procedimiento para eliminar, por ejemplo, el elemento 1 de una lista enlazada:
Observe el siguiente procedimiento para eliminar, por ejemplo, el elemento 1
• de• una
Ubicar segundo Ubicar listasegundo
nodo enlazada:
(elemento nodo
1). (elemento 1).
• Capturar el valor de su campo enlace.
• Capturar el
•• valor de susegundo
Ubicar
Vincular campo
el nodo enlace.
nodo
1 con(elemento
el nodo 3.1).
• Capturar el valor de su campo enlace.
• Vincular el•Analice
nodo 1 con
Vincular elelnodo
nodo3.1 conlaelfigura
cuidadosamente nodo 8.3.

Analice cuidadosamente laProceso


figura 8. para eliminar
Analice8.cuidadosamente
Figura la figura 8.
un elemento de una lista enlazada

Paso Figura
a) 8. Proceso para eliminar un elemento de una lista enlazada

Paso
e a) d1 e1 d2 e2 d3 en NULL
0
#d1 #d2 #d3
e0Nodo 1d1 e1Nodo 2d2 e2Nodo 3d3 enNodoNULL
4
#d1 #d2 #d3
Nodo 1 Nodo 2 Nodo 3 Nodo 4
Paso b)

Paso
e b) d2 e1 d2 e2 d3 en NULL
0
#d1 #d2 #d3
e0Nodo 1d2 e1 d2 e2Nodo 2d3 enNodoNULL
3
#d1 #d2 #d3
Nodo 1 Figura 8. Proceso para eliminar un elementoNodo 2 lista enlazada
de una Nodo 3

19
Note que, al eliminar un nodo, automáticamente el índice de todos los nodos siguientes decrece en 1 (círculos
entrecortados en la figura). A diferencia de un arreglo, este índice es solo referencial.
UNIDAD I

3.4.2. Insertar elementos en una lista enlazada

Para insertar en elemento en la posición i, es necesario ubicarse en el nodo anterior (i-1) e insertar el nodo justo
después de él.

El programa 1.4 permite implementar una lista enlazada e insertarle nuevos elementos.

#include <iostream>
#include <stdlib.h>
using namespace std;
Tema N.º 1

struct nodo{
int nro; // en este caso es un número entero
struct nodo *sgte;
};

typedef struct nodo *Tlista;

void insertarInicio(Tlista &lista, int valor)


{
Tlista q;
q = new(struct nodo);
q->nro = valor;
q->sgte = lista;
lista = q;
}

void insertarFinal(Tlista &lista, int valor)


{
Tlista t, q = new(struct nodo);

q->nro = valor;
q->sgte = NULL;

if(lista==NULL)
{
lista = q;
}
else
{
t = lista;
while(t->sgte!=NULL)
{
t = t->sgte;
}
t->sgte = q;
}
}

void reportarLista(Tlista lista)


{
int i = 0;

while(lista != NULL)
{
cout <<’ ‘<< i+1 <<”) “ << lista->nro << endl;
lista = lista->sgte;
i++;
}
}

20
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

void menu1()
{
cout<<”\n\t\tLISTA ENLAZADA SIMPLE\n\n”;

UNIDAD I
cout<<” 1. INSERTAR AL INICIO “<<endl;
cout<<” 2. INSERTAR AL FINAL “<<endl;
cout<<” 3. REPORTAR LISTA “<<endl;
cout<<” 4. SALIR “<<endl;

cout<<”\n INGRESE OPCIÓN: “;


}
/* Función Principal
---------------------------------------------------------------------*/

Tema N.º 1
int main()
{
Tlista lista = NULL;
int op; // opción del menu
int _dato; // elemenento a ingresar
int pos; // posición a insertar

system(“color 0b”);

do
{
menu1(); cin>> op;

switch(op)
{
case 1:

cout<< “\n NÚMERO A INSERTAR: “; cin>> _dato;


insertarInicio(lista, _dato);
break;

case 2:

cout<< “\n NÚMERO A INSERTAR: “; cin>> _dato;


insertarFinal(lista, _dato );
break;

case 3:

cout << “\n\n MOSTRANDO LISTA\n\n”;


reportarLista(lista);
break;

system(“pause”); system(“cls”);

}while(op!=4);

system(“pause”);
return 0;
}

Programa 1.4

Nota: Adaptado de “El Blog de Martín Cruz”. Disponible en http://bit.ly/29PjO6J

21
}
Programa 1.4

Nota: Adaptado de “El Blog de Martín Cruz”. Disponible en http://bit.ly/29PjO6J

Tema n.º 2:
UNIDAD I

Estructuras de control
Tema n.º 2: Estructuras de control

Introducción al tema

IntroducciónEnaleste
tema
y el siguiente tema se abordarán las denominadas estructuras de control.
Joyanes, 2005, p. 41) considera que “son métodos de especificar el orden en que las
En este y el siguiente temade
instrucciones seun
abordarán
algoritmolassedenominadas
ejecutarán. Elestructuras de control.
orden de ejecución de(Joyanes, 2005, p. 41) consi-
las sentencias
dera que “son(lenguaje)
métodos deo instrucciones
especificar eldeterminan
orden en queel flujo de control. Estas
las instrucciones de unestructuras
algoritmodesecontrol
ejecutarán. El orden
de ejecución son,
de laspor consiguiente,
sentencias fundamentales
(lenguaje) en losdeterminan
o instrucciones lenguajes de programación
el flujo de control.y Estas
en losestructuras de
Tema n.º 2

diseños de algoritmos especialmente los pseudocódigos.”


control son, por consiguiente, fundamentales en los lenguajes de programación y en los diseños de algoritmos
especialmente lostres
Las pseudocódigos. ” control básicas son las siguientes:
estructuras de
• Secuencia
Las tres estructuras de control básicas son las siguientes:
• Selección (o condicionada)
• • Repetición
Secuencia
• Selección (o condicionada)
Aunque el nombre de este tema aparenta estar relacionado con el título de la
asignatura, su contenido está ligado en mayor medida a los algoritmos. Las ventajas
• Repetición
que ofrecen estas estructuras serán aprovechadas para implementar las operaciones
a realizar
Aunque el nombre sobretema
de este las listas, comoestar
aparenta son insertar, eliminar,
relacionado con elbuscar, etc.
título de la asignatura, su contenido está
ligado en mayor medida a los algoritmos. Las ventajas que ofrecen estas estructuras serán aprovechadas para
El tema n.º 2 se concentra en la descripción e implementación de las estructuras de
implementar las operaciones
control a realizar sobre las listas, como son insertar, eliminar, buscar, etc.
condicionales.
El tema n.º 2 se concentra en la descripción e implementación de las estructuras de control condicionales.
1. ¿Por qué usar estructuras de control?

1. ¿Por qué usar estructuras


Al programar de control?
una computadora no se está haciendo más que traducir un algoritmo a
un determinado lenguaje de programación. Internamente, el compilador lee una a
una computadora
Al programar una las líneas de código y lashaciendo
no se está ejecuta en
másel que
mismo ordenunque
traducir fueron a
algoritmo escritas.
un determinado lenguaje de
programación. Internamente, el compilador lee una a una las líneas de código y las ejecuta en el mismo orden
Claramente, mientras se trate de un problema sencillo a resolver, el algoritmo
que fueron escritas.
correspondiente será secuencial, cada tarea se llevará a cabo una sola vez y en el
mismo orden
Claramente, mientras conde
se trate el un
queproblema
fueron especificadas.
sencillo a resolver, el algoritmo correspondiente será secuencial,
cada tarea se llevará a cabo una sola vez y en el mismo orden con el que fueron especificadas.
Figura 9. Representación de un algoritmo secuencial

Tarea 1

Tarea 2

Tarea 3

Fuente: Autoría propia


Figura 9. Representación de un algoritmo secuencial
Fuente: Autoría propia

Por ejemplo:
Por ejemplo: el algoritmo
el algoritmo para sumar para sumarsería
dos valores doselvalores sería el siguiente:
siguiente:

Leer dos números a y b

Sumar los números

Imprimir la respuesta

22
Lo cierto es que los problemas que resuelven los computadores son más complejos
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Lo cierto es que los problemas que resuelven los computadores son más complejos (con ese fin se crearon),
por lo tanto, es necesario el empleo de algoritmos capaces de tomar decisiones, es decir, elegir qué tareas eje-
cutar, qué tareas repetir, etc. Para esto se cuenta con las denominadas estructuras de control, que permiten a

UNIDAD I
los lenguajes de programación ejecutar ciertas instrucciones en el orden y momento especificados, en tiempo
de ejecución.

Tales estructuras de control, pueden clasificarse de la siguiente manera:

• Estructuras condicionales
o De control simple
o De control doble

Tema n.º 2
o De control múltiple

• Estructuras repetitivas
o Condicionada
o Predefinida

2. La estructura de control condicionada simple


Este tipo de estructuras trabajan con las denominadas expresiones lógicas. Una expresión lógica es la compa-
ración de dos datos (de cualquier tipo) empleando operadores matemáticos como igual, diferente, mayor que,
menor que, mayor igual que y menor igual que.

Tal comparación puede ser interpretada como una pregunta literal. Por ejemplo:

Expresión literal Equivalente matemático


¿5 es mayor que 3? 5>3
¿”Nombre” es igual a “NOMBRE”? “Nombre” = “NOMBRE”
¿Verdadero es diferente que Falso? Verdadero <> Falso
¿12/01/2016 es anterior a 15/01/2017? ‘12/01/16’ < ‘15/01/17’

Por lo tanto, tiene una respuesta, pudiendo ser esta: verdad o falso.

En palabras de Severance (2009, p. 33) “una expresión booleana es aquella que puede ser verdadera (True) o
falsa (False)”.

En consecuencia, las estructuras de control simple evalúan una expresión lógica dada, y si esta resulta verdade-
ra, ejecuta determinadas acciones (una o varias); de lo contrario, las obvia, pasando a las siguientes instrucciones
si las hubiere. La figura 10 ilustra lo expresado.
Figura 10. Representación de una estructura de control simple

(entonces)

V Expresión lógica

Tarea(s)
F

Fuente:
Figura 10. Representación Elaboración
de una propia
estructura de control simple
Fuente: Elaboración propia
RECUERDA
“Verdadero y Falso son valores especiales que pertenecen al tipo bool (booleano);
no son cadenas” (Severance, 2009, p. 33). 23
Su estructura en pseudocódigo es como se muestra a continuación:
Tarea(s)

Fuente: Elaboración propia


RECUERDA
RECUERDA
“Verdadero
“Verdadero y Falsoyson
Falso sonespeciales
valores valores especiales que pertenecen
que pertenecen al tipo bool
al tipo bool (booleano); no(booleano);
son cadenas” (Severance,
UNIDAD I

no son
2009, p. 33). cadenas” (Severance, 2009, p. 33).

Su estructura
Su estructura en pseudocódigo
en pseudocódigo esmuestra
es como se como se muestra a continuación:
a continuación:

Si (expresión lógica), entonces


Si (expresión
{ lógica), entonces
{ Conjunto de instrucciones a realizar
}
Conjunto de instrucciones a realizar
Tema n.º 2

} Este tipo de estructura puede ser útil, por ejemplo, en un escenario en el que se
desee restar el 10 % al valor de una venta, siempre y cuando esta sea mayor que
1000. Observe la figura 11.
Este tipo de estructura puede ser útil, por ejemplo, en un escenario en el que se desee restar el 10 % al valor de
una venta, siempre y cuando
Figura 11.esta sea mayor
Ejemplo de que 1000. Observe
estructura la figura simple
de control 11.

(entonces)

V Si la venta es mayor
Venta > 1000
que 1000

Venta = Venta – (venta * 10%)


F Reducir la venta en
10%

Fuente:
Figura Elaboración
11. Ejemplo propia
de estructura de control simple
Fuente: Elaboración propia
La variable
La variable “Venta” “Venta” es contrastada
es contrastada con“>”
con el operador el para
operador “>”
verificar quepara verificar
sea mayor que sea
que 1000. Si se comprueba
mayor que 1000. Si se comprueba ello, inmediatamente se procede a reescribir
ello, inmediatamente se procede a reescribir la variable con el nuevo valor (descuento de 10 %).
la variable con el nuevo valor (descuento de 10 %).
El programa 2.1 muestra la implementación de este algoritmo en C++.
El programa 2.1 muestra la implementación de este algoritmo en C++.
void main()
{ void main()
{ float venta;
cout<<”Digite un valor de venta:”<<endl;
cin>>venta;
if (venta > 1000) // Expresión lógica o condición
{
venta = venta - (venta * 0.10); // Tarea a realizar si
// la expresión
// resulta verdadera
}
cout<<”El valor de la venta: “<<venta<<endl;
}

Programa 2.1

24
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

3. La estructura de control condicional doble

UNIDAD I
A diferencia de la estructura de control simple donde se escriben instrucciones únicamente para el caso en que
la expresión lógica resulte verdadera, en una estructura de control doble se deben especificar instrucciones
también para el caso en que resulte falsa.

Su estructura en pseudocódigo es como se muestra a continuación:

Si (expresión lógica), entonces


{

Tema n.º 2
Conjunto de instrucciones “A” a realizar
}
Sino
{
Conjunto de instrucciones “B” a realizar
}

Gráficamente es como se muestra en la figura 13.

(entonces) (sino)
V F
Expresión lógica

Tarea(s) A Tarea(s) B

Figura 13. Representación de una estructura de control doble


Fuente: Elaboración propia

Ejemplo: Enviar un mensaje de alerta indicando si la edad ingresada corresponde a la de una persona mayor o
menor de edad. Gráficamente sería:

(entonces) (sino)
V F
Edad >= 18

Imprimir: Imprimir:
Mayor de edad Menor de edad

Figura 14. Ejemplo de una estructura de control doble


Fuente: Elaboración propia
25
El programa siguiente muestra su implementación:

void main()
UNIDAD I

{
int edad;
cout<<”Digite la edad de la persona”<<endl;
cin>>edad;
if (edad >= 18) // Expresión lógica o condición
cout<<”Mayor de edad”<<endl; // Expresión verdadera
else
cout<<”Menor de edad”<<endl; // Expresión falsa
}
Tema n.º 2

Programa 2.2

4. La estructura de control múltiple


A diferencia de las dos estructuras anteriores, en las que la variable que participa de la expresión lógica se com-
para con un único valor, por ejemplo “edad>=18” o “sexo=Masculino”, en una estructura de control múltiple la
variable se compara simultáneamente con diferentes valores, y realiza aquellos bloques de instrucciones donde
la comparación resulte verdadera.

Su estructura en pseudocódigo es como sigue:

Si (expresión lógica 1), entonces


{
Conjunto de instrucciones “A”
}
Sino, si (expresión lógica 2), entonces
{
Conjunto de instrucciones “B”
}
Sino, si (expresión lógica 3), entonces
{
Conjunto de instrucciones “C”
}
Sino,
{
Conjunto de instrucciones “n”
}

Gráficamente es como se muestra en la figura 15.

26
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Gráficamente es como se muestra en la figura 15.


Gráficamente es como se muestra en la figura 15.
Figura 15. Representación de una estructura de control múltiple
Figura 15. Representación de una estructura de control múltiple

UNIDAD I
Expresión lógica
V Tarea(s) A
1 lógica
Expresión Tarea(s) A
1

F
F
V
Expresión lógica V Tarea(s) B
2 lógica
Expresión Tarea(s) B
2

Tema n.º 2
F
F V
Expresión lógica V Tarea(s) n
n lógica
Expresión Tarea(s) n
n

Fuente: Elaboración propia


Fuente: Elaboración
Figura 15. Representación propia
de una estructura de control múltiple
Ejemplo: convertir un número ingresado entre 1 y 5 apropia
Fuente: Elaboración su vocal equivalente.
Ejemplo: convertir un número ingresado entre 1 y 5 a su vocal equivalente.
Figura 16. Ejemplo de una estructura de control múltiple
Ejemplo: convertir
Figura un16.
número ingresado
Ejemplo entre
de una 1 y 5 a sude
estructura vocal equivalente.
control múltiple

V
Numero = 1 V Imprimir “A”
Numero = 1 Imprimir “A”
F
F
V
Número = 2 V Imprimir “E”
Número = 2 Imprimir “E”
F
F
V
Número = 3 Imprimir “I”
V
Número = 3 Imprimir “I”

F
F
V
Número = 4 V Imprimir “O”
Número = 4 Imprimir “O”

F
F V
Número = 5 V Imprimir “U”
Número = 5 Imprimir “U”
F
F
Imprimir “No existe”
Imprimir “No existe”

Fuente: Elaboración propia


Fuente: Elaboración propia
Figura 16. Ejemplo de una estructura de control múltiple
Fuente: Elaboración propia

27
Su versión en código de C++ es como se muestra en el programa 2.3.
#include <iostream>
#include <string>
UNIDAD I

using namespace std;

void main()
{
int valor;
string vocal;
cout<<”Digite un valor: “;
cin>>valor;
if (valor == 1)
Tema n.º 2

vocal = “a”;
else if (valor == 2)
vocal = “e”;
else if (valor == 3)
vocal = “i”;
else if (valor == 4)
vocal = “o”;
else if (valor == 5)
vocal = “u”;
else
vocal = “No existe”;

cout<<”La vocal es: “<<vocal<<endl;
system(“Pause”);
}

Programa 2.3

Otra alternativa es emplear el operador Switch-Case como se aprecia en el siguiente programa:


#include <iostream>
#include <string>
using namespace std;

void main()
{
int valor;
string vocal;
cout<<”Digite un valor: “;
cin>>valor;
switch(valor)
{
case 1: vocal = “a”; break;
case 2: vocal = “e”; break;
case 3: vocal = “i”; break;
case 4: vocal = “o”; break;
case 5: vocal = “u”; break;
default: vocal = “No existe”; break; //Si se digita un
valor
//fuera del rango [1, 5]
}
cout<<”La vocal es: “<<vocal<<endl;
system(“Pause”);
}

Programa 2.4

En C++ la instrucción Switch-Case ejecutará todos aquellos bloques de código donde la expresión lógica resulte
verdadera. Por ello es necesario agregar la palabra reservada “Break” (“detener” en español) al final de cada
instrucción.

28
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Tema n.º 3:

UNIDAD I
Estructuras de control repetitivas

Introducción al tema
La reutilización de código es una forma de optimizar tanto el tiempo de programación, el de mantenimiento y,

Tema n.º 3
por supuesto, el de ejecución de un aplicativo. En esa línea, las estructuras de control repetitivas permiten eje-
cutar un bloque de instrucciones tantas veces sea necesario o hasta que una condición dada se cumpla (o sea
verdadera en términos técnicos).

Con lo expuesto a continuación, usted podrá conocer el funcionamiento y modo de implementación de este tipo
de estructuras.

1. Estructuras de control repetitivas


Como ya se mencionó, este tipo de estructuras realizan una o varias tareas repetidas veces mientras se cumpla
una condición dada.

Su estructura puede darse de dos formas dependiendo de la ubicación de la expresión lógica:

Hacer mientras (expresión lógica)

Conjunto de instrucciones

Hacer

Conjunto de instrucciones

Mientras (expresión lógica)

Gráficamente es como se muestra en la figura 17.

29
Mientras (expresión lógica)

Gráficamente es como se muestra en la figura 17.

Figura 17. Representaciones de una estructura de control repetitiva


condicionada

i) ii)
UNIDAD I

Tarea(s)

Expresión lógica

Expresión lógica

Tarea(s)
Tema n.º 3

Fuente: Elaboración propia


Figura 17. Representaciones de una estructura de control repetitiva condicionada
C++ permite implementar tres tipos Fuente:
deElaboración propiarepetitivas, cuya diferencia se
estructuras
describe en este cuadro:
C++ permite implementar tres tipos de estructuras repetitivas, cuya diferencia se describe en este cuadro:

Tabla 1. Tipos de estructuras repetitivas

Instrucción Descripción
El uso más frecuente de este tipo de bucles se produce cuando el número de repeticiones se
For
conoce por anticipado y la condición del bucle puede ser controlada por un contador.
El uso más frecuente se produce cuando la repetición del bucle no está controlada por un
contador, sino por una cierta condición (simple y compleja).
While

El bucle puede que no se ejecute ninguna vez.


Se utiliza en las mismas condiciones que el while y, además, cuando se debe asegurar que el
Do-while
bucle se ejecute al menos una vez. Ejemplo: menú de opciones con filtro.

Nota: Tomada de Práctica 5. Sentencias de control repetitivas, Fundamentos de informática. Recuperado de


http://www.uhu.es/04004/material/Practica5_Curso0809.pdf

A continuación, se muestran ejemplos de implementación de estructuras repetitivas:

Ejemplo 1:

Imprimir una palabra en pantalla hasta que el usuario digite “Salir”.

#include <iostream>.
using namespace std;

void main()
{
string palabra;
palabra = “”;
do
{
cout<<”Digite la palabra a imprimir: ”;
cin>>palabra;
cout<<”La palabra es: “<<palabra<<endl;
}
while (palabra!=”Salir”);
system(“Pause”);
};

Programa 3.1

30
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Ejemplo 2:

Imprimir los divisores de un número especificado.

UNIDAD I
#include <iostream>
using namespace std;

void main()
{
int número;
int divisor;
int i;

Tema n.º 3
cout<<”Indique número: “;
cin>>número;
divisor = número;
i = 1;
while (divisor > 0)
{
if (número%divisor==0) //El operador % devuelve el resto de
//una división
{
cout<<”Divisor[“<<i<<”]: “<<divisor<<endl;
i++; //Incrementar en una unidad "<<divisor<<endl;
cout<<"Divisor["<<i<<"]:
} i++; //Incrementar en una unidad
divisor--;
} //Disminuir en una unidad
} divisor--; //Disminuir en una unidad
system(“Pause”);
}
}; system("Pause");
};
Programa 3.2
Programa 3.2

2. La instrucción FOR

La instrucción
2. La instrucción FORFOR es una variante de estructura repetitiva, la cual puede usarse
cuando se conoce de antemano la cantidad de repeticiones que debe tener el bucle.
La instrucción FOR es18
La figura una variante su
describe de estructura
estructura:repetitiva, la cual puede usarse cuando se conoce de antemano
la cantidad de repeticiones que debe tener el bucle.

La figura 18 describe
Figura su18.
estructura:
Representaciones de una estructura de control repetitiva
condicionada

VALOR INICIAL RAZÓN DE INCREMENTO


“i” es una variable auxiliar; en Define el incremento de la
esta sección se indica su valor variable i después de cada
inicial. bucle.

for (i=1; i<N; i++)

VALOR MÁXIMO
“<N” permite definir el valor
máximo que tomará i.

Fuente: Autoría propia


Figura 18. Representaciones de una estructura de control repetitiva condicionada
Fuente: Autoría propia
En los siguientes ejemplos se detalla cómo implementar esta instrucción:

Ejemplo 3:
Imprimir una serie numérica hasta un número especificado.
31
void main()
En los siguientes ejemplos se detalla cómo implementar esta instrucción:

Ejemplo 3:
UNIDAD I

Imprimir una serie numérica hasta un número especificado.

void main()
{
int i;
int cantidad;
cout<<”Indique cantidad: “;
cin>>cantidad;
Tema n.º 3

for (i=1;i<=cantidad;i++)
cout<<i<<endl;
system(“Pause”);
};

Programa 3.3

Ejemplo 4:

Imprimir la tabla de multiplicar de un número dado. Note que en este caso la declaración de la variable auxiliar
“i” se realiza en la misma instrucción FOR.

void main()
{
int numero;
cout<<”Indique número de reportar: “;
cin>>numero;
for (int i=0;i<=10;i++)
cout<<número<<”*”<<i<<”=”<<número*i<<endl;
system(“Pause”);
};

Programa 3.4

Es posible anidar dos instrucciones FOR para realizar recorridos simultáneos. En el programa 3.5 se aprecia
cómo aprovechar esta cualidad para realizar una impresión de datos en forma tabular.

#include <iostream>
using namespace std;

void main()
{
int columnas;
int filas;
columnas = 9;
filas = 5;

for (int i=0; i<=filas; i++)
for (int j=0; j<=columnas; j++)
{
cout<<i<<j<<” “;
if (j==columnas)
cout<<endl; //Salto de línea si se llegó a la última colum-
na
}
system(“Pause”);
};

32
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Resultado:

00 01 02 03 04 05 06 07 08 09

UNIDAD I
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59

Como se verá a partir de la siguiente unidad, los bucles son ideales para recorrer por cada uno de los elementos

Tema n.º 3
de un arreglo (de una o más dimensiones) mientras se hacen operaciones con o sobre ellos.

Lectura seleccionada n.º 1:

El concepto de datos estructurados


Leer el apartado 5.1.: “El concepto de datos estructurados” (p. 171)

Quetglás, G., Toledo, F., & Cerverón, V. (2002). Estructura de datos. En Fundamentos de Informática y Programa-
ción (pp. 171–211). Disponible en http://robotica.uv.es/pub/Libro/PDFs/CAPI5.pdf

Actividad N.º 1
Participe en un foro de discusión sobre listas basadas en arreglos y basadas en punteros.

Instrucciones:

a) 
Lea y analice detenidamente los siguientes casos:

Se desea implementar dos programas que, mediante listas, permitan el registro de

i. Los nombres de los jugadores participantes de un partido de futbol. Solo un partido, una vez finalizado
este, los datos pueden ser eliminados.

ii. Las placas de los vehículos que llegan a diario a una caceta de control policial en carretera. Una vez
terminado el día, la lista puede ser eliminada.

b) 
Basado en su análisis, responda en el foro:

Entre los dos tipos de listas: basada en arreglos y basada en punteros, ¿cuál de ellas se adecúa mejor a
cada caso? Fundamente su respuesta.

33
Glosario de la Unidad I
UNIDAD I

A
Algoritmo. Conjunto ordenado de pasos que llevan a la solución de un problema.

C
Tema n.º 3

C++. Es un lenguaje de programación diseñado en la década de 1980. A diferencia de su predecesor C, este


permite manipular objetos.

D
Dato. Unidad mínima de información que carece de significado por sí misma.

I
Información. Conjunto de datos ordenados y con sentido semántco.

M
Memoria (en informática). Es un dispositivo que almacena datos informáticos durante algún intervalo de tiempo.

P
Procesador. De la familia de los circuitos integrados, es un dispositivo electrónico responsable de convertir da-
tos de entrada en datos de salida.`l + l

Programa (en informática). Conjunto de instrucciones que realizan una tarea específica.

V
Variable. En un lenguaje de programación es un espacio de memoria, identificado por un nombre y reservado
para almacenar un dato específico a la vez.

34
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Bibliografía de la Unidad I

UNIDAD I
Cairo, Osvaldo y Guardati, Silvia. (2010). Estructuras de datos (3.ª ed.). Editorial McGraw Hill.

Charles, Severance. (2009). Python para informáticos: Explorando la información.

Cruz Huerta, Dora. (s.f.). Apuntes de la asignatura: Estructura de datos. México: Tecnológico de Estudios Supe-
riores de Ecatepec. Disponible en http://myslide.es/documents/manual-estructura-de-datos.html

Tema n.º 3
Joyanes, Luis & Zahonero, Ignacio. (2005). Programación en C: Metodología, algoritmos y estructura de datos.
España: McGraw Hill / Interamericana

Sahni, Sartaj. (2005). Data structures, algorithms, and applications in C++ (2ª. ed.). Hyderabad, India: Editorial
Silicon Press.

Universidad de Valencia, Instituto Universitario de Investigación de Robótica y Tecnologías de la Información y


Comunicación. (s.f.) Estructura de datos. Valencia, España: IRTIC. Disponible en http://robotica.uv.es/pub/
Libro/PDFs/CAPI5.pdf.

Weiss, Mark Allen. (2000). Estructura de datos en Java: Compatible con Java 2. Madrid: Pearson Education.

35
Autoevaluación n.º 1
UNIDAD I

1. ¿Qué es un dato?

a. Conjunto de información

b. Unidad mínima de información


Tema n.º 3

c. Valores de un arreglo

d. Forma de representar información

2. ¿Cuál es la diferencia entre un dato simple y un dato estructurado?

a. L
 os datos simples ocupan solo una casilla de memoria; los datos estructurados hacen referencia a un
conjunto de casillas de memoria identificadas con un nombre único.

b. L
 os datos simples ocupan varias casillas de memoria; los datos estructurados hacen referencia a un
único valor a la vez.

c. L
 os datos simples ocupan solo una casilla de memoria; los datos estructurados son similares a los
simples, pero cada uno de ellos opera con su propio nombre.

d. L
 os datos simples ocupan varias casillas de memoria; los datos estructurados son similares, pero a
diferencia de esos están interrelacionados entre sí.

3. ¿Cuáles de las siguientes listas son ejemplos de estructuras de datos?

a. Arreglos, grafos, datos

b. Grafos, punteros, arreglos

c. Arreglos, colas, pilas

d. Colas, pilas, bucles

4. ¿Cuál es diferencia entre una lista lineal y una no lineal?

a. En la lista no lineal, cada elemento es precedido solo por un elemento. En una lineal, dos elementos
pueden compartir un elemento que les precede.

b. En la lista lineal, cada elemento es precedido solo por un elemento. En una no lineal, dos elementos
pueden compartir un elemento que les precede.

c. En la lista lineal, los elementos no tienen elementos predecesores. En una no lineal, los elementos
pueden tener varios elementos predecesores.

d. En la lista no lineal, los elementos no tienen elementos predecesores. En una lineal, los elementos
pueden tener varios elementos predecesores.

36
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

5. ¿En qué consiste una lista basada en arreglos?

a. Es aquella que emplea elementos dispuestos en línea.

UNIDAD I
b. Es aquella que emplea arreglos para disponer los elementos.

c. Es aquella que emplea punteros para disponer los elementos.

d. Es aquella que emplea punteros hacia arreglos para disponer los elementos.

6. ¿En qué consiste una lista basada en punteros?

Tema n.º 3
a. Es aquella que emplea elementos dispuestos en línea.

b. Es aquella que emplea nodos para disponer los elementos.

c. Es aquella que emplea nodos basados en punteros para disponer los elementos.

d. Es aquella que emplea punteros hacia arreglos para disponer los elementos.

7. ¿Qué es una expresión lógica?

a. Es una comparación matemática que tiene dos posibles respuestas: verdadero y falso.

b. E
 s una comparación literal que tiene múltiples respuestas, pudiendo ser estas de cualquier tipo de
datos.

c. E
 s una comparación matemática que tiene múltiples respuestas, pudiendo ser esta de tipo lógico o
booleano.

d. Es una comparación literal que tiene dos posibles respuestas: verdadero o falso.

8. ¿Cómo opera una estructura condicional?

a. T
 rabaja con una expresión lógica, y según su respuesta repite una instrucción un número indetermina-
do de veces.

b. R
 esuelve una expresión lógica: si resulta verdadera, realiza una determinada instrucción; si resulta
falsa, realiza otra.

c. T
 rabaja con una expresión lógica: si resulta verdadera, repite una determinada instrucción un número
determinado de veces.

d. R
 esuelve una expresión lógica: si resulta verdadera, realiza una determinada tarea; si resulta falsa,
realiza otra.

9. ¿Cuál es la diferencia entre emplear la sentencia “if…Else if” y la sentencia “Switch” en C++?

a. La sentencia “if…Else if” realiza solo aquella tarea donde la expresión lógica resultó falsa, mientras
que la instrucción “Switch” realiza todas aquellas tareas donde la expresión lógica resultó verdadera.

b. La sentencia “if…Else if” realiza todas aquellas tareas donde la expresión lógica resultó verdadera, mien-
tras que la instrucción “Switch” realiza todas aquellas tareas donde la expresión lógica resultó falsa.

37
c. La sentencia “if…Else if” realiza solo aquella tarea donde la expresión lógica resultó verdadera, mien-
tras que la instrucción “Switch” realiza todas aquellas tareas donde la expresión lógica resultó verda-
dera.
UNIDAD I

d. L
 a sentencia “Switch” realiza solo aquella tarea donde la expresión lógica resultó verdadera, mientras
que la instrucción “if…Else if” realiza todas aquellas tareas donde la expresión lógica resultó verdade-
ra.

10. ¿Cómo opera una estructura repetitiva?


Tema n.º 3

a. Repite una o varias instrucciones un número indeterminado de veces.

b. Repite una o varias instrucciones un número determinado de veces.

c. Repite una o varias instrucciones mientras una condición sea verdadera.

d. Repite una o varias instrucciones mientras una condición sea falsa.

38
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

UNIDAD II

ARREGLOS Y MATRICES

DIAGRAMA DE ORGANIZACIÓN DE LA UNIDAD II

CONTENIDOS

AUTOEVALUACIÓN EJEMPLOS

BIBLIOGRAFÍA ACTIVIDADES

39
ORGANIZACIÓN DE LOS APRENDIZAJES

Resultado de aprendizaje de la Unidad II:


Al finalizar la unidad, el estudiante será capaz de seleccionar las estructuras de arreglos y matrices, según la problemática propuesta.

CONOCIMIENTOS HABILIDADES ACTITUDES


Tema n.º 1: Arrays unidimensionales, • Identifica y realiza operaciones con • Demuestra perseverancia y esfuerzo
bidimensionales y multidimensiona- arrays unidimensionales. durante el desarrollo de los ejer-
les. Operaciones con ellos. • Describe y resuelve problemas utili- cicios.
zando los arrays bidimensionales. • Toma conciencia de la importancia
Tema n.º 2: Matrices • Desarrolla problemas aplicados a los de la asignatura en su formación
arrays multidimensionales. profesional.

• Resuelve las prácticas de laboratorio. • Valora las relaciones entre sus


Lectura seleccionada n.º 2: compañeros.

Autoevaluación de la Unidad II Actividad N.º 2


Foro de discusión

40
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Tema n.º 1:

UNIDAD II
Arrays unidimensionales, bidimensionales y
multidimensionales. Operaciones con ellos

INTRODUCCIÓN

Tema n.º 1
En la primera unidad de este módulo, se describieron los fundamentos y aplicaciones de los arreglos (o array
por su denominación en inglés). A continuación, se tratará sobre su implementación, para lo cual se emplean
ejemplos con lenguaje C++ que demuestran desde cómo declararlos (crearlos) hasta las posibles operaciones
a realizar con ellos. Finalmente, se abordarán los arreglos multidimensionales tanto simples como basados en
punteros.

1. Definición
Un arreglo “se define como una colección finita, homogénea y ordenada de elementos” (Cairo & Guardati, 2010,
p. 4). A continuación, se explicará brevemente una de estas características.

• 
Finita: Todo arreglo tiene un límite; es decir, se debe determinar cuál será el número máximo de elementos
que formarán parte del arreglo.

• 
Homogénea: Todos los elementos de un arreglo son del mismo tipo. Por ejemplo, todos serían enteros o
booleanos, entre otros.

• 
Ordenada: Se puede determinar de manera sistemática el ordenamiento de los elementos; en otras pala-
bras, establecer cuál es el primero, el segundo, el tercer elemento, etc.

Asimismo, un arreglo puede tener una o más dimensiones para almacenar los datos como se aprecia en la si-
guiente figura:

Arreglo de una dimensión

Arreglo de dos dimensiones Arreglo de tres dimensiones

Figura 19. Representación gráfica de las dimensiones de un arreglo

Aunque la representación gráfica de cuatro a más dimensiones se dificulta, un arreglo puede soportar muchas
más en función del lenguaje de programación que se utilice. Por ejemplo, C++ (de Visual Studio 2012) admite
hasta 29 dimensiones para arreglos de tipo entero.

41
RECUERDA:
UNIDAD II

Desde el punto de vista técnico, una variable simple es un espacio de memoria que opera bajo un determi-
nado nombre, donde se puede almacenar un solo dato a la vez, mientras que un arreglo es un conjunto de
espacios de memoria identificados por un mismo nombre.

Dado que los elementos de un arreglo se identifican con un nombre en común, para hacer referencia a al-
guno de ellos en particular, será necesario emplear un índice que trabaja a modo de coordenada e identifica
unívocamente a cada casilla del arreglo.
Tema n.º 1

2. Creación de arreglos
En C++, al igual que cualquier otra variable, es necesario declarar (o crear) un arreglo antes de utilizarlo. El pro-
grama 1.1 muestra cómo hacerlo tal como se aprecia a continuación:

void main()
{
int arregloUd[5]; // Arreglo unidimensional que permite
almacenar hasta 5 números enteros
bool arregloUd[10]; // Arreglo unidimensional que permite
almacenar hasta 10 datos lógicos
int arregloBd[4][3]; // Arreglo bidimensional que permite
almacenar hasta 12 números enteros
char arregloTd[3][2][4]; // Arreglo tridimensional que permite
almacenar hasta 24 caracteres
// Arreglo de punteros
// a. Arreglo de punteros simple
char *días[7] = {“Lun”, “Mar”, “Mie”, “Jue”, “Vie”, “Sab”, “Dom”};

// b. Arreglo de punteros doble


int **tablero = new int *[4];
}

Programa 1.1

Como puede apreciarse, la declaración de un arreglo implica el uso de los caracteres [] (corchetes) seguido del
nombre. Cabe decir que entre los corchetes se digita el número máximo de elementos que tendrá cada dimen-
sión.

Un arreglo de punteros simple almacena como elementos direcciones de memoria a variables; mientras que
el arreglo a punteros doble, r direcciones de memoria a otros arreglos. Este último se describe al detalle más
adelante (en el numeral 5).

3. Operaciones con arreglos

3.1. Leer y escribir datos


Cuando Sahni (2005, p. 223) define la representación abstracta de un arreglo, considera únicamente dos opera-
ciones sobre él: leer (get) y escribir (set). Observe la siguiente representación:

42
3.1. Leer y escribir datos
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO
Cuando Sahni (2005, p. 223) define la representación abstracta de un arreglo,
considera únicamente dos operaciones sobre él: leer (get) y escribir (set).
Observe la siguiente representación:

Figura 20. Representación abstracta de un arreglo


Arreglo
{
Instancias

UNIDAD II
Conjunto de pares de la forma (índice, valor)
Operaciones
Get (índice) : retorna el valor del par cuyo índice es
proporcionado.
Set (índice, valor) : agrega un par al arreglo en la posición del índice
proporcionado. Si existe un valor en esa posición
será sobrescrito.
}

Tema n.º 1
Fuente: Autoría propia
Figura 20. Representación abstracta de un arreglo
Fuente: Autoría propia

Por ejemplo, considere la opción de crear un arreglo que permita registrar la temperatura máxima de cada día
de la semana.

TemperaturaMax = {(lunes, 82), (martes, 79), (miércoles, 85), (jueves, 92), (viernes, 88), (sábado, 89), (domingo,
91)}

Ya que los índices de un arreglo deben ser de tipo numérico, la representación será tal como se aprecia a con-
tinuación:

TemperaturaMax = {(0, 82), (1, 79), (2, 85), (3, 92), (4, 88), (5, 89), (6, 91)}

a) Para actualizar el valor del día lunes a 85 la operación será set(0, 85)

b) Para recuperar el valor del día viernes la operación será get(4)

El siguiente programa muestra -de forma muy básica- como registrar (set) e imprimir (get) los elementos de un
arreglo.

using namespace std;

void main()
{
// Declarar un arreglo unidimensional de enteros con capacidad de 5 elementos
int arregloU[5];
// Guardar los enteros 14 y 23 en las dos primeras posiciones del arreglo
arregloU[0] = 14;
arregloU[1] = 23;
// Guardar números digitados por el usuario en las posiciones 3, 4 y 5 del
arreglo
cout<<”Ingrese el tercer elemento: “;cin>>arregloU[2];
cout<<”Ingrese el cuarto elemento: “;cin>>arregloU[3];
cout<<”Ingrese el quinto elemento: “;cin>>arregloU[4];
// Imprimir los elementos del arreglo
cout<<endl;
cout<<”Elementos del arreglo”<<endl;
cout<<”---------------------”<<endl;
cout<<”Primer elemento: “<<arregloU[0]<<endl;
cout<<”Segundo elemento: “<<arregloU[1]<<endl;
cout<<”Tercer elemento: “<<arregloU[2]<<endl;
cout<<”Cuarto elemento: “<<arregloU[3]<<endl;
cout<<”Quinto elemento: “<<arregloU[4]<<endl;
system(“pause”);
}

Programa 1.2

43
Por su parte, el programa 1.3 implementa los métodos get () y set () propiamente, tal como se describe en la
representación abstracta:
UNIDAD II

#include “iostream”
using namespace std;

// Declarar una constante que permitirá definir la capacidad del arreglo


const int CapacidadMax=5;

// Declarar un arreglo de enteros con capacidad de 5 elementos


int arregloU[CapacidadMax];
// Procedimiento para registrar un elemento en el arreglo
Tema n.º 1

void set(int índice, int valor)


{
arregloU[índice] = valor;
}

// Función que retorna un elemento del arreglo
int get(int índice)
{
return arregloU[índice];
}

void main()
{
int valor;
// Registrar los elementos del arreglo
for (int i=0; i<CapacidadMax; i++)
{
cout<<”Ingrese el elemento[“<<i<<”]: “;cin>>valor;
set(i,valor);
}

// Imprimir los elementos del arreglo


cout<<endl;
cout<<”Elementos del arreglo”<<endl;
cout<<”---------------------”<<endl;
for (int i=0; i<CapacidadMax; i++)
cout<<”Elemento[“<<i<<”]: “<<get(i)<<endl;

system(“pause”);
}

Programa 1.3

Aunque la representación de Sahni toma en cuenta solo dos operaciones, Cairo, O. y Guardati S. (2010, p. 7)
consideran adicionalmente las siguientes: Lectura, escritura, asignación, actualización (inserción, eliminación,
modificación), ordenación y búsqueda.

Debido a que las primeras operaciones de la lista son variantes de get () y set (); a continuación, nos enfocaremos
en las de ordenación y búsqueda.

44
ordenación y búsqueda.

Debido a que las primeras operaciones de la lista son variantes de get () y set ();
Estructura de Datos
a continuación, nos enfocaremos en las de ordenación y búsqueda. MANUAL AUTOFORMATIVO INTERACTIVO

3.2. Ordenar datos

Existen muchos algoritmos para ordenar los elementos de un arreglo. En las


siguientes líneas, en términos generales, se describe uno de ellos:
3.2. Ordenar datos

UNIDAD II
a) De
Existen muchos forma para
algoritmos ordenada capturar
ordenar los uno
elementos a arreglo.
de un uno los En valores del líneas,
las siguientes arreglo e ir
en términos ge-
comparándolos
nerales, se describe uno de ellos: con los restantes en busca del valor más alto.
b) Tal valor máximo toma la posición del dato que fue capturado inicialmente y
a) De forma viceversa.
ordenada capturar uno a uno los valores del arreglo e ir comparándolos con los restantes en
busca del valor más alto.
Para su mejor entendimiento observe la figura 21:
b) Tal valor máximo toma la posición del dato que fue capturado inicialmente y viceversa.
Figura 21. Pasos para ordenar los elementos de un arreglo
Para su mejor entendimiento observe la figura 21:

Tema n.º 1
Paso 1 Paso 2

5  Valor capturado (Pivot) 5 


Comparar el Pivot
10 10
con los siguientes
1 1

valores en busca del


3 3
dato más alto

Paso 3 Paso 4

10  Intercambiar el Pivot 10 Capturar el siguiente


5 con el valor más alto 5  Pivot y repetir el
1 detectado 1 proceso del el paso 2
3 3

En código C++:
#include "iostream"
Figura 21. Pasos para ordenar los elementos de un arreglo
using namespace std;
En código C++:
const int MAX = 4;
int arreglo[MAX];
#include “iostream”
using void
namespace std;
imprimirArreglo()
{
const intcout<<endl;
MAX = 4;
cout<<"Valores del arreglo"<<endl;
int arreglo[MAX];
cout<<"-------------------"<<endl;
for (int i=0; i<MAX; i++)
void imprimirArreglo()
cout<<"Elemento ["<<i<<"]: "<<arreglo[i]<<endl;
{ }
cout<<endl;
cout<<”Valores
void main() del arreglo”<<endl;
{
cout<<”-------------------”<<endl;
for (int int i=0;
valor;
i<MAX; i++)
int valorMAX; // [“<<i<<”]:
cout<<”Elemento Valor máximo detectado
“<<arreglo[i]<<endl;
int posMAX; // Posición del valor máximo detectado
}
//Registrar datos
void main()
cout<<endl;
{ cout<<"Ingresando valores al arreglo"<<endl;
cout<<"-----------------------------"<<endl;
int valor;
for (int //
int valorMAX; i=0; i<MAX;
Valor i++)detectado
máximo
{
int posMAX; // Posición del valor máximo detectado
cout<<"Arreglo["<<i<<"]: ";
cin>>arreglo[i];
//Registrar
} datos

// Imprimir arreglo
imprimirArreglo(); 45
// Ordenar los elementos
cout<<endl;
cout<<”Ingresando valores al arreglo”<<endl;
cout<<”-----------------------------”<<endl;
UNIDAD II

for (int i=0; i<MAX; i++)


{
cout<<”Arreglo[“<<i<<”]: “;
cin>>arreglo[i];
}

// Imprimir arreglo
imprimirArreglo();
Tema n.º 1

// Ordenar los elementos


for (int i=0; i<MAX; i++)
{
valorMAX = arreglo[i];
posMAX = i;

for (int j=i; j<MAX; j++)


{
if (valorMAX < arreglo[j])
{
valorMAX = arreglo[j];
posMAX = j;
}
}
// Intercambiar Pivot y valorMAX
valor = arreglo[i];
arreglo[i] = valorMAX;
arreglo[posMAX] = valor;
}

// Imprimir arreglo
imprimirArreglo();
system(“Pause”);
}

Programa 1.4

3.3. Búsqueda de datos


La operación de búsqueda deberá retornar el índice del dato encontrado. El siguiente programa busca un dato y
en caso de no encontrarlo retorna -1.

#include “iostream”
using namespace std;

const int MAX = 4;


int arreglo[MAX];

// Función de búsqueda
int buscar(int datoBuscado)

46
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

{
int índice=-1;
for (int i=0; i<MAX; i++)

UNIDAD II
if (arreglo[i] == datoBuscado)
índice = i;
return índice;
}

void main()
{
int DatoABuscar;

Tema n.º 1

//Registrar datos
cout<<endl;
cout<<”Ingresando valores al arreglo”<<endl;
cout<<”-----------------------------”<<endl;
for (int i=0; i<MAX; i++)
{
cout<<”Arreglo[“<<i<<”]: “;
cin>>arreglo[i];
}

cout<<endl;
cout<<”Especifique el valor que desea buscar: “;cin>>DatoABuscar;

if (buscar(DatoABuscar)==-1)
cout<<”Dato no encontrado”<<endl;
else
cout<<”El dato se encuentra en la posición “<<buscar(DatoABuscar)<<endl;
system(“Pause”);
}

Programa 1.5

4. Conversión de arreglos multidimensionales a unidimensionales


A fin de simplificar la programación de algunas aplicaciones, es posible representar un arreglo de varias dimen-
siones en uno unidimensional.

Al acto de convertir el índice de un arreglo multidimensional a un valor único se denomina mapeo y a la operación
matemática que la realiza, “Función de mapeo”.

RECUERDE:

El índice de un arreglo multidimensional está representado por varios números en forma de coordenadas.

4.1. Mapeo por filas


Consiste en descomponer el arreglo por filas y disponerlas una a continuación de otra como se aprecia en la
figura 22.

47
4.1. Mapeo por filas

Consiste en descomponer el arreglo por filas y disponerlas una a continuación de


otra como se aprecia en la figura 22.

Figura 22. Secuencia de mapeo por filas

[0] [1]
[0] (0,0) (0,1)
[1] (1,0) (1,1)
UNIDAD II

[2] (2,0) (2,1)

(0,0) (0,1) (1,0) (1,1) (2,0) (2,1)


Tema n.º 1

Función de mapeo

[0] [1] [2] [3] [4] [5]

La función de mapeo es 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚�𝑖𝑖𝑖𝑖𝑓𝑓𝑓𝑓 , 𝑖𝑖𝑖𝑖𝑐𝑐𝑐𝑐 � = 𝑖𝑖𝑖𝑖𝑓𝑓𝑓𝑓 𝐶𝐶𝐶𝐶 + 𝑖𝑖𝑖𝑖𝑐𝑐𝑐𝑐


Donde:
if = índice de fila
ic = índice de columna
C = número de columnas del arreglo (No confundir con el índice máximo)

Por ejemplo:

a. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(2,1) = 2(2) + 1 = 5
b. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(0,1) = 0(1) + 1 = 1
c. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(1,1) = __(__) + ___ = ___
d. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(2,0) = __(__) + ___ = ___

Figura 22. Secuencia de mapeo por filas

4.2. Mapeo por columnas


Por el contrario, en este tipo de mapeo se descompone el arreglo por columnas y se disponen sus elementos,
tomándolos de arriba abajo, uno a continuación del otro. Observe la figura 23.

48
4.2. Mapeo por columnas
Estructura de Datos
Por el contrario, en este tipo de mapeo se descompone el arreglo MANUAL
por columnas y
AUTOFORMATIVO INTERACTIVO
se disponen sus elementos, tomándolos de arriba abajo, uno a continuación del
otro. Observe la figura 23.

Figura 23. Secuencia de mapeo por columnas

[0] [1]
[0] (0,0) (0,1)

UNIDAD II
[1] (1,0) (1,1)
[2] (2,0) (2,1)

(0,0) (1,0) (2,0) (0,1) (1,1) (2,1)

Tema n.º 1
Función de mapeo

[0] [1] [2] [3] [4] [5]

En este caso, la función de mapeo 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚�𝑖𝑖𝑖𝑖𝑓𝑓𝑓𝑓 , 𝑖𝑖𝑖𝑖𝑐𝑐𝑐𝑐 � = 𝑖𝑖𝑖𝑖𝑐𝑐𝑐𝑐 𝐹𝐹𝐹𝐹 + 𝑖𝑖𝑖𝑖𝑓𝑓𝑓𝑓


Donde:
if = índice de fila
ic = índice de columna
F = número de filas del arreglo (No confundir con el índice máximo)

Por ejemplo:

a. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(2,0) = __(__) + ___ = ___


b. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(2,1) = __(__) + ___ = ___
c. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(0,1) = __(__) + ___ = ___
d. 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚(1,1) = __(__) + ___ = ___
Lo propio se puede hacer con un arreglo de tres dimensiones. Su función de mapeo
se representa de la siguiente manera:

𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚�𝑖𝑖𝑖𝑖𝑥𝑥𝑥𝑥 , 𝑖𝑖𝑖𝑖𝑦𝑦𝑦𝑦 , 𝑖𝑖𝑖𝑖𝑧𝑧𝑧𝑧 � = 𝑖𝑖𝑖𝑖𝑥𝑥𝑥𝑥 𝑌𝑌𝑌𝑌𝑌𝑌𝑌𝑌 + 𝑖𝑖𝑖𝑖𝑦𝑦𝑦𝑦 𝑌𝑌𝑌𝑌 + 𝑖𝑖𝑖𝑖𝑧𝑧𝑧𝑧


Figura
El programa 1.6 muestra 23. Secuencia
cómo simulardeun
mapeo por columnas
arreglo bidimensional empleando uno
unidimensional (mapeo por filas).
El programa 1.6 muestra cómo simular un arreglo bidimensional empleando uno unidimensional (mapeo por
#include <iostream>
filas).
using namespace std;
#include <iostream>
// Número de filas
using namespace std;
const int NroFilas = 4;
// Número de columnas
// Número de filas
const int NroFilas = 4;
// Número de columnas
const int NroColumnas = 3;
// Declaración del arreglo
int arreglo[NroFilas * NroColumnas];

49
const int NroColumnas = 3;
// Declaración del arreglo
int arreglo[NroFilas * NroColumnas];

// //
Método para
Método insertar
para un un
insertar valor en en
valor el el
arreglo
arreglo
void set(int
void iFil,
set(int intint
iFil, iCol, intint
iCol, valor)
valor)
{ {
UNIDAD II

// //
Conversión de de
Conversión índice mediante
índice la la
mediante función de de
función mapeo
mapeo
intint
indice = iFil
indice * NroColumnas
= iFil * NroColumnas+ iCol;
+ iCol;
// //
Asignación deldel
Asignación valor
valor
arreglo[índice]
arreglo[índice]= valor;
= valor;
} }

// //
Función queque
Función recuperar un un
recuperar valor deldel
valor arreglo
arreglo
intint
get(int iFil,
get(int intint
iFil, iCol)
iCol)
{ {
Tema n.º 1

// // Conversión
Conversión de de índice
índice mediante
mediante la la función
función de de mapeo
mapeo
intint índice
índice = iFil
= iFil * NroColumnas
* NroColumnas + iCol;
+ iCol;
// // Retornar
Retornar el el valor
valor deldel arreglo
arreglo según
según el el índice
índice calculado
calculado
return
return arreglo[índice];
arreglo[índice];
} }

// // PROGRAMA
PROGRAMA PRINCIPAL
PRINCIPAL
void main()
void main()
{ {
// // Asignación
Asignación de de valores
valores
set(0,1,5);
set(0,1,5);
set(1,1,7);
set(1,1,7);
set(2,0,10);
set(2,0,10);

// // Lectura
Lectura de de valores
valores
cout<<get(0,1)<<endl;
cout<<get(0,1)<<endl;
cout<<get(1,1)<<endl;
cout<<get(1,1)<<endl;
cout<<get(2,0)<<endl;
cout<<get(2,0)<<endl;
system("Pause");
system(“Pause”);
} }
Programa 1.6
Programa 1.6
5. Arreglo de arreglos
Matrices bidimensionales basadas en punteros

5. Arreglo de arreglos
Otra forma de generar un arreglo bidimensional es creando un arreglo de
arreglos. El siguiente ejemplo de un array de 3 filas por 4 columnas es muestra
debidimensionales
Matrices lo mencionado basadas
anteriormente.
en punteros

Otra formaFigura 24. Estructura


de generar en memoria
un arreglo bidimensional de un un
es creando arreglo
arreglobidimensional basado
de arreglos. El siguiente ejemplo de un
array de 3 filas por 4 columnas es muestra de en punteros anteriormente.
lo mencionado

[0] [1] [2] [3]


X[0] D1 D1
X[1] D2 D2
X[2] D3 D3

Array Conjunto de arrays


contenedor
Dirección en memoria de cada arreglo

Figura 24. Estructura en memoria de un arreglo bidimensional basado en punteros

50
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Pero para que esto sea posible, deberá declarar un array contenedor de tipo puntero doble (ver numeral 2) y, a
continuación, almacenar en cada casilla la dirección de memoria de cada subarreglo. El programa 1.7 muestra
cómo realizarlo en las siguientes líneas:

UNIDAD II
#include “iostream”
using namespace std;

// Tamaño del arreglo contenedor;


// También define el número de filas del arreglo bidimensional
const int NroFilas = 3;

Tema n.º 1
// Tamaño de cada subarreglo;
// También define el número de columnas del arreglo bidimensional
const int NroColumnas = 4;

// Programa principal
void main()
{
// Declarar el arreglo contenedor
int **arrayBidimensional = new int *[NroFilas];

// Asignar un subarreglo a cada casilla del arreglo contenedor


for (int i=0; i<NroFilas; i++)
arrayBidimensional[i] = new int [NroColumnas];

// Asignar algunos valores al arreglo
arrayBidimensional[0][0] = 4;
arrayBidimensional[1][2] = 7;
arrayBidimensional[2][3] = 9;

// Imprimir los valores asignados


cout<<endl;
cout<<arrayBidimensional[0][0]<<endl;
cout<<arrayBidimensional[1][2]<<endl;
cout<<arrayBidimensional[2][3]<<endl;
system(“Pause”);
}

Programa 1.7

51
Tema n.º 2:
UNIDAD II

Matrices

1. Definición
En estructura de datos, una matriz es un tipo especial de arreglo bidimensional. Se diferencia principalmente por
Tema n.º 2

las operaciones que se pueden realizar con ella.

De acuerdo con Sahni (2005), una matriz de m x n es una tabla con m filas y n columnas; son usadas a menudo
para organizar data. Por su parte, Pérez (2004 refuerza esta idea al expresar que “las matrices se utilizan (…)
como elementos que sirven para clasificar valores numéricos atendiendo a dos criterios o variables” (p. 84).
Además, diferencia entre matriz de información y matriz de relación. La primera simplemente recoge datos de
un problema determinado como el mostrado en el ejemplo 1.

Ejemplo 1. Mantener un registro de la cantidad de minerales que producen anualmente tres países (miles de
toneladas):
Figura
Figura 25.25. Ejemplo
Ejemplo dede una
una matriz
matriz dede información
información
País
País
País
País 1
1 País
País 22 País
País 3
3
[1]
[1] [2]
[2] [3]
[3]
Oro
Oro [1] 10 11.3 10
[1] 10 11.3 10
Mineral
Mineral

Plata
Plata [2] 7.5 9 5.4
[2] 7.5 9 5.4
Cobre
Cobre [3] 23 12.4 9
[3] 23 12.4 9

Por su
su parte,
parte, lala matriz
matriz deFigura
de 25. Ejemplo
relación de si
indica una matriz de
ciertos informaciónestán o no relacionados
elementos
Por relación indica si ciertos elementos están o no relacionados
entre sí. Tal relación se expresa con 1 (uno) y su ausencia con
entre sí. Tal relación se expresa con 1 (uno) y su ausencia con 0
0 (cero). Estos
(cero). Estos
números
Por su parte, la se
matriz usan
de para
relación la trasladar
indica si la
ciertos información
elementos están dada
o no por un
números se usan para la trasladar la información dada por un grafo. Observerelación grafo.
relacionados Observe
entre sí. Tal el
el se
ejemplo
expresaejemplo dado
dado
con 1 (uno) en
y suen la siguiente
la siguiente
ausencia figura:
figura:
con 0 (cero). Estos números se usan para la trasladar la información dada por
un grafo. Observe el ejemplo dado en la siguiente figura:
Ejemplo 2.
Ejemplo 2.
Ejemplo 2. Figura 26.
Figura 26. Ejemplo
Ejemplo de de unauna matriz
matriz de de relación
relación

A
A B
B A B C D
A B C D
[1]
[1] [2]
[2] [3]
[3] [4]
[4]
A
A [1]
[1] 0
0 1
1 0
0 1
1
B
B [2]
[2] 1
1 0
0 0
0 0
0
C
C [3]
[3] 1
1 0
0 0
0 0
0
C
C
D D
D [4]
[4] 0
0 0
0 0
0 0
0
D

Grafo
Grafo Matriz equivalente
Matriz equivalente

Cabe
Cabe decir
decir que
que sobre
sobre los grafos
losFigura
grafos se tratará al
al detalle en la
la Unidad
Unidad III.
26.se tratará
Ejemplo de unadetalle
matriz deen
relación III.

Como
Como habrá
habrá notado
notado enen los
los dos
dos ejemplos,
ejemplos, otraotra característica
característica de
de las
las matrices
matrices respecto
respecto
a
a los arreglos es que sus índices inician en 1 y no en 0. Por lo tanto, habrá
los
Cabe decir arreglos
que sobre es
los que
grafossus
se índices
tratará al inician
detalle en
en la1 y no
Unidaden
III.0. Por lo tanto, habrá que
que hacer
hacer
la
la respectiva
respectiva conversión
conversión al al momento
momento de de su
su declaración
declaración y/o
y/o uso.
uso.

52 2.
2. Implementación
Implementación

El
El programa
programa 2.1
2.1 muestra
muestra cómo
cómo implementar
implementar una
una matriz
matriz aprovechando
aprovechando las
las ventajas
ventajas
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Como habrá notado en los dos ejemplos, otra característica de las matrices respecto a los arreglos es que sus
índices inician en 1 y no en 0. Por lo tanto, habrá que hacer la respectiva conversión al momento de su declara-
ción y/o uso.

UNIDAD II
2. Implementación
El programa 2.1 muestra cómo implementar una matriz aprovechando las ventajas de la programación orientada
a objetos.

Tema n.º 2
#include <iostream>
#include <stdexcept>

using namespace std;

class matriz
{
private:
int NroFilas; // Nro de filas de la matriz
int NroColumnas; // Nro de columnas de la matriz
int **elementos; // Puntero hacia un arreglo bidimensional
// (del tipo “Arreglo de arreglos”)
// para almacenar los elementos de la matriz

public:
// Constructor
matriz(int pNroFilas, int pNroColumnas)
{
// Validar la cantidad de filas y columnas indicada por el usuario
if (pNroFilas <= 0 || pNroColumnas <= 0)
throw invalid_argument(“La cantidad de filas y columnas deben ser may-
or que cero.”);

// Crear la matriz
this->NroColumnas = pNroColumnas;
this->NroFilas = pNroFilas;
this->elementos = new int *[NroFilas];
for (int i=0; i<NroFilas; i++)
elementos[i] = new int [NroColumnas];
}

// Destructor
~matriz() {delete [] elementos;}

// Otras operaciones
void set(int pFil, int pCol, int pElemento) // Insertar un elemento
{
// Validar que el índice no esté fuera de rango
if (pFil <= 0 || pFil > NroFilas + 1 || pCol <= 0 || pCol > NroColumnas
+ 1)
throw invalid_argument(“El número de fila o columna especificado está
fuera de rango”);

53
elementos[pFil-1][pCol-1] = pElemento;
}
UNIDAD II

int get(int pFil, int pCol) // Recuperar un elemento


{
// Validar que el índice no esté fuera de rango
if (pFil <= 0 || pFil > NroFilas + 1 || pCol <= 0 || pCol > NroColumnas
+ 1)
throw invalid_argument(“El número de fila o columna especificado está
fuera de rango”);
return elementos[pFil-1][pCol-1];
Tema n.º 2

}
};

// PROGRAMA PRINCIPAL
void main()
{
int elemento;
int nfilas, ncolumnas;
cout<<endl;
cout<<”Creando la matriz...”<<endl;
cout<<”--------------------”<<endl;
cout<<”Indique número de filas de la matriz; “;cin>>nfilas;
cout<<”Indique número de columnas de la matriz; “;cin>>ncolumnas;

try
{
matriz m(nfilas,ncolumnas);
cout<<endl;
cout<<”Matriz creada...”<<endl;
cout<<endl;

cout<<”Digite los valores para la matriz”<<endl;


cout<<”---------------------------------”<<endl;
cout<<endl;

for (int i=1; i<=nfilas; i++)
for (int j=1; j<=ncolumnas; j++)
{
cout<<”Elemento [“<<i<<”][“<<j<<”]: “;cin>>elemento;
m.set(i, j, elemento);
}

cout<<endl;
cout<<”Matriz”<<endl;
cout<<”------”<<endl;

for (int i=1; i<=nfilas; i++)


{
for (int j=1; j<=ncolumnas; j++)
cout<<m.get(i, j)<<” “;
cout<<endl;
}

54
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

}
catch (invalid_argument& e)
{

UNIDAD II
cerr<<e.what()<<endl;
}
system(“Pause”);
}

Programa 2.1 }
system("Pause");
}

Tema n.º 2
Programa 2.1
A continuación, se describen algunas características del código.
A continuación, se describen algunas características del código.
• Se implementó empleando una clase. La ventaja que ofrece es que se podrán declarar en tiempo de eje-
• Setantas
cución implementó
matrices empleando una clase.
como se necesiten y hacerLa ventaja que
operaciones ofrece
con ellas es que
y entre ellas.se podrán
declarar en tiempo de ejecución tantas matrices como se necesiten y hacer
• operaciones
El constructor coninicializar
permite ellas y entre ellas. que almacenan la cantidad de filas y columnas, a la vez que
las variables
• El
crea constructor
la matriz basada enpermite inicializar
punteros. ¿Por quélasse variables que
opta por este almacenan
método y no sela cantidad
declara de filas
la matriz directamen-
y columnas,
te? Porque la claseapermite
la vez que
crearcrea
variaslamatrices
matriz basada en punteros.
y de diferentes tamaños;¿Por qué
si se se directamente
crea opta por (sin
este método
punteros), obligaría ya no se declara
definirlas de un la matriz
tamaño directamente? Porque la clase permite crear
fijo.
varias matrices y de diferentes tamaños; si se crea directamente (sin punteros),
obligaría a definirlas de un tamaño fijo.
int nrofilas = 4;
int nrocols = 5; Ejemplo de creación de una matriz de 4 filas y 5 columnas con
int nrofilas = 4; tamañoEjemplo
predefinidode creación
e invariante en elde una matriz
tiempo.
int nrocols = 5;
int matriz[nrofilas][nrocols]; de 4 filas y 5 columnas con
tamaño predefinido e invariante
int matriz[nrofilas][nrocols]; en el tiempo.
void crearmatriz(int nrofilas, int nro-
cols)
{
void crearmatriz(int nrofilas, int
nrocols) Ejemplo Ejemplo de procedimiento
de procedimiento que permite crearque
en tiempo
int **matriz de ejecución matrices de diferentes tamaños; de
depen-
{ permite crear en tiempo
matriz = new int *[nrofilas] derá de los valores que se especifiquen para número de
int **matriz ejecución matrices de diferentes
for (int i=0; i<5; i++) filas (nrofilas) y número de columnas (nrocols).
matriz = new int *[nrofilas] tamaños; dependerá de los
matriz[i] = new
for int [nrocols];
(int i=0; i<5; i++) valores que se especifiquen para
} matriz[i] = new int número de filas (nrofilas) y
[nrocols]; número de columnas (nrocols).
} es declarar un puntero simple (y no doble) a un arreglo unidimesional y simular la matriz median-
Otra alternativa
te las funciones de mapeo, las cuales se explicaron en el numeral 4 de la unidad anterior.
Otra alternativa es declarar un puntero simple (y no doble) a un arreglo
• unidimesional
El destructor permiteyliberar
simular la matriz
el arreglo de lamediante
memoria. las funciones de mapeo, las cuales se
explicaron en el numeral 4 de la unidad anterior.
• El destructor permite liberar el arreglo de la memoria.

3. Operaciones con matrices


3. Operaciones con matrices

“Las más
“Las operaciones operaciones más
comunes con comunes
matrices con matrices
son transponer, son transponer,
suma y multiplicación” sumap. y
(Sahni, 2005, 232).
multiplicación” (Sahni, 2005, p. 232).

3.1. Transpuesta de una matrizde una matriz


3.1. Transpuesta

La de
La transpuesta transpuesta
una matriz Ade
(m xuna
n) esmatriz A T(m
otra matriz (n x xm).n) es otra matriz
Matemáticamente, T (n x
se expresa de m).
la siguiente
manera: Matemáticamente, se expresa de la siguiente manera:

𝑀𝑀𝑀𝑀 𝑇𝑇𝑇𝑇 (𝑖𝑖𝑖𝑖, 𝑗𝑗𝑗𝑗) = 𝑀𝑀𝑀𝑀(𝑗𝑗𝑗𝑗, 𝑖𝑖𝑖𝑖), 1 ≤ 𝑖𝑖𝑖𝑖 ≤ 𝑛𝑛𝑛𝑛, 1 ≤ 𝑗𝑗𝑗𝑗 ≤ 𝑚𝑚𝑚𝑚
Gráficamente, es como se muestra en la figura que se muestra a continuación:

Figura 27. Ejemplos de transpuesta de una matriz 55


La transpuesta de una matriz A (m x n) es otra matriz T (n x m).
Matemáticamente, se expresa de la siguiente manera:

𝑀𝑀𝑀𝑀 𝑇𝑇𝑇𝑇 (𝑖𝑖𝑖𝑖, 𝑗𝑗𝑗𝑗) = 𝑀𝑀𝑀𝑀(𝑗𝑗𝑗𝑗, 𝑖𝑖𝑖𝑖), 1 ≤ 𝑖𝑖𝑖𝑖 ≤ 𝑛𝑛𝑛𝑛, 1 ≤ 𝑗𝑗𝑗𝑗 ≤ 𝑚𝑚𝑚𝑚
Gráficamente, es como se muestra en la figura que se muestra a continuación:

Gráficamente, es como seFigura


muestra27.
en laEjemplos
figura que se
demuestra a continuación:
transpuesta de una matriz
UNIDAD II

1 3
1 0 −2
𝑆𝑆𝑆𝑆𝑖𝑖𝑖𝑖 𝐴𝐴𝐴𝐴 = �0 −5� 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 𝐴𝐴𝐴𝐴𝑇𝑇𝑇𝑇 = � �
3 −5 7
2 7

1 2 1 3
𝑆𝑆𝑆𝑆𝑖𝑖𝑖𝑖 𝐵𝐵𝐵𝐵 = � � 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 𝐵𝐵𝐵𝐵𝑇𝑇𝑇𝑇 = � �
Tema n.º 2

3 4 2 4

9 10
9 0 4 𝑇𝑇𝑇𝑇
𝑆𝑆𝑆𝑆𝑖𝑖𝑖𝑖 𝐶𝐶𝐶𝐶 = � � 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 𝐶𝐶𝐶𝐶 = �0 3 �
10 3 −2
4 −2
El programa 2.2 muestra un ejemplo
Figura 27. Ejemplos sobre cómo
de transpuesta de unarealizar
matriz esta operación. Tome
en cuenta que se emplea la clase del programa 2.1.
El programa 2.2
voidmuestra un ejemplo sobre*m)
imprimir(matriz cómo realizar esta operación. Tome en cuenta que se emplea la clase
del programa {2.1.
cout<<endl;
void imprimir(matriz *m) de la matriz"<<endl;
cout<<"Valores
{ cout<<"--------------------"<<endl;
cout<<endl; cout<<endl;
for (int de
cout<<”Valores i=1;
la i<=m->getNroFilas();
matriz”<<endl; i++)
{
cout<<”--------------------”<<endl;
cout<<endl; for(int j=1; j<=m->getNroColumnas(); j++)
cout<<m->get(i,j)<<"
for (int i=1; i<=m->getNroFilas(); i++) ";
{ cout<<endl;
}
for(int j=1; j<=m->getNroColumnas(); j++)
cout<<endl; cout<<m->get(i,j)<<” “;
} cout<<endl;
}
void transponer(matriz & m, matriz & resultado)
cout<<endl;
{
} int nroFilas = m.getNroFilas();
int nroColumnas = m.getNroColumnas();
void transponer(matriz & m, matriz & resultado)
{ for (int i=1; i<=nroFilas; i++)
int nroFilas for
= m.getNroFilas();
(int j=1; j<=nroColumnas; j++)
int nroColumnas = m.getNroColumnas();
resultado.set(j, i, m.get(i, j));
}
for (int i=1; i<=nroFilas; i++)
void
formain()
(int j=1; j<=nroColumnas; j++)
{ resultado.set(j, i, m.get(i, j));
} // Variables necesarias
int elemento;
void main()
{ // Crear matriz original e insertar los datos
int nfilas
// Variables = 2;
necesarias
int ncolumnas = 3;
int elemento;
matriz m(nfilas, ncolumnas);
// Crear matriz original
cout<<"Digite e insertar
los valores paralos
la datos
matriz"<<endl;
int nfilas = 2;
cout<<"---------------------------------"<<endl;
cout<<endl;

for (int i=1; i<=nfilas; i++)


56 for (int j=1; j<=ncolumnas; j++)
{
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

int ncolumnas = 3;
matriz m(nfilas, ncolumnas);

UNIDAD II
cout<<”Digite los valores para la matriz”<<endl;
cout<<”---------------------------------”<<endl;
cout<<endl;

for (int i=1; i<=nfilas; i++)
for (int j=1; j<=ncolumnas; j++)
{
cout<<”Elemento [“<<i<<”][“<<j<<”]: “;cin>>elemento;
m.set(i, j, elemento);

Tema n.º 2
}

// Imprimir matriz original


imprimir(&m);
// Crear matriz transpuesta
// Crear matriz T(ncolumnas,
matriz nfilas);
transpuesta
matriz transponer(m,
//T(ncolumnas,T);
Crear matriznfilas);
transpuesta
transponer(m, T);
matriz T(ncolumnas, nfilas);
//transponer(m,
Imprimir matriz
T); resultado
imprimir(&T);
// Imprimir matriz resultado
// Imprimir matriz resultado
imprimir(&T);
system("Pause");
imprimir(&T);
}
system(“Pause”);
} Programasystem("Pause");
2.2
}
Programa 3.2. Suma
Programa
2.2 2.2 de matrices

Esta
3.2.operación
Suma de esmatrices
más sencilla, ya que consiste únicamente en sumar cada uno
3.2. Suma
de de
losmatrices
elementos de dos matrices de iguales dimensiones; es decir, el mismo
número de filas es
Esta operación y columnas.
más sencilla, Matemáticamente,
ya que consiste únicamente se define como se observa
en sumar a
cada uno
continuación:
de los elementos de dos matrices de iguales dimensiones;
Esta operación es más sencilla, ya que consiste únicamente en sumar cada uno de los elementos de dos matri-es decir, el mismo
número
ces de iguales de filas
dimensiones; es ydecir,
columnas.
el mismoMatemáticamente,
número de filas y columnas. se define como se observa
Matemáticamente, a como
se define
𝑆𝑆𝑆𝑆(𝑖𝑖𝑖𝑖, 𝑗𝑗𝑗𝑗) = 𝐴𝐴𝐴𝐴(𝑖𝑖𝑖𝑖, 𝑗𝑗𝑗𝑗) + 𝐵𝐵𝐵𝐵(𝑖𝑖𝑖𝑖, 𝑗𝑗𝑗𝑗), 1 ≤ 𝑖𝑖𝑖𝑖 ≤ 𝑛𝑛𝑛𝑛, 1 ≤ 𝑗𝑗𝑗𝑗 ≤ 𝑚𝑚𝑚𝑚
se observa continuación:
a continuación:

Gráficamente,𝑆𝑆𝑆𝑆 (
es 𝑗𝑗𝑗𝑗) = 𝐴𝐴𝐴𝐴
𝑖𝑖𝑖𝑖, como se(𝑖𝑖𝑖𝑖, 𝑗𝑗𝑗𝑗) + 𝐵𝐵𝐵𝐵(𝑖𝑖𝑖𝑖,
aprecia en la𝑗𝑗𝑗𝑗), 1≤
figura. 𝑖𝑖𝑖𝑖 ≤ 𝑛𝑛𝑛𝑛, 1 ≤ 𝑗𝑗𝑗𝑗 ≤ 𝑚𝑚𝑚𝑚
Gráficamente, es como se aprecia
Gráficamente, Figura
es comoen28.
lasefigura.
Ejemplo delasuma
aprecia en figura.de dos matrices

1 28.3Ejemplo
Figura 3 dos7matrices
2 de 4suma de
�0 −5� + �3 −1� = �3 −6�
1 3 2 4 3 7
2 7 1 6 3 13
�0 −5� + �3 −1� = �3 −6�
El siguiente programaFigura
muestra 1 suma
un procedimiento
2 28.7Ejemplo de 3 13
6 de dos matrices
para realizar
esta operación;
ese procedimiento cual puede acoplarse a alguno de los programas anteriores
para probar suprograma
El siguiente funcionamiento.
muestra un procedimiento para realizar esta operación;
El siguiente programa muestra un procedimiento para realizar esta operación; ese procedimiento cual puede
ese procedimiento cual puede acoplarse a alguno de los programas anteriores
acoplarse a alguno de los programas anteriores para probar su funcionamiento.
para probar su funcionamiento.
void sumar(matriz & m1, matriz & m2, matriz & resultado)
void {sumar(matriz & m1, matriz & m2, matriz & resultado)
{
void int nroFilas =& m1.getNroFilas();
sumar(matriz m1, matriz & m2, matriz & resultado)
int nroFilas
int = m1.getNroFilas();
nroColumnas = m1.getNroColumnas();
{
int nroColumnas = m1.getNroColumnas();
int nroFilas = m1.getNroFilas();
for
int(int i=1; i<=nroFilas;
nroColumnas i++)
= m1.getNroColumnas();
for (int i=1;for i<=nroFilas; i++)
(int j=1; j<=nroColumnas; j++)
for (int i=1; resultado.set(i,
i<=nroFilas; i++) j, m1.get(i, j) + m2.get(i, j));
} for (int j=1; j<=nroColumnas; j++)
Programa 2.3 resultado.set(i, j, m1.get(i, j) + m2.get(i, j));
} 57
3.3. Producto
Programa 2.3 de matrices
ese procedimiento cual puede acoplarse a alguno de los programas anteriores
para probar su funcionamiento.

void sumar(matriz & m1, matriz & m2, matriz & resultado)
{
int nroFilas = m1.getNroFilas();
int nroColumnas = m1.getNroColumnas();
for (int j=1; j<=nroColumnas; j++)
for (int i=1; i<=nroFilas; i++)
resultado.set(i, j, m1.get(i, j) + m2.get(i, j));
for (int j=1; j<=nroColumnas; j++)
}
UNIDAD II

resultado.set(i, j, m1.get(i, j) + m2.get(i, j));


}
Programa 2.3
Programa 2.3

3.3. Producto
3.3. de matrices de matrices
Producto

El productoEl
deproducto de dos
dos matrices A (mmatrices A (m
x n) y B (p x q)xesn)posible
y B (psix yq)solo
es si
posible si y de
el número solo si el número
columnas de A es igual
de columnas de A es igual número de filas de B; es decir, n = p.
número de filas de B; es decir, n = p. Cuando esa condición se da, la operación está definida Cuando
como esa
se observa
condición se da, la operación está definida como se observa a continuación:
Tema n.º 2

a continuación:
𝑛𝑛𝑛𝑛

𝑃𝑃𝑃𝑃(𝑖𝑖𝑖𝑖, 𝑗𝑗𝑗𝑗) = � 𝐴𝐴𝐴𝐴(𝑖𝑖𝑖𝑖, 𝑘𝑘𝑘𝑘 ) ∗ 𝐵𝐵𝐵𝐵(𝑘𝑘𝑘𝑘, 𝑗𝑗𝑗𝑗) , 1 ≤ 𝑖𝑖𝑖𝑖 ≤ 𝑛𝑛𝑛𝑛, 1 ≤ 𝑗𝑗𝑗𝑗 ≤ 𝑞𝑞𝑞𝑞
𝑘𝑘𝑘𝑘=1

Gráficamente, es como se muestra en la siguiente figura:


Gráficamente, es como se muestra en la siguiente figura:

Figura 29. Productos de matrices


𝑚𝑚𝑚𝑚 𝑏𝑏𝑏𝑏 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚 + 𝑏𝑏𝑏𝑏𝑦𝑦𝑦𝑦
𝑥𝑥𝑥𝑥
� 𝑒𝑒𝑒𝑒 𝑑𝑑𝑑𝑑 � ∗ �𝑦𝑦𝑦𝑦� = �𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 + 𝑑𝑑𝑑𝑑𝑦𝑦𝑦𝑦 �
𝑒𝑒𝑒𝑒 𝑓𝑓𝑓𝑓 𝑒𝑒𝑒𝑒𝑥𝑥𝑥𝑥 + 𝑓𝑓𝑓𝑓𝑦𝑦𝑦𝑦
𝑥𝑥𝑥𝑥
𝑚𝑚𝑚𝑚 𝑏𝑏𝑏𝑏 𝑒𝑒𝑒𝑒 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚 + 𝑏𝑏𝑏𝑏𝑦𝑦𝑦𝑦 + 𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒
� � ∗ �𝑦𝑦𝑦𝑦� = � �
𝑑𝑑𝑑𝑑 𝑒𝑒𝑒𝑒 𝑓𝑓𝑓𝑓 𝑑𝑑𝑑𝑑𝑥𝑥𝑥𝑥 + 𝑒𝑒𝑒𝑒𝑦𝑦𝑦𝑦 + 𝑓𝑓𝑓𝑓𝑧𝑧𝑧𝑧
𝑧𝑧𝑧𝑧
void producto(matriz & m1, matriz
Figura & m2, dematriz
29. Productos matrices& resultado)
{
int m = m1.getNroFilas();
void producto(matriz & m1, matriz & m2, matriz & resultado)
int n = m1.getNroColumnas();
{
int mint
= m1.getNroFilas();
p = m2.getNroFilas();
int nint
= m1.getNroColumnas();
q = m2.getNroColumnas();

int p = m2.getNroFilas();
int q//= m2.getNroColumnas();
Verificar que la condición establecida se cumpla (n=p)
if (n == p)
for (int i=1; i<=m; i++)
// Verificarforque
(int
la j=1; j<=p; establecida
condición j++) se cumpla (n=p)
if (n == p) {
for (int i=1; int sum = 0;
i<=m; i++)
for (int j=1; j<=p; j++)
{ for (int k=1; k<=p; k++)
sum = sum + m1.get(i, k) * m2.get(k, j);
int sum = 0;
resultado.set(i, j, sum);

}
} for (int k=1; k<=p; k++)
sum = sum + m1.get(i, k) * m2.get(k, j);
Programa 2.4
resultado.set(i, j, sum);
}
4. Matrices especiales
}
Sahni
Programa 2.4 (2005, p. 239) diferencia entre cuatro tipos de matrices:
a) Matriz diagonal
b) Matriz tri-diagonal
c) Matriz triangular inferior
58 d) Matriz triangular superior

Las siguientes figuras muestran sus características; el lugar marcado con “X”
for (int j=1; j<=p; j++)
{
int sum = 0;
Estructura de Datos
for (int k=1; k<=p; k++) MANUAL AUTOFORMATIVO INTERACTIVO
sum = sum + m1.get(i, k) * m2.get(k, j);
resultado.set(i, j, sum);
}
}
Programa 2.4
4. Matrices especiales
4. Matrices especiales

UNIDAD II
Sahni (2005, p. 239) diferencia entre cuatro tipos de matrices:
a) MSahni (2005, p. 239) diferencia entre cuatro tipos de matrices:
atriz diagonal
a) Matriz diagonal
b) Mb) atrizMatriz
tri-diagonal
tri-diagonal
c) c) Matriz
Matriz triangulartriangular
inferior inferior
d) Matriz triangular superior
d) Matriz triangular superior
Las siguientes
Las siguientes figurassusmuestran
figuras muestran sus el
características; características; el “X”
lugar marcado con lugar marcado
representa con
algún “X”
valor diferente
representa algún valor diferente de 0 (cero).

Tema n.º 2
de 0 (cero).

Figura 30. Tipos deFigura 30. Tipos de matrices


matrices
X X X

X X X X

X X X X

X X X X

X X X X

X X X

Diagonal Tri-diagonal

X X X X X X X

X X X X X X X

X X X X X X X

X X X X X X X

X X X X X X X

X X X X X X X

Triangular inferior Triangular superior

Lectura seleccionada n.º 02: Gestión dinámica de memoria


Lectura seleccionada n.º 02: Gestión dinámica de memoria
La siguiente lectura describe cómo operan los punteros, su relación con la memoria
del computador y su importancia en la implementación de aplicaciones tanto con
La siguiente lecturasimples
variables describecomo
cómo con
operan los punteros,
arreglos. su relación
Aunque con la memoria
las indicaciones del computador
que expone y su impor-
la lectura
tancia en la implementación de aplicaciones tanto con variables simples como con
son de uso general, se deben tomar en consideración al crear arreglos de punteros arreglos. Aunque las indica-
ciones que expone2)
(numeral la lectura son debidimensionales
y matrices uso general, se deben tomar
basadas enenpunteros
consideración al crear5).
(numeral arreglos de punteros
(numeral 2) y matrices bidimensionales basadas en punteros (numeral 5).
Leer hasta el apartado 8.6: Vectores dinámicos.
Leer hasta el apartado 8.6: Vectores dinámicos.
Barber, F., & Ferrís, R. Tema 8: Gestión dinámica de memoria. Disponible en
Barber, F., & Ferrís, R. Tema 8: Gestión dinámica de memoria. Disponible en http://informatica.uv.es/iiguia/AED/
http://informatica.uv.es/iiguia/AED/oldwww/2004_05/AED.Tema.08.pdf
oldwww/2004_05/AED.Tema.08.pdf

ACTIVIDAD N.° 02
59
Foro de discusión sobre implementación de operaciones con matrices
Instrucciones:
Actividad N.° 02
UNIDAD II

Foro de discusión sobre implementación de operaciones con matrices

Instrucciones:

a) Ingrese al foro y participe con comentarios sobre la siguiente pregunta: ¿cuál de los programas mostrados
a continuación reduce el código de implementación de las operaciones con matrices: ¿transponer, sumar
y multiplicar? Argumente su respuesta en tres líneas como máximo.
Tema n.º 2

Nota: Se recomienda implementar los programas y hacer las pruebas respectivas antes de participar.

Programa 1 Programa 2
Arreglo bidimensional basado en puntero Arreglo unidimensional que simula ser uno
(arreglo de arreglos) bidimensional (mapeo)
// Declarar el arreglo contenedor // Número de filas
int **arrayBidimensional = new int const int NroFilas = 4;
*[NroFilas]; // Número de columnas
const int NroColumnas = 3;
// Asignar un subarreglo a cada // Declaración del arreglo
casilla del arreglo contenedor
int arreglo[NroFilas * NroColumnas];
for (int i=0; i<NroFilas; i++)
arrayBidimensional[i] = new int
[NroColumnas]; // Método para insertar un valor en
el arreglo
void set(int iFil, int iCol, int val-
// Método para insertar un valor en or)
el arreglo
{
void set(int iFil, int iCol, int val-
or) // Conversión de índice mediante la
función de mapeo
{
int indice = iFil * NroColumnas +
arrayBidimensional[iFil][iCol] = iCol;
valor;
// Asignación del valor
}
arreglo[índice] = valor;
}
// Función que recupera un valor del
arreglo
int get(int iFil, int iCol) // Función que recupera un valor del
arreglo
{
int get(int iFil, int iCol)
return arreglo[iFil][iCol];
{
}
// Conversión de índice mediante la
función de mapeo
int indice = iFil * NroColumnas +
iCol;
// Retornar el valor del arreglo
según el índice calculado
return arreglo[índice];
}

60
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

GLOSARIO DE LA UNIDAD II

UNIDAD II
A
Arreglo. Conjunto de espacios de memoria que operan bajo un mismo nombre.

Tema n.º 2
Dimensión (de arreglo). Cantidad numérica de cada una de las magnitudes que conforman un arreglo. La mul-
tiplicación de estas cantidades permite determinar el total de espacios de memoria que tiene reservados.

E
Escribir (datos). Asignar un valor a una variable.

I
Índice (de arreglo). Número entero que representa cada una de las casillas de un arreglo.

L
Leer (datos). Recuperar el valor de una variable.

M
Magnitud. Propiedad física que puede ser medida.

P
Programa (en informática). Conjunto de instrucciones que realizan una tarea específica.

T
Tipo de dato. Cada uno de los valores que puede almacenar un computador. Se distinguen entre textos, núme-
ros, lógicos, fecha y hora, etc.

V
Variable. En un lenguaje programación es un espacio de memoria, identificado por un nombre y reservado para
almacenar un dato específico a la vez.

61
Bibliografía de la Unidad II
UNIDAD II

Cairo, O. & Guardati, S. (2010). Estructuras de datos (3.ª ed.). México: Editorial McGraw Hill.

Charles, S. (2009). Python para informáticos: Explorando la información [en línea]. Disponible en http://do1.dr-
chuck.net/py4inf/ES-es/book.pdf

Cruz Huerta, D. (2011). Apuntes de la asignatura: Estructura de datos. México: Tecnológico de Estudios Superio-
res de Ecatepec. Disponible en http://myslide.es/documents/manual-estructura-de-datos.html
Tema n.º 2

Pérez, J. (2004). Matemáticas. España: Instituto Nacional de Tecnologías Educativas y de Formación del Profeso-
rado. Disponible en http://sauce.pntic.mec.es/~jpeo0002/Archivos/PDF/T06.pdf

Sahni, S. (2005). Data structures, algorithms and applications in C++ (2.ª ed.) Hyderabad, India: Universities
Press. Disponible en https://sandeepdasari.files.wordpress.com/2013/01/ds.pdf

Universidad de Valencia, Instituto Universitario de Investigación de Robótica y Tecnologías de la Información y Co-


municación. (s.f.). Estructura de datos. IRTIC. Disponible en http://robotica.uv.es/pub/Libro/PDFs/CAPI5.pdf.

Autoevaluación de la Unidad II

1. ¿Qué es un arreglo?

a. Una variable simple con un nombre determinado

b. Una variable compuesta que opera bajo diferentes nombres

c. Conjunto de variables que operan bajo diferentes nombres

d. Conjunto de variables que operan bajo un mismo nombre

2. ¿ Cuál de las siguientes representa mejor la sintaxis para declarar en C++ un arreglo de tipo entero de n
dimensiones?

a. int arreglo[n]

b. arreglo[int n]

c. int arreglo[x][y][z]…

d. int arreglo[int n]

3. El método set de un arreglo debe recibir como parámetro…

a. El valor a insertar en el arreglo

b. El valor a insertar en el arreglo y el índice

62
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

c. El nombre del arreglo y el número de índice

d. El nombre del índice y el valor a insertar

UNIDAD II
4. El método get de un arreglo debe recibir como parámetro…

a. El número del índice del valor a recuperar

b. El valor del índice y el valor a recuperar

c. El número a recuperar

Tema n.º 2
d. El número de índice y el nombre del arreglo

5. ¿Cuáles son las funciones de mapeo por filas y por columnas?

a. 

b. 

c. 

d. 

6. ¿Cuál es la forma de declarar un puntero que soporte crear arreglos bidimensionales?

a. int **arrayBidimensional = new int *[NroFilas]

b. **arrayBidimensional = int *[NroFilas]

c. int **arrayBidimensional = *int [NroFilas]

d. **arrayBidimensional = new int *[NroFilas]

7. ¿Cuál es la característica de una matriz respecto a un arreglo bidimensional?

a. Sus índices inician en 1

b. Son de tamaño fijo

c. Solo pueden ser rectangulares

d. No permite guardar valores enteros

8. Mencione los dos tipos de matrices propuesta por Sahni

a. Matriz numérica y matriz de caracteres

b. Matriz de información y matriz de relación

c. Matriz de datos y matriz de información

d. Matriz rectangular y matriz cuadrada

63
9. ¿Por qué es preferible emplear una clase para la creación de matrices?

a. Para que desde el programa principal se puedan hacer operaciones con una sola matriz.
UNIDAD II

b. Para que desde el programa principal se puedan crear matrices de tamaño fijo.

c. Para que desde el programa principal se puedan eliminar las matrices que dejen de usarse.

d. Para que desde el programa principal se pueda crear todas las matrices que se requieran.

10. Identifique dos tipos de matrices especiales:


Tema n.º 2

a. Matriz cuadrada, matriz rectangular

b. Matriz binaria, matriz numérica

c. Matriz diagonal, matriz inferior

d. Matriz tri-diagonal, matriz mediana

64
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

UNIDAD III

ESTRUCTURAS LINEALES Y NO LINEALES DE DATOS

DIAGRAMA DE ORGANIZACIÓN

CONTENIDOS

AUTOEVALUACIÓN EJEMPLOS

BIBLIOGRAFÍA ACTIVIDADES

65
ORGANIZACIÓN DE LOS APRENDIZAJES

Resultado de aprendizaje de la Unidad III:


Al finalizar la unidad, el estudiante será capaz de seleccionar las estructuras lineales y no lineales en la solución de diversos proble-
mas.

CONOCIMIENTOS HABILIDADES ACTITUDES


Tema n.º 1: Pilas, colas y listas • Aplica y relaciona propiedades de las • Demuestra perseverancia y esfuerzo
1. Pilas pilas, colas y listas. durante el desarrollo de los ejer-
• Analiza las propiedades de los grafos cicios.
1.1 Definición
y los aplica en las diversas situacio- • Toma conciencia de la importancia
1.2 Representación abstracta nes de la vida real. de la asignatura en su formación
Tema n.º 2: Grafos profesional.
Actividad N.º 1:
Tema n.º 3: Árboles • Valora las relaciones entre sus
Foro de discusión
Lectura seleccionada n.º 3: compañeros.
• Aplica y relaciona propiedades de los
La magia de los grafos árboles.
Autoevaluación de la Unidad III Actividad N.º 2
Foro de discusión
• Resuelve las prácticas de laboratorio.

66
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Tema n.º 1:

UNIDAD III
Pilas, colas y listas
Las pilas, colas y listas constituyen estructuras de datos especiales que basan su funcionamiento en arreglos o
punteros. Las pilas permiten la inserción y eliminación de elementos solo por uno de sus extremos y encuen-
tran su aplicación práctica en llamadas a subprogramas, recursividad u ordenamiento, entre otros. El problema
planteado por las denominadas “Torres de Hanoi”, por ejemplo, usa el principio de las pilas para su resolución.
Por su parte, las colas son estructuras cuyos elementos se insertan por uno de sus extremos y salen por el otro;

Tema n.º 1
su modo de operación se parece a la cola de espera que se genera frente a una ventanilla de atención. Final-
mente, las listas son estructuras que hacen uso más eficiente de la memoria, empleando solo la que necesitan
en función de la cantidad de elementos que poseen. Si bien en este manual las pilas y colas se implementaron
sobre arreglos por fines didácticos, la práctica indica que pueden ser creadas también sobre listas basadas en
punteros.
1. Pilas

1.1 Definición
1. Pilas“Una pila representa una estructura lineal de datos en la que se puede agregar o
quitar elementos únicamente por uno de sus lados. En consecuencia, los
elementos de una pila se eliminarán en orden inverso al que fueron insertados”
1.1 Definición
(Cairo, & Guardati, 2010, p. 75). Su representación gráfica se observa en la figura
31.
“Una pila representa una estructura lineal de datos en la que se puede agregar o quitar elementos únicamente
por uno de sus lados. En consecuencia, los elementos de una pila se eliminarán en orden inverso al que fueron
insertados”Figura
(Cairo, &31. Representación
Guardati, gráfica
2010, p. 75). Su de unagráfica
representación pila se observa en la figura 31.

Pila

Último en entrar,
primero en salir.
(LIFO)

Elementos

Figura 31. Elaboración


Representaciónpropia.
gráfica de una pila
Elaboración propia.
Otra forma de ayudar a la mente a entender el funcionamiento de esta estructura
Otra forma es
de homologándola
ayudar a la menteaa una pila de
entender platos en un restaurante,
el funcionamiento en laesque
de esta estructura el encargado
homologándola a una pila
de platos endeunlavarlos los va
restaurante, en acomodando uno encima
la que el encargado de los
de lavarlos otro, mientras que
va acomodando unoquien sirve
encima los mien-
de otro,
platillos
tras que quien va platillos
sirve los retirándolos desde ladesde
va retirándolos partelasuperior; es decir,
parte superior; el último
es decir, plato
el último colocado
plato colocado por el
por el lavandero será el primero en ser utilizado o, en términos técnicos,
lavandero será el primero en ser utilizado o, en términos técnicos, “el último en entrar será el primero“el últimoen salir”
en entrar será el primero
(en inglés Last-Input, First-Out, LIFO). en salir” (en inglés Last-Input, First-Out, LIFO).

Sahni (2005)Sahni
expresa(2005)
que lasexpresa
pilas y lasque las
colas pilas y las
(estructuras quecolas (estructuras
se verán que
más adelante) seversiones
son verán másparticulares
adelante) son versiones particulares de listas lineales. Es decir, están
de listas lineales. Es decir, están implementadas a partir de listas basadas en arreglos o en punteros.
implementadas a partir de listas basadas en arreglos o en punteros.

1.2 Representación abstracta

Figura 32. Representación abstracta de una pila


Pila
{
Instancias
Lista lineal de elementos 67
Operaciones
en entrar será el primero en salir” (en inglés Last-Input, First-Out, LIFO).

Sahni (2005) expresa que las pilas y las colas (estructuras que se verán más
adelante) son versiones particulares de listas lineales. Es decir, están
implementadas a partir de listas basadas en arreglos o en punteros.

1.2 Representación abstracta

Figura 32. Representación


1.2 Representación abstracta abstracta de una pila
Pila
{
UNIDAD III

Instancias
Lista lineal de elementos
Operaciones
empty() : retorna Verdadero si la pila está vacía
size() : retorna el número de elementos de la pila
top() : retorna el primer elemento de la pila
erase() : elimina el primer elemento de la pila
insert(x) : inserta el elemento “x” a la pila
Tema n.º 1

}
Tomada de Data Structures, Algorithms, and Applications in C++, por Sahni,
(2005, p. 247).
Figura 32. Representación abstracta de una pila
1.3 Ejemplo de implementación
Tomada de Data Structures, Algorithms, and Applications in C++, por Sahni, (2005, p. 247).

1.3 EjemploA de implementación


continuación, se muestrael ejemplo de implementación de tales operaciones
que emplean como soporte para la pila un arreglo simple.
A continuación, se muestra el ejemplo de implementación de tales operaciones que emplean como soporte para
la pila un arreglo simple.

const int tamaño_pila = 5;

class pila
{
private:
int cima;
int arreglo_pila[tamaño_pila];
public:
// Constructor
pila()
{
// Inicializar el indicador
cima = -1;
// Inicializar el arreglo
for (int i=0; i<tamaño_pila; i++)
arreglo_pila[i] = NULL;
}
bool empty()
{
if (cima==-1)
return true;
else
return false;
}

int size()
{
return cima;
}

int top()
{
if (cima>-1)
return arreglo_pila[cima];
}

68
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

void erase()
{
if (cima>-1)

UNIDAD III
cima = cima - 1;
}

void insert(int elemento)


{
arreglo_pila[cima+1] = elemento;
cima = cima + 1;
}

Tema n.º 1
void imprimir()
{
cout<<endl;
cout<<”Elementos de la pila”<<endl;
cout<<”--------------------”<<endl;
cout<<endl;
for (int i=0; i<=cima; i++)
cout<<”Elemento[“<<i+1<<”]: “<<arreglo_pila[i]<<endl;
}
};
En este ejemplo, los elementos ingresan y salen de la pila por el índice de mayor
Programa 1.1
valor. La variable “cima” almacena la posición del último elemento insertado,
mientraslosque
En este ejemplo, cuandoingresan
elementos la pila está vacía
y salen de lasu valor
pila por elesíndice
-1. de mayor valor. La variable “cima” alma-
cena la posición del último elemento insertado, mientras que cuando la pila está vacía su valor es -1.
Figura 33. Representación de la pila del programa 1.1

4 Valor de
Índice del 3 “Cima”
arreglo 2 98
1 36
0 10

Figura 33. RepresentaciónElementos


de la pila del programa 1.1
Fuente: Elaboraciónpropia
Fuente: Elaboración propia

Ahora, implemente esta clase y cree instancias para probar su funcionamiento.


Ahora, implemente esta clase y cree instancias para probar su funcionamiento.
2. Colas

2.1 Definición
2. ColasUna cola es otro tipo especial de lista en el cual los elementos se insertan en un
extremo (el posterior) y se suprimen en el otro (el anterior o frente). Las colas
se conocen también como listas “FIFO” (first-in first-out) o listas “primero en
2.1 Definición
entrar, primero en salir”. Las operaciones para una cola son análogas a las de las
pilas, aunque las diferencias sustanciales consisten en que las inserciones se
realizan
Una cola es otro al final de
tipo especial delista
la lista
en elycual
no los
al principio
elementos(Aho, 1983).
se insertan en un extremo (el posterior) y se su-
primen en el otro (el anterior o frente). Las colas se conocen también como listas “FIFO” (first-in first-out) o listas
“primeroFigura 34.
en entrar, Representación
primero gráfica de
en salir”. Las operaciones una
para unacola
cola son análogas a las de las pilas, aunque las di-
ferencias sustanciales consisten en que las inserciones se realizan al final de la lista yPrimero
Cola en entrar,
no al principio (Aho, 1983).
primero en salir.
(FIFO)

Front
69
Back
(Posterior) Elementos (Frente)
2.1 Definición
Una cola
Una es es
cola otro tipo
otro especial
tipo de de
especial lista en en
lista el cual loslos
el cual elementos
elementosse se
insertan en en
insertan un un
extremo (el posterior) y se suprimen en el otro (el anterior o frente).
extremo (el posterior) y se suprimen en el otro (el anterior o frente). Las colas Las colas
se se
conocen
conocen también
también comocomolistas “FIFO”
listas “FIFO”(first-in first-out)
(first-in o listas
first-out) “primero
o listas “primeroen en
entrar, primero en salir”. Las operaciones para una cola son análogas
entrar, primero en salir”. Las operaciones para una cola son análogas a las de las a las de las
pilas, aunque
pilas, aunque laslas
diferencias
diferencias sustanciales
sustanciales consisten
consisten en en
que
quelaslas
inserciones
insercionesse se
realizan al final de la lista y no al principio (Aho,
realizan al final de la lista y no al principio (Aho, 1983).1983).

Figura 34.34.
Figura Representación gráfica
Representación dede
gráfica una cola
una cola
Cola
Cola Primero en en
Primero entrar,
entrar,
primero en
primero ensalir.
salir.
UNIDAD III

(FIFO)
(FIFO)

BackBack Front
Front
(Posterior)
(Posterior) Elementos
Elementos
(Frente)
(Frente)

Elaboración propia
Elaboración propia
Tema n.º 1

Figura 34. Representación gráfica de una cola


SuSu
comportamiento se se
comportamiento homologa
homologa alElaboración
conjunto
al conjunto de de
personas
propia
personas que aguardan
que para
aguardan serser
para
atendidos en en
atendidos una ventanilla.
una ventanilla.
Su comportamiento se homologa al conjunto de personas que aguardan para ser atendidos en una ventanilla.
2.22.2
Representación
Representación abstracta
abstracta
2.2Figura
Representación
35.35.
Figura
abstracta
Representación abstracta
Representación dede
abstracta una cola
una cola
Cola
Cola
{ {
Instancias
Instancias
Lista lineal
Lista de de
lineal elementos
elementos
Operaciones
Operaciones
empty()
empty() : :retorna Verdadero
retorna si la
Verdadero si cola está
la cola vacía.
está vacía.
size()
size() : retorna el número de elementos
: retorna el número de elementos de de la cola
la cola
front()
front() : retorna el elemento de la parte frontal
: retorna el elemento de la parte frontal
back()
back() : :retorna el elemento
retorna de de
el elemento la parte posterior
la parte posterior
erase() : elimina el primer elemento de la parte frontal
insert(x) : inserta el elemento “x” a la cola (parte posterior)
}
Tomado de Data Structures, Algorithms, and Applications in C++, por Sahni, 2005,
p. 321.abstracta de una cola
Figura 35. Representación
Tomado de Data Structures, Algorithms, and Applications in C++, por Sahni, 2005, p. 321.
2.3 Ejemplo de implementación
2.3 Ejemplo de implementación
A continuación, se muestra el ejemplo de implementación de tales operaciones,
las cuales
A continuación, utiliza el
se muestra unejemplo
arreglodesimple como soporte
implementación para
de tales la cola. las cuales utiliza un arreglo
operaciones,
simple como soporte para la cola.
class cola
class{ cola
{ private:
private: int frente, posterior;
int arreglo_cola[tamaño_cola];
int frente, posterior;
int arreglo_cola[tamaño_cola];
public:
cola()
public:{
cola() // Inicializar los indicadores
{ frente = -1;
// Inicializar
posterior =los -1;indicadores
frente // =Inicializar
-1; el arreglo
posterior = -1;
for (int i=0; i<tamaño_cola; i++)
// Inicializar el arreglo
arreglo_cola[i] = NULL;
for } (int i=0; i<tamaño_cola; i++)
bool empty()
arreglo_cola[i] = NULL;
} {
if (posterior==-1)
return true;
else
70 return false;
}
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

bool empty()
{
if (posterior==-1)

UNIDAD III
return true;
else
return false;
}

int size()
{
if (posterior!=-1)
return posterior - frente + 1;

Tema n.º 1
}

int front()
{
if (posterior!=-1)
return arreglo_cola[frente];
}

int back()
{
if (posterior!=-1)
return arreglo_cola[posterior];
}

void erase()
{
if (frente < posterior)
frente++;
else if (frente == posterior)
{
frente = -1;
posterior = -1;
}
}

void insert(int elemento)


{
if (posterior==-1)
{
arreglo_cola[0] = elemento;
posterior++;
frente++;
}

else if (posterior < tamaño_cola)


{
arreglo_cola[posterior+1] = elemento;
posterior++;
}

if (posterior == tamaño_cola)
{
if (frente > 1)
{
for (int i=frente; i<tamaño_cola; i++)

71
{
arreglo_cola[i-frente] = arreglo_cola[i];
arreglo_cola[i] = NULL;
UNIDAD III

}
posterior = tamaño_cola - frente - 1;
frente = 0;

arreglo_cola[posterior+1] = elemento;
posterior++;
}
}
}
Tema n.º 1

void imprimir()
{
cout<<endl;
cout<<”Elementos de la cola”<<endl;
cout<<”--------------------”<<endl;
cout<<endl;
for (int i=frente; i<=posterior; i++)
cout<<”Elemento[“<<i+1<<”]: “<<arreglo_cola[i]<<endl;
}
};

Programa 1.2

El programa crea una cola sobre un arreglo unidimensional. Se controla el inicio y final de la misma con las varia-
bles “frente” y “posterior”, siendo los valores del primero menores que los del segundo.

Si al insertar un nuevo elemento, la cola está copada hasta la última posición y tiene espacios libres en la parte
frontal (como se muestra en el paso “a” de la figura 36), entonces todos los elementos deben “correr” hacia la
parte izquierda para recién insertar el nuevo ítem. Observe la figura que se muestra a continuación:

Paso a: Valores iniciales

[0] [1] [2] [3] [4] [5] [6]


79 80 65 13

Paso b: Desplazamiento de los valores

[0] [1] [2] [3] [4] [5] [6]


79 80 65 13

Paso c: Inserción del nuevo elemento

[0] [1] [2] [3] [4] [5] [6]


79 80 65 13 90

Nuevo elemento

Fuente:
Figura 36. Proceso de inserción Elaboración
de elemento en unapropia.
cola con valores hacia la derecha.
Fuente: Elaboración propia.
3. Listas

72 3.1 Definición

“Una lista es un tipo de estructura lineal y dinámica de datos. Es lineal porque a


Nuevo elemento
Estructura de Datos
Fuente: Elaboración propia. MANUAL AUTOFORMATIVO INTERACTIVO

3. Listas

3.1 Definición
3. Listas
“Una lista es un tipo de estructura lineal y dinámica de datos. Es lineal porque a
cada elemento le puede seguir solo otro elemento; dinámica, porque se puede

UNIDAD III
manejar la memoria de manera más flexible, sin necesidad de reservar espacio
3.1 Definición
con antelación” (Cairo & Guardati, 2010, p. 141).

“Una lista es un tipo


Esto de estructura
autores destacan lineal
quey dinámica de de
la ventaja datos. Es lineal
emplear porque
listas a cada
en vez deelemento
arreglosleradica
puede seguir
solo otro elemento; dinámica, porque se puede manejar la memoria de manera más flexible,
en que se pueden adquirir espacios de memoria a medida que se necesiten; estas sin necesidad de
reservar espacio con antelación”
se liberan cuando ya (Cairo & Guardati,
no se 2010, p. 141).
requieren.

Esto autores destacan


Como se que la ventaja
reviso en lade primera
emplear listas en vez
unidad (ende el
arreglos radica “Listas
apartado en que se pueden adquirir
basadas en es-
pacios de memoria a medida
unaque seligada
necesiten; estascolección
se liberande
cuando ya que
no sealmacenan
requieren. dos tipos

Tema n.º 1
punteros”), lista es una nodos
de datos: el valor en sí y la dirección de memoria al siguiente nodo.
Como se reviso en la primera unidad (en el apartado “Listas basadas en punteros”), una lista ligada es una co-
lección de nodos que37.
Figura almacenan
Estructurados tipos de datos:
de una listaelenlazada
valor en sí yylalas
dirección de memoria
operaciones conal ella
siguiente nodo.

a) Estructura de un nodo

Dirección de
Valor siguiente
nodo

b) Estructura de una lista

Nodo 1 Nodo 2 Nodo 3


Dirección Dirección
Valor
Valor 1 de nodo Valor 2 de nodo Vacío
3
2 3

c) Representación de la adición un nodo a una lista

Nodo 1 Nodo 2 Nodo 3

Dirección Dirección
Valor Valor
de nodo Valor 2 de nodo Vacío
1 3
4 3

Nodo 4
Dirección
Valor 4 de nodo
2

d) Representación de la eliminación de un nodo de una lista

Nodo 1 Nodo 2 Nodo 3


Dirección Dirección
Valor
Valor 1 de nodo Valor 2 de nodo Vacío
3
3 3

Figura 37. Estructura de una lista enlazada y las operaciones con ella
Fuente: Elaboración propia
Fuente: Elaboración propia
3.3 Implementación
3.3 Implementación
A continuación, se describen los pasos para crear una lista en C++. Cabe precisar
A continuación,
que se describen
el código los pasosfue
mostrado paraexpuesto
crear una en
lista
elen C++. Cabe
programa precisar
1.4 de la que el código
Unidad I. mostrado fue
expuesto en el programa 1.4 de la Unidad I.
¿Qué necesitamos? Además de comprender cómo operan los punteros, es
imprescindible tener pleno conocimiento de las denominadas estructuras y la
definición de los tipos de datos personalizados.
73
a) Estructura
¿Qué necesitamos? Además de comprender cómo operan los punteros, es imprescindible tener pleno conoci-
miento de las denominadas estructuras y la definición de los tipos de datos personalizados.
UNIDAD III

a) Estructura

Joyanes y Zahonero (2003, p. 296) definen a “una estructura como una colección de uno o más tipos de ele-
mentos denominados miembros, cada uno de los cuales puede ser de un tipo de dato diferente”. Por ejemplo, a
diferencia de un array, las estructuras son útiles, por ejemplo, para guardar diversos tipos de datos de clientes
como edad, nombre, número telefónico, etc., sin perder la cualidad de acceder a cualquiera de estos valores
bajo un mismo nombre de variable.
Tema n.º 1

El siguiente programa crea una estructura llamada “Persona” para el registro de cuatro datos.

struct persona
{
string nombre;
string apellido; Creación de la estructura
int edad;
bool vivo;
};

void main()
{
struct persona p1, p2;
p1.nombre = “Juan”; Declaración de elementos (p1 y
p1.apellido = “Robles”; p2) del tipo de la estructura y asig-
p1.edad = 23; nación de valores a sus propieda-
p1.vivo = true; des.
p2.nombre = “María”;
p2.vivo = false;
}
Programa 1.3

b) Programa 1.3 de tipos de datos personalizados


Definición
b) Definición
Se sabe que ladesintaxis
tipos depara
datoslapersonalizados
declaración de una variable entera sin signo
(solo valores positivos) es la siguiente:
Se sabe que la sintaxis para la declaración de una variable entera sin signo (solo valores positivos) es la siguiente:
unsigned int nombre_variable;
uns
igned int nombre_variable;
Ahorabien,
Ahora bien,considere
considere
queque necesita
necesita crearcrear muchas
muchas devariables
de estas estas variables (enteras
(enteras sin signo) para un mismo progra-
sin signo) para un mismo programa. Entonces, para cada declaración, usted
ma. Entonces, para cada declaración, usted tendría que anteponer al nombre de la variable las palabras “unsig-
tendría que anteponer al nombre de la variable las palabras “unsigned int”.
ned int”. Así como se aprecia a continuación:
Así como se aprecia a continuación:
unsigned int variable1;
unsigned int variable1;
unsigned int variable2;
unsigned int variable2;
Pues bien,
Pues bien,C++C++ permite
permite simplificar
simplificar los de
los nombres nombres
los tipos de los tipos
de datos de datos
y asignarles y para lo cual se emplea
un alias
asignarles un alias para lo cual se emplea la palabra
la palabra reserva “typedef” como se muestra a continuación: reserva “typedef” como
se muestra a continuación:

typedef unsigned int u_int

Tipo de dato Alias

De modo que la declaración de variables enteras sin signo se simplifica. Por


ejemplo: u_int variable1, variable2
74
Esta asignación de alias funciona para cualquier nombre de tipo de datos (int,
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

De modo que la declaración de variables enteras sin signo se simplifica. Por ejemplo: u_int variable1, variable2

Esta asignación de alias funciona para cualquier nombre de tipo de datos (int, string, bool, etc.), sin ser la excep-

UNIDAD III
ción las estructuras. Como se puede apreciar en el programa 1.3, la declaración de elementos del tipo “estructura
persona” amerita que se antepongan las palabras “struct persona”. Para simplificar esta sentencia se puede
optar por lo siguiente:

// Asignación de alias
typedef struct persona TPersona;
(…)
// Declaración de variables de tipo estructura persona

Tema n.º 1
TPersona p1, p2;

Teniendo en consideración ambas aclaraciones; a continuación, se enumeran los pasos para crear una lista.

a) Creación de una estructura para representar a los nodos

struct nodo
{

int nro; // dato

struct nodo *sgte; // puntero a nodo siguiente
};

La primera parte del nodo es para el dato en sí (un entero en este caso), mientras que la segunda es un puntero
en la cual se almacenará la dirección de memoria del siguiente nodo. Para este último se usa el principio de
recursividad; es decir, la estructura nodo apunta a otra estructura nodo (a sí misma).

b) Creación de un alias para la estructura

typedef struct nodo *TLista;

Este alias se crea por tres razones: primero, para simplificar la declaración de elementos; segundo, para tener
un nombre de tipo de dato más cercano a lo que realmente se creará (una lista); y tercero, para especificar que
lo que se necesita es un puntero (note el asterisco que precede a la palabra TLista), pues de no crearlo como tal
obligaría a que cada elemento de tipo TLista tenga ya un nodo desde su declaración; pero esto no necesariamen-
te es así, porque sabemos que una lista puede estar vacía.

c) Creación de la lista

void main()
{
TLista lista1 = NULL;
}

En este ejemplo se crea la lista llamada “lista1”. Como se explicaba en el literal b (motivo tres), se le asigna el
valor NULL a “lista1”, ya que aún no tiene ningún elemento (nodo). Por tanto, es un puntero vacío.

3.4 Operaciones con una lista


Las operaciones posibles son tres: inserción, borrado y búsqueda.

3.4.1 Inserción

La inserción de elementos en una lista puede darse tanto al inicio como al final de la misma. Los programas 1.4
y 1.5 muestran las subrutinas para ambas tareas.

75
void insertarInicio(Tlista &lis- void insertarFinal(Tlista &lista, int
ta, int valor) valor)
UNIDAD III

{ {
Tlista q; Tlista t, q = new(struct nodo);
q = new(struct nodo);
q->nro = valor; q->nro = valor;
q->sgte = lista; q->sgte = NULL;
lista = q;
} // Verificar si la lista está vacía
if(lista==NULL)
Tema n.º 1

{
lista = q;
}
Else
{
t = lista;
while(t->sgte!=NULL)
{
t = t->sgte;
}
t->sgte = q;
}
}

Programa 1.4 Programa 1.5

En el programa de la izquierda se crea una variable auxiliar “q”, la cual recibe el dato en su campo “nro” y la di-
rección de la lista existente en el campo “sgte” de tal forma que se ubica al inicio. Por su parte, el programa de
la derecha emplea la misma variable auxiliar; sin embargo, primero verifica si la lista está vacía y, si es el caso,
inserta el nuevo nodo sin ninguna otra acción; mientras que si ya existen elementos, recorre toda lista hasta
llegar al último, empleando para ello una variable auxiliar “t”, y se asigna a “t” (último nodo) la dirección del nuevo
elemento “q”.

3.4.2 Borrado

El programa 1.6 muestra el código para eliminar un nodo según el valor que contiene. La representación gráfica
de esta acción se encuentra en el literal “d” de la figura 38.

void eliminarElemento(Tlista &lista, int valor)


{
Tlista p, ant;
p = lista;

if(lista!=NULL)
{
while(p!=NULL)
{
if(p->nro==valor)
{
if(p==lista)
lista = lista->sgte;
else

76
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

ant->sgte = p->sgte;
delete(p);
return;

UNIDAD III
}
ant = p;
p = p->sgte;
}
}
}

Programa 1.6

Tema n.º 1
3.4.3 Búsqueda

El programa 1.7 muestra el código para buscar un determinado dato en la lista.

void buscarElemento(Tlista lista, int valor)


{
Tlista q = lista;
int i = 1;
bool encontrado = false;

while(q!=NULL)
{
if(q->nro==valor)
{
cout<<endl<<” Encontrada en posición “<< i <<endl;
encontrado=true;
}
q = q->sgte;
i++;
}
if(encontrado==true)
cout<<”\n\n Número no encontrado..!”<<endl;
}

Programa 1.7

77
cout<<"\n\n Número no encontrado..!"<<endl;
}
Programa 1.7

Tema N.º 2: Grafos

Tema N.º 2:
Los grafos constituyen la primera estructura no lineal que se estudiará en este
curso; su no linealidad se da porque cada uno de sus elementos puede estar
UNIDAD III

Grafos
precedido o sucedido por otros (no necesariamente uno como ocurre en las listas).
Los grafos no son estructuras de datos predefinidas de algún lenguaje de
programación, sino que son superestructuras que basan su funcionamiento en
Los grafos constituyen
elementos la primera
ya descritos estructura
como no arrays
son los lineal que se estudiará
y los punteros.en Luego
este curso; su no linealidad
de definirlos se se da
porque cada uno de sus elementos puede estar precedido o sucedido por otros (no necesariamente
describirán algunos algoritmos que están orientados a la solución de problemas reales uno como
ocurre en las
más quelistas). Los grafos no son propiamente.
a su implementación estructuras de datos predefinidas de algún lenguaje de programación,
sino que son superestructuras que basan su funcionamiento en elementos ya descritos como son los arrays y
1. Definición
los punteros. Luego de definirlos se describirán algunos algoritmos que están orientados a la solución de proble-
Tema N.º 2

Mehta
mas reales y Sahni
más que (2005, p. 4-1)propiamente.
a su implementación concuerdan en que un grafo G= (V,E) consiste en
un conjunto finito de vértices (o nodos) V={v1, v2,…,vn} y un conjunto finito de
bordes (o segmentos) E={e1, e2,…,em} que los une. A cada borde “e” le
corresponde un par de vértices (u, v), a los cuales se dice que “e los incide”.
1. Definición
Se habla de grafo dirigido (o dígrafo de forma abreviada) cuando los segmentos
se representan
Mehta y Sahni mediante
(2005, p. 4-1) flechas
concuerdan que
en que unindican
grafo G=dirección; mientras
(V,E) consiste que en un
en un conjunto grafo
finito de vértices (o
no dirigido los segmentos son simples líneas. La figura 39 ilustra estas diferencias.
nodos) V={v , v ,…,v } y un conjunto finito de bordes (o segmentos) E={e , e ,…,e } que los une. A cada borde
1 2 n 1 2 m
“e” le corresponde un par de vértices (u, v), a los cuales se dice que “e los incide”.
Figura
Se habla de 39. Representación
grafo dirigido de un grafo
(o dígrafo de forma abreviada) cuandodirigido (izquierda)
los segmentos y uno
se representan no flechas
mediante
dirigido (derecha)
que indican dirección; mientras que en un grafo no dirigido los segmentos son simples líneas. La figura 39 ilustra
estas diferencias.

V5
V5
V4

V2 V4

V3

V1 V3
V1 V2

Fuente:
Figura 39. Representación de un Elaboración propia y uno no dirigido (derecha)
grafo dirigido (izquierda)
Fuente: Elaboración propia
Algunas diferencias entre ellos son las siguientes:
Algunas diferencias entre ellos son las siguientes:

Tabla 1.
Diferencias entre grafos dirigidos y no dirigidos
Grafo dirigido Grafo no dirigido
• Grado de un vértice: • Grado de un vértice: Número de segmentos que inciden en un
determinado vértice (los bucles cuentan doble).
oG
 rado de entrada se refiere a la cantidad de segmentos que
llegan a un determinado vértice.
Tabla 1. Diferencias entre grafos dirigidos y no dirigidos
oG
 rado de salida se refiere a la cantidad de segmentos que
parten de él. Grafo dirigido Grafo no dirigido
• Si existe un segmento (x,y), de x a y, el vértice x es llamado
• Los vértices de un segmento se llaman adyacentes o vecinos.
predecesor de y, mientras que el vértice y es llamado sucesor de x.
Elaboración propia

78
parten de él.
• Si existe un segmento (x,y), de x a • Los vértices de un segmento se
y, el vértice x es llamado predecesor llaman adyacentes o vecinos. Estructura de Datos
de y, mientras que el vértice y es MANUAL AUTOFORMATIVO INTERACTIVO
llamado sucesor de x.
Elaboración propia

Un ejemplo de una situación real modelable con un grafo es el sistema de un


Un ejemploaeropuerto. Cada real
de una situación aeropuerto
modelableescon ununvértice
grafo esy el
dos vértices
sistema están
de un conectados
aeropuerto. por
Cada aeropuerto es
una arista si hay un vuelo directo entre los aeropuertos. La arista podría tener un
un vértice y dos vértices están conectados por una arista si hay un vuelo directo entre los aeropuertos. La arista
peso, que que
representa el eltiempo, distanciao elo costo
el costo del vuelo. Un segundo

UNIDAD III
podría tener un peso, representa tiempo, distancia del vuelo. Un segundo ejemplo es el flujo
ejemplo es el flujo de tráfico, en el cual cada intersección de calles representa
de tráfico, en el cual cada intersección de calles representa un vértice y cada calle es una arista. Los un costos de
vértice y cada calle es una arista. Los costos de las aristas podrían representar
las aristas podrían representar un límite de velocidad o una capacidad, número de carriles, entre otros. En ambos
un límiteode
casos (aeropuerto velocidad
flujo o una
de tráfico) podría capacidad, número
determinarse la rutade carriles,
más entredos
corta entre otros. En ambos
puntos, la ubicación más
casos (aeropuerto o flujo de tráfico) podría determinarse la ruta más corta entre
probable para un embotellamiento, entre otros (Weiss, 1995).
dos puntos, la ubicación más probable para un embotellamiento, entre otros
(Weiss,
A continuación, se1995).
exponen definiciones básicas acerca de los grafos y sus componentes.

• A continuación,
Segmentos sedos
paralelos: Si exponen
segmentos definiciones básicas
tienen el mismo acerca
par de de los grafos y sus
vértices.

Tema N.º 2
componentes.
• Multigrafo: Grafo con segmentos paralelos.
• Segmentos paralelos: Si dos segmentos tienen el mismo par de vértices.
• Bucle: Multigrafo:
• Cuando Grafo con
un segmento nacesegmentos
y termina enparalelos.
mismo vértice.
• Bucle: Cuando un segmento nace y termina en mismo vértice.
• Grafo Grafo Cuando
• simple: simple:un Cuando
grafo noun grafo
tiene no tieneparalelos
segmentos segmentos paralelos ni bucles.
ni bucles.
• Grafo general: cuando tiene segmentos paralelos y bucles. Se denomina
• Grafo general:
también cuando tiene segmentos paralelos y bucles. Se denomina también pseudógrafo.
pseudógrafo.
• Grafo ponderado: Cuando cada uno de sus segmentos tiene asignado un valor
• Grafo ponderado:
numérico,Cuando
el cualcada uno de sus
representa segmentos
el “ancho tiene asignado
de segmento”. Enunlavalor numérico,
práctica, esteelvalor
cual represen-
ta el “ancho
puede referirse a distancias de carreteras, costos de construcción, lapsos decostos de
de segmento” . En la práctica, este valor puede referirse a distancias de carreteras,
construcción,
tiempo,lapsos de tiempo, capacidad
probabilidad, probabilidad,decapacidad
carga o de carga o cualquier
cualquier otro atributo
otro atributo (Ver figura 40).
(Ver figura
40).

Figura Figura 40. Ejemplo


40. Ejemplo dedeun
ungrafo
grafo ponderado
ponderado

Tomado de Handbook
Tomado de HandbookofofData Structures
Data Structures andand Applications,
Applications, por
por Mehta Mehta2005.
& Sahni, & Sahni,
2005.
• Densidad: Es la proporción entre el cuadrado de la cantidad de vértices (V2) y el número de segmentos (E)
• Densidad: Es la proporción entre el cuadrado de la cantidad de vértices (V2) y el
de número
un grafo. de
En segmentos
otras palabras, mientras E se aproxime a V 2
(proporción cercana a 1)
(E) de un grafo. En otras palabras, mientras E se aproxime se dice que se está
ante un2 “grafo denso”; por el contrario, si los valores se alejan (proporción cercana a 0), se está ante un
a V (proporción cercana a 1) se dice que se está ante un “grafo denso”; por el
“grafo poco denso”. Esta diferencia es importante resaltarla, ya que le permitirá elegir la estructura más
adecuada para su implementación.

2. Representación de grafos
La representación abstracta de un grafo (componentes y operaciones posibles) se muestra a continuación:

79
poco denso”. Esta diferencia es importante resaltarla, ya que le permitirá elegir
la estructura más adecuada para su implementación.

2. Representación de grafos
La representación abstracta de un grafo (componentes y operaciones posibles) se
muestra a continuación:

Figura 41. Representación abstracta de un grafo


Grafo
{
Instancias
UNIDAD III

Conjunto de vértices (V) y conjunto de segmentos (E)


Operaciones
NroVertices() : Retorna el número de vértices del grafo.
NroSegmentos : Retorna el número de segmentos del grafo.
ExisteSegmento(i,j) : Retorna verdadero si el segmento (i.j) existe en el
grafo.
InsertarSegmento(s): Insertar el segmento s en el grafo.
EliminarSegmento(i,j): Elimina el segmento (i,j) del grafo.
Tema N.º 2

Grado(i) : Retorna la cantidad de segmento del vértice i (solo


grafos no dirigidos)
GradoEntrada(i) : Retorna la cantidad de segmentos que llegan al
vértice i. (solo grafos dirigidos)
GradoSalida(i) : Retorna la cantidad de segmentos que parten del
vértice i. (solo grafos dirigidos)
}
Tomada de Data Structures, Algorithms, and Applications in C++, por Sahni, 2005,
p. 625.
Figura 41. Representación abstracta de un grafo
Tomada de Data Structures, Algorithms, and Applications in C++, por Sahni, 2005, p. 625.
No obstante, a nivel de programación existen dos maneras de implementar los
grafos,
No obstante, a niveltal
decomo lo proponen
programación Mehta
existen y Sahnide
dos maneras (2005, p. 4-3):
implementar los grafos, tal como lo proponen
Mehta y Sahni (2005, p. 4-3):
a) Lista de adyacencia: Consiste en un array de n punteros, uno para cada
a)  Lista de vértice del grafo,
adyacencia: tal en
Consiste queunpara
arrayarray[v], que hace
de n punteros, uno referencia al vértice
para cada vértice v, parten
del grafo, tal que para
nodos enlazados por cada uno de sus vértices adyacentes.
array[v], que hace referencia al vértice v, parten nodos enlazados por cada uno de sus vértices adyacentes.
b) Matriz de adyacencia: Consiste en una matriz numérica de v x v elementos,
b)  Matriz detal que la posición
adyacencia: aij en
Consiste = una
1 si matriz
existenumérica
un segmento
de v x vque va del vértice
elementos, i al
tal que la j; sinoa = 1 si
posición ij
aij = 0. Note que para representar un bucle bastará marcar con 1 la posición
existe un segmento que va del vértice i al j; sino aij = 0. Note que para representar un bucle bastará marcar
respectiva en la diagonal de la matriz, mientras que para representar
con 1 la posición respectiva en la diagonal de la matriz, mientras que para representar segmentos parale-
segmentos paralelos se registrará un número mayor que 1 en la respectiva
los se registrará un número mayor que 1 en la respectiva coordenada, pero hacer esto no es común.
coordenada, pero hacer esto no es común.
La figura 42 ilustra estas dos formas de representación tanto para un grafo no dirigido como para uno dirigido.
La figura 42 ilustra estas dos formas de representación tanto para un grafo no
dirigido como para uno dirigido.

Figura 42. Representación de un grafo no dirigido (izquierda) y un grado


dirigido (derecha)
Tomada de Handbook of Data Structures and Applications, por Mehta & Sahni,
2005, yp.un4-4.
Figura 42. Representación de un grafo no dirigido (izquierda) grado dirigido (derecha)Tomada de Handbook of Data
Structures and Applications, por Mehta & Sahni, 2005, p. 4-4.
Ahora bien, tanto la lista como la matriz de adyacencia pueden ser adaptadas
para registrar los ponderados si así fuera necesario. La figura 43 muestra un
Ahora bien, ejemplo
tanto la lista
de como
ello alapartir
matrizdel
de adyacencia puedenen
grafo mostrado serlaadaptadas para registrar los ponderados si así
figura 40.
fuera necesario. La figura 43 muestra un ejemplo de ello a partir del grafo mostrado en la figura 40.
Figura 43. Lista de adyacencia y matriz de adyacencia para un grafo
ponderado

80
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

UNIDAD III
Tema N.º 2
Figura 43. Lista de adyacencia y matriz de adyacencia para un grafo ponderado
Tomada de Handbook of Data Structures and Applications, por Mehta & Sahni, 2005, p. 4-5.

La razón para elegir la estructura más adecuada recae en la densidad del grafo. Los autores recomiendan imple-
mentar grafos poco densos con listas de adyacencia, mientras que para grafos muy densos sugieren hacerlo
con matrices. Si usted elige una matriz para un grafo poco denso, tendrá varias casillas de las mismas marcadas
con 0 (cero), ocupando espacios de memoria innecesariamente. Como expresa Weiss (2000), se trata de que
nuestras estructuras de datos representen realmente los datos que haya y no los que no están presentes”.

3. Operaciones con grafos


Las operaciones descritas en el numeral 2 (representación abstracta de un grafo) están orientadas hacia la pro-
gramación, las cuales no ameritan mayor explicación ya que podrá implementarlas aplicando todo lo ya tratado
anteriormente en este manual.

Esta sección, se ocupará más bien de exponer algunos algoritmos para aplicarlos en la solución de casos reales
como los que se mencionan a continuación:

• Ordenación topológica

• Algoritmo del camino más corto

3.1. Ordenación topológica


Imagine un grafo dirigido cuyos vértices representan al conjunto de asignaturas que debe aprobar un estudiante
antes de culminar su carrera y cada arista simboliza si una asignatura es requisito de otra. En este contexto, una
ordenación topológica vendría a ser cualquier secuencia de asignaturas que no contravenga con la norma de
requisito.

Ten en cuenta lo siguiente:

Una ordenación topológica no es posible si el grafo tiene ciclos y bucles. En el ejemplo, una asignatura no
puede ser requisito de sí misma.

En términos generales, el algoritmo consiste en encontrar un nodo al que no entren aristas, se imprime y se
elimina junto con estas; finalmente, se repite el proceso con los vértices restantes.

81
// Algoritmo para ordenamiento topológico
procedure ordenop(G:grafo);
UNIDAD III

var C:COLA;
var contador: integer;
v, w: vértice;
begin
crear_nula(C);
contar:=1;
for cada vértice v do
if gradient[v] = 0 then
Tema N.º 2

encolar(v, C);

while not está_vacía(c) do


begin
v:=desencolar(c);
núm_top[v]:=contador; [asigna el siguiente número]
contador:=contador+1;

for cada w adyacente a v do


begin
gradoent[w]:=gradoent[w]-1;
if gradoent[w] = 0 then
encolar(w, C);
end;
end;
if Contador <= |V| then
error(“El grafo tiene bucles”);
end;

Programa 2.1 Tomada de Estructura de datos y algoritmos, por Weiss, 1995, p. 300

3.2. Algoritmo del camino más corto


Generalmente resulta de interés encontrar los caminos, directos o indirectos, entre los vértices de grafo. A su
vez, se requiere encontrar el camino más corto entre dos vértices. Los algoritmos más usados para este fin son
los siguientes: Dijkstra, Floyd y Warshall.

Ten en cuenta

El camino más corto entre dos vértices de un grafo ponderado está determinado por la suma de los pesos
de las aristas que unen tales vértices, mientras que en un grafo no ponderado está determinado por la
cantidad de aristas entre ellos.

a) 
Grafo no ponderado

El algoritmo para encontrar el camino más corto en un grafo no ponderado se muestra a continuación:

procedure noponderado(var T:Tabla)


var dist_act:integer;
v, w:vértice;
begin
for dist_act:=0 to NUM_VERT-1
for cada vértice v
if (T[v].conocido = false) and (T[v].dist = dist_act) then

82
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

begin
T[v].conocido = true;
for cada e adyacente a v

UNIDAD III
if (T[w].dist = MAXINT then
begin
T[w].dist:= dist_act + 1;
T[w].camino := v;
end;
end;
end;

Tema N.º 2
Programa 2.2 Tomado de Estructura de datos y algoritmos, por Weiss, 1995, p. 305

b) 
Grafo ponderado

Para este tipo de grafos la bibliografía propone tres algoritmos (Cairo & Guardati, 2010, p. 285-293):

• Algoritmo de Dijkstra - Encuentra el camino más corto de un vértice elegido a cual-


quier otro del dígrafo.
- Las aristas deben tener peso no negativo.

• Algoritmo de Floyd - Encuentra el camino más corto entre cada par de nodos del
grafo.
- La matriz de distancias sirve como punto de partida para este
algoritmo. Se realizan k iteraciones sobre la matriz, por lo tanto,
la k-ésima iteración, M[i,j] tendrá el camino de menor costo
para llegar de i a j.

• Algoritmo de Warshall - Encuentra, si es posible, un camino entre cada uno de los vérti-
ces del dígrafo. Es decir, la solución encontrada solo muestra si
hay o no camino, más no la distancia entre los vértices.

El pseudocódigo del algoritmo Dijkstra lo describe Weiss (1995, p. 314) de la siguiente manera:

procedure dijkstra (var T:TABLA);


Var i:integer;
V, w: vértice;
begin
for i:=1 to NUM_VÉRTICES
begin
v:= vértice con la distancia más corta desconocida;
T[v].conocido = true;
for cada w adyacente a v
if T[w].conocido = false then
begin
if T[v].dist + c(v, w) < T[w].dist then // Actualiza w
begin
reducir(T[w].dist a T[v].dist + c(v, w));
T[w].camino := v;
end:
end;
end;
end;

Programa 2.3 Tomado de Estructura de datos y algoritmos, por Weiss, 1995, p. 314

A modo de ejemplo; a continuación, se presenta un grafo y su respectiva solución para encontrar el camino más
corto a través del algoritmo Dijkstra.

83
end;
end;
end;
Programa 2.3 Tomado de Estructura de datos y algoritmos, por Weiss, 1995, p. 314

A modo de ejemplo; a continuación, se presenta un grafo y su respectiva solución


para encontrar el camino más corto a través del algoritmo Dijkstra.

Figura 44. Grafo de ejemplo y su respectiva tabla


UNIDAD III
Tema N.º 2

Tomada de Apuntes elaborados. Tema 9. Grafos, por Asencio, Quevedo y López


Figura 44. Grafo de ejemplo y su respectiva tabla
(s.f.), p. 10.
Tomada de Apuntes elaborados. Tema 9. Grafos, por Asencio, Quevedo y López (s.f.), p. 10.
Para realizar este algoritmo se requiere adicionalmente:
Para realizar este algoritmo se requiere adicionalmente:
• Un arreglo “visitados”de tipo booleany del mismo ancho que la matriz.
• Un arreglo
• Un “visitados”de tipo booleany
puntero “actual” del mismo
para recorrer el ancho
grafo.que la matriz.
• Un arreglo “costes” de tipo entero para almacenar la estimación de cada coste
• Un puntero “actual”
para llegarpara recorrer
a cada nodo.el grafo.
Se requiere inicializarlo con valores altos de tal forma
que todo número comparado con él sea menor. En este caso tal número será
• Un arreglo “costes” de tipo entero para almacenar la estimación de cada coste para llegar a cada nodo. Se
representado con la letra “i” (infinito).
requiere
• inicializarlo
Un arreglo con valores
“ruta” altosrecordar
para de tal forma que todo
el primer número
paso comparado
a dar con él
para llegar sea menor.
a cada nodoEn este
caso tal número será representado
por el camino de menor coste.con la letra “i” (infinito).

• Un arreglo “ruta” para recordar el primer paso a dar para llegar a cada nodo por el camino de menor coste.
Desarrollo del algoritmo:
Desarrollo del algoritmo:
1. Se registra en “Actual” el nodo inicial: Actual = “A”. Se marca A como visitado
1. enenel“Actual”
Se registra arregloelVisitados.
nodo inicial: Actual = “A”. Se marca A como visitado en el arreglo Visitados.

AA BB CC D
D EE FF G
G H
H
Visitados
Visitados TT FF FF FF FF FF FF FF

2. Se
2. Se copian
copian aquellos
aquellos valores
valores mayores
mayores que
que cero
cero dede la
la fila
fila A
A de
de la
la matriz
matriz al
al arreglo
arreglo
2. Se copian aquellos
Costes. Se valores mayores
rellenan las que cero
casillas de la fila A de la matriz
correspondientes del al arreglo
arreglo Costes.
Ruta con Se
lasrellenan las
Costes. Se rellenan las casillas correspondientes del arreglo Ruta con las
direcciones
casillas de los
correspondientes nodos
del vecinos
arreglo de
Ruta con
direcciones de los nodos vecinos de “A”. “A”.
las direcciones de los nodos vecinos de “A”.
A
A B
B C
C D
D E
E FF G
G H
H
Costes
Costes i
i 7
7 10
10 4
4 ii I
I I
I II
Ruta
Ruta B
B C
C D
D

84 3. Del
3. Del arreglo
arreglo Costes
Costes sese elige
elige el
el menor
menor valor
valor de
de los
los que
que todavía
todavía no
no han
han sido
sido
visitados, es decir, “D”, Actual = “D” y se le marca como visitado.
visitados, es decir, “D”, Actual = “D” y se le marca como visitado.
A
A B
B C
C D
D EE FF G
G H
H
A B C D E F G H
Visitados T F F F F F F F
A B C D E F G H Estructura de Datos
Visitados T F F F F F MANUAL F AUTOFORMATIVO
F INTERACTIVO
2. Se copian aquellos valores mayores que cero de la fila A de la matriz al arreglo
Costes. Se rellenan las casillas correspondientes del arreglo Ruta con las
2. Se copian aquellos valores A mayoresA B B queCcero C de D la D filaE AEde la F G G
F matriz H H
al arreglo
direcciones de los nodos vecinos A de B “A”. C D E F G H
Costes.VisitadosSeVisitados
rellenan las casillas T T F F F
correspondientes
F F F del
F F arreglo
F F Ruta
F F conF F las
Visitados AT BF C D E F G H
direcciones de los nodos vecinos de “A”.F F F F F
Costes i 7 10 4 i I I I
2. 2. Se Se copian
copian aquellos
aquellos valores
valores mayoresA
mayores B que
que cero C
cero deD laDfila
de la fila
fila AE A de
de la
la matrizF matriz
matriz G arreglo
al H
al arreglo
2. Se copian Ruta
aquellos valores mayores B que C de
cero la A de la al arreglo
Costes.
Costes. Se Se
Costes
Se rellenan rellenan
rellenan las las
las casillas casillas
i correspondientes
7
casillas correspondientes 10
correspondientes del 4 deli
del arreglo arreglo
arreglo Ruta I Ruta
Ruta con I con
con las I las
las
3. Del arreglo Costes.
direcciones
Costes se de
elige losel nodos
menor vecinos
valor de de
los “A”.
que todavía no han sido visitados, es decir, “D”, Actual =
direcciones Ruta
de los nodos
nodos vecinos B
de “A”.
“A”. C D

UNIDAD III
3. Del arreglo de
direcciones Costes
los se elige vecinos el menorde valor de los que todavía no han sido
“D” y se le marca como visitado. A = “D”A B
B y seC C
Cle marca D
D como E
E visitado. F F G G H H
visitados, es decir, “D”, Actual A B D E F G H
3. Del arreglo Costes Costes
Costes se elige i i menor
el 7 7 10 valor10 de 4 4 que
los i i todavíaI I no I IhanI sido I
Costes Ai B
7 C
10 D
4 Ei FI GI HI
visitados,Ruta esRuta
decir, “D”, Actual = B“D” B y se C Cle marca
D D como visitado.
Visitados
Ruta T BF F
C T
D F F F F
A B C D E F G H
3. 3. Del Del arreglo
arreglo Visitados Costes
Costes se se
eligeelige elT el menor
menor F valor valor
F de de T los
los que que todavía
Ftodavía F no no F
han han
sido Fsido
4.
3. Se estima
arregloelCostes
Delvisitados, coste (desde se“D”,elige elelnodo menor inicial
valor “A”) deparalos que llegar a cadano
todavía uno de los
visitados, es es
decir,decir, “D”, ActualActual = = “D”
“D” y sey sele le
marca marca como como visitado.han sido
visitado.
nodos el de
visitados, “D” que aún
es(desde
decir, el“D”, noActual
han
inicialsido = visitados;
“D” y se aescada
le marca decir,uno“C” y “G”.
Dcomo
4. Se estima coste nodo “A”) para llegar de visitado.
los nodos de “D” que aún no han
4. Se estima el coste (desdeAelAnodo B B inicialC C “A”)Dpara EllegarE F F Guno
a cada G de H H los
sido visitados; es decir, “C” y “G” . A B C D E F G H
nodos de Visitados
“D”
Visitados que aún no han
T T sido F F
visitados;
F F es
T T
decir, F F
“C” y F F
“G”. F F F F
Costes
Visitados i
T 7F 10
F 4
T Fi FI FI I
F

Tema N.º 2
A B C D E F G H
Ruta B C D
4. 4.
4. Se Se
Se
estima
estima
estima el
el
Costes
el coste
coste
coste (desde
(desde
(desde el
iel nodo
el nodo
nodo 7 inicial
inicial
inicial
10
“A”)
“A”)
“A”)para
para
4para llegar
llegar
llegar
i a cada
ay
aI cada
cada uno
uno
Iunode de
de
I los
los
los
nodos
nodos de
dellegar “D”
Ruta
“D” que que que aún aún no no
han han sido sido B visitados;
visitados; C esD
es decir, decir, “C” “C” “G”.
y “G”. casilla “D”).
•nodos Para de “D” a C:aún 4 +no 14han = 18 sido(4 visitados;
se extrae del arreglo “costes”,
A A B B C C esDdecir, D E“C”E y “G”. F F si G G G H H
Se compara este valor con A el coste B actual
C registrado
D E en “C”; F es menor,H
Para Costes
llegar a C: 4+ 14 extrae i
= 18 (4 7 se7 extrae 10 del 4
4 arreglo i “costes”, I I
casilla “D”).I
• Para• llegar se reemplazaCostes
a Costes
C: 4 + 14 el= dato.
18 (4 se ii del
7 10 “costes”
arreglo
10 4 ii “D”).
, casilla II II II
Se compara Ruta Ruta este valor con el Bcoste B C C D
actual D
registrado en “C”; si es menor,
18 > 10 Ruta => continúa 10. B C D
Se se reemplaza el dato.
• compara
Para llegar este valor a G:con 4 +el1coste = 5.actual registrado en “C”; si es menor, se reemplaza el dato.
•• •Se 18
Para Para > 10
llegar =>
llegar a C:acontinúa
C:
4 +4 14+ 14 10.
= = 18
18 (4 (4
se se extrae
extrae del del arreglo
arreglo “costes”,
“costes”, casilla
casilla “D”). “D”).
Para compara
llegar aa este
C:G: 4+ valor
14 con
= el(4 coste actualdel registrado en “G”; sicasilla es menor,
18 > • 10
Se Para
Se
=>comparallegar
compara
continúa este
10.este 4+
valor 1con
valor =18 5.
conel else
coste
extrae
coste actual
actual
arreglo
registrado
registrado
“costes”,
en en
“C”; “C”; si si es
es
“D”).
menor,
menor,
se
SeSe reemplaza
compara esteel dato.
se se compara
reemplaza
reemplaza este
el elvalor
dato.valorcon
dato. conelelcoste costeactual
actualregistrado
registradoenen“C”; “G”;si siesesmenor, menor,
5
sese< i =>
reemplaza se registra
el dato. 5 en el arreglo costes; se copia el nodo usado para
• Para llegar18 > 18 reemplaza
a
> 10 >
10G: 10
4 +
=>en =>1 = el
5.
continúa dato.
continúa 10. 10.
llegar
18 a “G” => su respectiva
continúa casilla.
•• •Para 5Para
Para <llegar
i =>llegar ase G:aregistra
G:4 +41 +10.
=51 5. en
= 5. el arreglo costes; se copia el nodo usado para
llegar a G: A
4su+elrespectiva
1coste
= 5. B C D E F G H
Se compara
Se llegar
Se este
compara a “G”
compara valor en
este este
con valor
valor con con
actual
el elcasilla.
coste
registrado
coste actual
actual en registrado
“G”;
registrado si es en en
menor,
“G”; “G”; si es
sesireemplaza
es menor,
menor, el dato.
Se se Costes
compara esteelvalor i
conAel coste 7 10
actual 4
registrado i en “G”; I 5
si es I
menor,
reemplaza
se reemplaza
reemplaza el dato.
dato.dato. B C D E F G H
5 < i =>se Ruta 5el B se copia C el nodo D usado para llegarDa “G” en su respectiva
5 5sei<registra
< => iCostes
=>se se en
registra el arreglo
registra 5 en 5 costes;
en en el arreglo
iel arreglo 7 10costes;
costes; 4 se
se copia copia
i el nodo elInodo usado 5usado para Ipara
5 <
casilla.llegar i
llegar => a se“G” registra
en su 5
respectiva el arreglo
casilla.costes; se copia el nodo usado para
a “G” Ruta
“G” en su su respectiva B C D
casilla.valor de los que todavía no han sido D
5. Del llegar arreglo a costes en serespectiva
elige el menor
A A casilla.
B B y se C C D D como E E visitado. F F G G G H H H
visitados, es decir, “G” (Actual A = “G”), B C le marca
D E F
5. Del arreglo Costes Costes
costes se elige i
el menor 7 valor10 de 4
los que i todavía I no 5 han I
sido
Costes Aii 7
B
7 10
C
10 4
D
4 Eii FII 5
G
5 HII
visitados,Ruta Ruta B
es decir, “G” (Actual =B“G”), yC se le Dmarca como visitado. C D D D
Visitados
Ruta T BF F
C T
D F F T
D F
A B C D E F G H
5. 5. Del Del arreglo
arreglo Visitados costes
costes se se
elige elige el T el
menormenor
F valor valor
F de de T los
los que que todavía
Ftodavía F no no T
han han
sido Fsido
5. D6.5. Se
el arreglo estima
costeselse
Delvisitados,
arreglo coste
elige para
costes elsemenor llegar
elige ela menor
valor cada
de losuno que
valorde losdelenodos
todavía no han
los que de
sido “G” queno
visitados,
todavía aún es
han no sido
han
decir, “G” (Actual =
visitados, es es
decir,decir, “G” “G” (Actual
(Actual = = “G”),
“G”), y y se
se le marcamarca como como visitado.
visitado.
“G”),sido y se visitados.
le marca como visitado.
visitados, es decir, “G” (Actual A= “G”), y se C le marca
6. Se estima el coste para llegar A =a55 cada
B (5B uno de los
Cextrae D delD como
nodos E de E visitado.
“G” FqueGaún
F“costes”, G no H han H
• Para llegar a “F”: 5 + 50 A B seC D arreglo
E F G casilla H
sido visitados. Visitados
Visitados T T F F F F T T F F F F T T F F
“G”) Visitados
• Para llegar a “F”: 5 + T50 = 55 F (5 se F extraeT delFarreglo F T
“costes”, F
casilla
Se compara este valor con el coste actual registrado en “F”; si es menor,
6. Se6. 6.
estima Se
6. Se sido
Se
seel“G”)
estima
estima
estimacosteel
reemplaza
el coste
elpara
coste
coste para
llegar
elpara
para llegar
a cada
dato. llegar
llegar
uno a de
a
a los
cada
cada
cadauno uno
nodos
uno dede
de
de
los
los
los
“G” nodosnodos
que
nodos de de
aún
de no “G”
“G”
“G” que
han
que
queaún
sido
aún
aúnno no
no han
visitados.
han
han
sido55 Se compara
visitados.
visitados. este valor con el coste actual registrado en “F”; si es menor,
sido < i => se registra 55 en el arreglo costes; se copia el nodo usado para
visitados.
• Para se
•• •llegar reemplaza
Paraallegar
“F”:llegar ael“F”:dato. 5(5 50
+
se 50 = 55 (5 (5se se extrae deldel arreglo “costes”, casilla
Para
llegar
Para a
llegar “F”5en a+ “F”:
a
50
su=respectiva
“F”: 55+
5
5 + 50
extrae
= casilla.
= 55
55
del
(5
arreglo
se extrae
extrae
“costes”
del
, arreglo
casilla
arreglo
“G”) “costes”,
“costes”, casilla
casilla
55
“G”) “G”) < i => se registra 55 en el arreglo costes; se copia el nodo usado para
“G”) A B C D E F G H
Se compara llegar
Se
Se compara este
compara a
compara “F”
valor en consu
este
este valor respectiva
elvalor
coste
valor con con con
actual casilla.
el
el coste coste
registrado
coste actual
actual en registrado
“F”;
registrado si es en
menor,
en 55 “F”;
“F”; si se si es
reemplaza
si 5es
es menor,menor,
menor, el dato.
Se Costes este i el 7 10
actual 4
registrado i en “F”; I
se reemplaza
se reemplaza
reemplaza el
el dato.
dato.dato. A B C D E F G H
55 < ise =>55 sei< Ruta 55
registra el en el arreglo B se copia C elD D llegarDa “F” en su respectiva
55 < => i =>
Costesse se registra
registra 55 55 en i costes;
en el 7arreglo
el arreglo
arreglo 10costes;
costes; nodo
4se se usado
copia copia
i el para el
55nodo
nodo usado5usado para Ipara
55
casilla.llegar <
llegari => a se
“F” registra
en su 55
respectivaen el casilla. costes; se copia el nodo usado para
a “F” Ruta
“F” en su respectiva
respectiva B
casilla. C D D D
• Para llegarllegar a aen “H”:su 5 + 26 = 31.
A A casilla.
B B C C D D E E F F G G H H
Se compara este valor con A el coste B actual
C registrado
D E en “H”; F si G es menor,H
• ParaCostes Costes
llegar a “H”: 5 + 26 i 31.
= 7 7 10 10 10 4 4 4 ii i 55 55 55 5 5 5 II I
se reemplazaCostes el dato. ii 7
Se compara Ruta Rutaeste valor con el Bcoste B actual C D
Ccostes; D
registrado enD“H”; D si D es D menor,
31 < i => Ruta se registra 31 en el arreglo B C D se copia el D nodo usado D para
se reemplaza el dato.
llegar
• Para •llegar a
a<“H”: “H” en su respectiva casilla.
31
Para Para llegar =>5ase
i llegar +a26
“H”:
= 31.5 +3126
registra
“H”: 5+ + 26 26 = =en =el31.
31. arreglo costes; se copia el nodo usado para
•• Para llegar
Se llegar a
compara “H”a “H”:
en estesu5 respectiva
valor con 31. casilla.
el coste actual registrado en “H”; si es menor,
Se comparaSe compara
Se compara
este valor este
este con valor
valor
el conactual
con
coste el coste
el coste actual
actual
registrado enregistrado
registrado
“H”; si es en en “H”;
“H”;
menor, sesireemplaza
si es
es menor,
menor, el dato.
se reemplaza
se reemplaza
reemplaza el el
el dato.
dato.dato.
se 31 <=> i =>
31 < i31 31
=>< <seii registra
=> se se
se 31
registra
registra 31 31
en el arreglo
registra 31 en
en
encostes;
el
el arreglo
el arreglo
arreglo
se copia
costes;
costes;
costes; el nodo se se
se copia
usado
copia
copia
para
el
el nodo
el nodo
nodo usado
llegarusado
usado para
a “H” para
para
en su respectiva
llegar
llegar a a “H” a “H”
“H” en en su en su respectiva
su respectiva
respectiva casilla. casilla.
casilla.
casilla. llegar
A B C D E F G H
Costes i 7 10 4 i 55 5 31
Ruta B C D D D D

7. Del arreglo costes se elige el menor valor de los que todavía no han sido 85
visitados, es decir, “B” (Actual = “B”), y se le marca como visitado.
A B C D E F G H
Costes i 7 10 4 i 55 5 31
Ruta B C D D D D
A B C D E F G H
7. Del arreglo costes se elige el menor valor de los que todavía no han sido visitados, es decir, “B” (Actual =
7. Del arreglo costes se eligeAiel menor
Costes B
7 valor
C deD
10 4los que Ei todavía F
55 no G5 han 31 Hsido
“B”), y se le marca como visitado. A B C D E F G H
visitados,Costes es
Rutadecir, “B” (Actual Ai = “B”), 7
B y10se le marca
C 4
D como
E
i visitado.
F
55
D DG
5 H
31
D
Costes i 7 10 4 i 55 5 31
UNIDAD III

Costes
Ruta Ai 7
BB CC
10 D
4
D E
i DF
55 DG
5 H
31
D
Ruta
Visitados T BT CF DT F DF D
T DF
Ruta B
7. Del arreglo costes se elige el menor valor de los que todavía no han sido C D D D D
7. Del visitados,
arreglo escostes
decir, “B” (Actual
se elige el = “B”), valor
menor y se lede marca
los que como visitado.
todavía no han sido
7.
8.estimaDel arregloel costes
Se estima coste se elige
para llegar el menor valor de los quedetodavía no han sido
8. S7.e visitados,
Del arreglo
el costeespara
decir,
costes “B”
llegar (Actual
sea elige
cada A ela=
uno cada
menor
de B
“B”),
los uno
y seCdele
valor
nodos delos
de “B” nodos
Dlos
marca que
que “B”
Eaúntodavía
como que
Fhan
visitado.
no no
sidoaún
G han no Hhan
sido
visitados.
visitados,
sido visitados.es decir, “B” (Actual = “B”), y se le marca como visitado.
visitados, es decir, “B” (Actual
Visitados AT = “B”), BT C
y seF le marca D
T E
como
F F
visitado. GT HF
Para Visitados
llegar a +“C”: 7 +(76se= A 13 (7Bse extrae C delD E F G H
• Para • llegar a “C”: 7 6 = 13 Aextrae
T TBdel arreglo
C “costes”
F T arreglo
D , E “costes”,
F
casilla F
“B”) casilla
G
T H
F“B”)
Se Visitados
compara este valor conT el coste T F
actual T
registrado F en “C”; F si Tes menor,F
8. Se estima Visitados
el coste para llegar T a cada T uno Fde los TnodosFde “B”F que aún T no F han
8. Se sido
Se se
estima
compara reemplaza
visitados.
este valorelpara
el coste dato.
con elllegar
coste aactual
cadaregistrado
uno de los nodos
en “C”; si esde menor,
“B” que seaún no hanel dato.
reemplaza
8. Se estima 13 > 10el =>
coste para llegar
continúa 10. a cada uno de los nodos de “B” que aún no han
Tema N.º 2

8. sido Para llegar


visitados.
•Se estima a “C”:
el coste para 7+ 6
llegar = 13 (7 seuno
a cada extrae
de los delnodos
arreglo de“costes”,
“B” que aún casilla
no “B”)
han
sido visitados.
Para llegar
13 • > Para
•sido 10
Se => continúa
compara
llegar
visitados. aaeste
“E”:
“C”: 77 +
10. valor + 65con == 13 12.
el (7
coste actual del
se extrae registrado
arreglo en “C”; sicasilla
“costes”, es menor,
“B”)
• Para llegar a este
Se reemplaza
compara “C”: valor
7 + 6con = 13 (7
el (7costese extrae
actual del del arreglo “costes”,
registrado en “C”;
“E”; si casilla
sicasilla
es menor,“B”)
menor,
• Se se
Para compara
llegar aeste el dato.
“C”: valor
7 + 6con = 13 el coste actual
se extrae registrado
arreglo en “costes”, es “B”)
Se
• Para llegar compara
se reemplaza
reemplaza
a “E”: 7 este
+ valor
el dato.
5 =dato.
12. con el coste actual registrado en “C”; si es menor,
13
se
Se > 10 => continúa
compara el
este valor10. con el coste actual registrado en “C”; si es menor,
se reemplaza
12 reemplaza
< llegar
i => se el dato. 12 en el arreglo costes; se copia el nodo usado para
registra
• 13 Para
se > 10 => a continúa
“E”: 7 + 10.
el dato. 5 = 12.
Se 13 > 10 => continúa 10. actual
• compara
llegar
Se
Para
13
este
a
compara
> llegar
10 “E”valor
=>aen este
“E”:con
su
continúa
el
+coste
7respectiva
valor 5con
10.= 12. elcasilla.
coste registrado
actualen “E”; si es en
registrado menor,
“E”;se si reemplaza
es menor, el dato.
• Para llegar a “E”: 7 + 5 = 12.
A 12. B C D E en “E”; F
• Se se
Para reemplaza
compara
llegar aeste el dato.
“E”: valor
7 + 5con = el coste actual registrado si Ges menor, H
12 < iSe =>compara registraeste
seCostes 12 envalor con
el arreglo el coste
costes;
ien el actual
7 seactual copia elregistrado
10 4nodo usado
12 en en “E”;
para si 5es
llegar menor,
a “E” en su respectiva
12
se < i => seeste
Se reemplaza
compara registravalor12con
el dato. el coste
arreglo costes; se copia
registrado el55nodosiusado
“E”; 31
para
es menor,
casilla. se reemplaza Ruta el dato. B Ccostes; D se copia B el D D D
llegar
12 < i a=>
se reemplaza “E”seenregistra
elsudato.
respectiva
12 en elcasilla.arreglo nodo usado para
12 < i => se registra 12 en el arreglo costes; se copia el nodo usado para
llegar
12 < i a=> “E”se enregistra
su respectiva12Aen elcasilla. B
arreglo Ccostes; D se copia E el Fnodo usadoG H
para
llegar a “E” en su respectiva casilla.
9. Del llegar arreglo costes
a “E”
Costes en su serespectiva
eligeAiel menor B
casilla.
7 valor
C deD
10 4los que E todavía
12 F
55 no G5 han 31 Hsido
A B C D E F G H
visitados;Costes es
Rutadecir, “C” (Actual Ai = “C”),
7
B y 10
Cse le marca
4
D como
12
BE visitado.
F
55
D DG
5 H
31
D
Costes Ai 7 10 4 12 55 5 31
Costes
Ruta i 7B
B CC
10 D
4
D BE
12 55
D F DG
5 H
31
D
Ruta
Visitados T BT CT DT BF DF D
T DF
9. D9.
el arreglo costesRuta
Del arreglo costes
se elige el semenor
eligevalor deBlos que
el menor Ctodavía
valor de Dlos que
no han Bsido D
todavía
visitados;noDes han D
sido
decir, “C” (Actual =
9. Del visitados;
arregloescostesdecir, “C” (Actual
se elige el = “C”), valor
menor y se ledemarca los que como visitado.
todavía no han sido
“C”),9. Del
y se arreglo
10.visitados;
le marca costes
Se estima se
como visitado.
elcostes
coste elige el menor valor de los que todavía no han sido
9. Del arreglo es decir, para“C” llegar
(Actual
se elige Aela= cadaB uno
“C”),
menor y seCdelede
valor los nodos
Dlos
marca Edetodavía
como
que “C” F queno
visitado. aún
G han noH han
sido
visitados;
sido visitados. es decir, “C” (Actual = “C”), y se le marca como visitado.
visitados; es decir, “C” (Actual
Visitados AT = “C”), BT yC se
T le marca D
T E
como
F F
visitado. GT HF
• Para Visitados
llegar a “F”: 10 + 12 A B C D E F G H
A = 22T
T B (10 se C extrae
T T del F
D arreglo
E F “costes”, G
T casilla
H
F
Visitados
“C”) Visitados T T T T F F T F
10. Se estima el coste para llegar T a cada T uno Tde los TnodosFde “C”F que aún T no F han
10. Se
sidoestima
Se compara
visitados.el para
coste estepara valor
llegar conael cadacoste actual registrado de en “F”; siaúnes menor,
10. Se estima
10. el coste
Se estima el coste llegar
para a cada
llegar uno a de
cada losuno
nodos
uno
dede los
de los “C”nodos
que aún
nodos
“C”
no han
de “C”
quesido
que aún
no han
visitados.
no han
sido
• se
Para reemplaza
llegar
visitados. a el
“F”: dato.
10 + 12 = 22 (10
10. Se estima el coste para llegar a cada uno de los nodos de “C” que aún no se extrae del arreglo “costes”, casilla
han
sido22 visitados.
< 55=> se registra 22 en el arreglo costes; se copia el nodo usado
• Para• “C”)
Para
sidollegar llegar
visitados.
a “F”: a
10 “F”:
+ 12 10
= 22 + 12
(10 =
se 22
extrae (10 delse extrae
arreglo del
“costes” arreglo
, casilla “costes”,
“C”) casilla
• Parapara llegar
llegar a a “F”:en
aeste
“F” 10 + correspondiente
12 = 22 (10 se extrae del arreglo “costes”, casilla
Se
• “C”)
Para compara
llegar “F”: 10su
valor + con12 = el 22
coste (10actual casilla.
se extrae registrado
del arreglo en “F”; si es menor,
“costes”, casilla
“C”)
se
Se
“C”)
Se compara reemplaza
compara
este valor elcon
este dato.
valor
el costecon actual
el coste actualen
registrado registrado
“F”; si es en “F”;se
menor, si reemplaza
es menor, el dato.
11. Delse Se compara
arreglo costesestesevalor eligeconcon el
el el costevalor
menor actual registrado en “F”; si es menor,
22
Se < 55=>
reemplaza
compara seel registra
este dato.
valor 22 en coste actualde
el arreglo los que
costes;
registrado todavía
se copiaen “F”; no
el sinodoeshan sido
usado
menor,
se reemplaza
visitados, esregistra
decir, el “E”
dato.
en(Actual
22 < 22
55=>
para
se se
< llegar
55=>
reemplaza ase el22
“F” en
registra
dato. su 22 = “E”),
el correspondiente
arreglo encostes; y se
el arreglose copia
le costes;
marca
casilla.el nodo como
seusado visitado.
copia para llegar ausado
el nodo “F” en su corres-
22 < 55=> se registra 22 A en B el arregloC costes;
D seE copia F el nodoG usado
H
para llegar
22 <casilla.
pondiente 55=>a se “F”registra
en su correspondiente
22 en el arreglo casilla.
costes; se copia el nodo usado
para Visitados
llegar a “F” en su correspondiente T T T casilla.T T F T F
11. Del para arreglo llegarcostes
a “F”se enelige el menor valorcasilla.
su correspondiente de los que todavía no han sido
11. D11.
el arreglo
visitados,
Del costes
arreglo se elige
escostes
decir, “E”el menor
(Actual
se elige valor
el = de los
“E”), y
menor que todavía
se lede
valor marca no han
los quecomo sido visitados,
visitado.
todavía es decir,
no han sido “E” (Actual =
11.
12. Del
Se arregloel costes
estima coste se elige
para llegar elamenor
cada valor
uno de de
los los
nodosquedetodavía“E” que no aún hanno sido
han
11. visitados,
“E”), y se arreglo
Del le marca es costes
decir,visitado.
como “E” (Actual
se elige Ael = B yvalor
“E”),
menor seC lede Dlos que
marca E todavía
como F
visitado. noG han H sido
visitados,
sido visitados. es decir, “E” (Actual = “E”), y se le marca como visitado.
visitados, es decir, “E” (Actual
Visitados AT = “E”), BT y se CT le marca D
T E
como
T F
visitado. GT HF
• Para Visitados
llegar a “F”: 12 + 8 A B C D E F G H
A = 20T
T B(12 se C extrae
T T del T
D arreglo
E F “costes”, G
T casilla
H
F
Visitados
“E”) Visitados T T T T T F T F
12. Se estima el coste para llegar T a cada T uno Tde losTnodosTde “E”F que aún T no F han
12. Se Se
sidoestima compara
visitados.el coste estepara valor
llegar conael cadacoste uno actual
de los registrado
nodos de en “E”“F”;
quesiaún es no
menor,
han
12. Se12.
estimaSe estima el coste
el reemplaza
coste para llegar a cada uno dedelos nodos de “E”han que aún no han
12. sido se
Para
visitados.
•Se estima elpara
llegar a llegar
coste elpara
“F”: a cada
dato.
12 + 8uno
llegar =a de
20los
cada (12nodos
unosede extrae
los“E” que arreglo
del
nodos aún
de no sido
“E” “costes”,
que aún visitados.
casilla
no han
sido20 visitados.
<llegar
22 => se registra
“E”)
•sidoParavisitados. a “F”: 12 + 820 = 20en (12 el arreglo
se extrae costes; se copia“costes”,
del arreglo el nodo casilla
usado
• Para Para
• llegar
para llegar
allegar
“F”: 12 a “F”
+“F”: 12
8 =valor
20 (12+correspondiente
8se=extrae
20 (12 del se extrae
arreglo del arreglo
“costes” , casilla “costes”, casilla
“E”)
Se
• “E”)
Para llegar a
compara “F”:en
aeste 12su+con 8 =el20 coste(12 actual casilla.
se extrae registrado
del arreglo en “F”; si es menor,
“costes”, casilla
“E”) A el coste B C D E en “F”; F
se
Se
“E”) reemplaza
compara este el dato.
valor con actual registrado si Ges menor, H
Se comparaSe compara este valor
Costes este con valor
el costecon el coste
i20actual actual
7elregistrado
10 en registrado
4“F”; si12 en “F”;sesireemplaza
es menor, es menor,
31 el dato.
20
se < 22
Se reemplaza
compara => este
se registra
el dato.
valor con elencoste arreglo
actual costes;
registrado se copiaen 20“F”; 5es
el sinodo usado
menor,
se reemplaza Ruta el dato. Bel arreglo C casilla. D B copia B el nodo D usado D
20 < 20 para
se
22 < llegar
22
reemplaza => a “F”
se enensu
el registra
dato. el correspondiente
20 encostes; costes; se
20 => < se 22 registra
=> se20 registra arreglo
20 en el arreglo se copia el nodo
costes; seusadocopia para
el llegar
nodo ausado
“F” en su corres-
para llegar a “F” en su A B
correspondiente C
20 < 22 => se registra 20 en el arreglo costes; se copia el nodo usado D
casilla. E F G H
pondiente para casilla.
llegar a “F” en su correspondiente casilla.
para llegarCostesa “F” en su correspondienteAi B
7 C casilla.
10 D
4 E
12 F
20 G5 H
31
A B C D E F G H
Costes
Ruta Ai 7
B 10
C 4
D 12
BE F
20
B DG
5 H
31
D
Costes i 7 10 4 12 20 5 31
Costes
Ruta i 7
B 10
C 4
D 12
B 20
B D5 31
D
Ruta B C D B B D D
Ruta B C D B B D D

86
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

• Para llegar a “H”: 12 + 20 = 32 (12 se extrae del arreglo “costes”, casilla


• Para Para allegar
•• llegar
Para
“E”) llegar aa “H”:
“H”: 12 “H”:
+ 20 1212
= 32+(12
+ 20se
20 == extrae
32 (12
32 (12 searreglo
delse extrae
extrae del arreglo
del arreglo
“costes” “costes”,
, casilla“costes”,
“E”) casilla
casilla
“E”)
“E”)
Se compara este valor con el coste actual registrado en “H”; si es menor,
Se reemplaza
Se
Se compara
se compara
compara este
este
este valorelcon valor
valor conactual
con
el coste
dato. el coste
el coste actualen
actual
registrado registrado
registrado en
“H”; si esen “H”;se
“H”;
menor, sireemplaza
si es menor,
es menor, el dato.

UNIDAD III
se
se reemplaza
reemplaza el
el
32 > 31 => continúa 31.dato.
dato.
32 > 32 32=>
31 >> 31
31 => continúa
continúa
=> continúa
31. 31.
31.
13. Del arreglo costes se elige el menor valor de los que todavía no han sido
13. 13.
D13. Del arreglo
el arreglo
Del arreglo
costes
visitados, costes
esse elige el
costes
decir, semenor
se
“F” elige
elige
(Actual el =
valor
el menor
de
menor
“F”), valor
los que
yvalor de
setodavía
lede los que
no han
los
marca que todavía
sido
como no es
visitados,
todavía no
visitado. han
han sido
decir,
sido“F” (Actual =
visitados,
“F”), visitados,
y se le marcaescomo
es decir,visitado.
decir, “F” (Actual
“F” (Actual = = “F”),
“F”), yy se
se le
le marca
marca como
como visitado.
visitado.
A B C D E F G H
A
A BB C
C D
D EE F
F G
G HH
Visitados T T T T T T T F
14. Se estima Visitados
Visitados
el coste para llegar T
T a cada T T T T T
T unoTde losTnodosTde “F”T que aún T no FF
T han
14. Se
Se estima
estima el coste
coste para
para llegar
llegar aa cada
cada unouno de
de los
los nodos
nodos de de “F”
“F” que
que aún
aún no no han
han

Tema N.º 2
14. sido el
visitados.
14. Se estima
sido
sido el coste
visitados.
visitados. para llegar a cada uno de los nodos de “F” que aún no han sido visitados.
• Para llegar a “H”: 20 + 9 = 29 (20 se extrae del arreglo “costes”, casilla
Para llegar
•• Para
“F”) llegar aa “H”:
“H”: 20
20 + +9 9== 2929 (20
(20 se
se extrae
extrae del
del arreglo
arreglo “costes”,
“costes”, casilla
casilla
• Para llegar
“F”) a “H”: 20 + 9 = 29 (20 se extrae del arreglo “costes”, casilla “F”)
“F”)
Se compara este valor con el coste actual registrado en “H; si es menor,
Se reemplaza
Se compara este
compara estedato.
valor con
valor con el
el coste
coste actual
actual registrado en en “H;
“H; si
si es
es menor,
menor,
se
Se compara
se este valorel
reemplaza elcon el coste actual
dato. registrado enregistrado
“H; si es menor, se reemplaza el dato.
se
29 reemplaza
< 31 => se el dato.
registra 29 en el arreglo costes; se copia el nodo usado
29 < <llegar
31 =>
=> se registra
registra 29 en
en el arreglo
arreglo costes;
costes; sese copia
copia el
el nodo
nodo usado
usado
29 < 29
para
31 => 31 se
a “H”
se registra 29en 29
enlaelcasilla
arreglo el
correspondiente.
costes; se copia el nodo usado para llegar a “H” en la casilla
para llegar a “H” en la casilla correspondiente.
para llegar a “H” en la casilla correspondiente.
correspondiente.
A B C D E F G H
Costes A
A
i B
7B C
C
10 D
D
4 E
12E F
F
20 G
G
5 HH
29
Costes
Costes
Ruta i
i 7
B7 10
10
C 4
4
D 12
12
B 20
20
B 5
5
D 29
29
B
Ruta
Ruta BB C
C D
D B
B B
B D
D BB
15. Del arreglo costes se elige el menor valor de los que todavía no han sido
15. D 15.
 15. Del arreglo
Del arreglo
visitados,
el arreglo costes esse costes
costes
decir,
elige el semenor
se
“F” elige
elige
(Actual el =
el
valor menor
menor
de“F”),
los quevalor
yvalor de
lede
setodavía los
los
marca que
que
como
no han todavía
todavía
sidovisitado. no es
no
visitados, han
han sido
sido
decir, “F” (Actual =
visitados, es decir, “F” (Actual = “F”), y se le marca como visitado.
“F”), visitados,
y se le marca es comodecir,visitado.
“F” (Actual = “F”), y se le marca como visitado.
A B C D E F G H
Visitados A
A
T B
B
T CC
T D
DT E
E
T FF
T G
G
T H
H
T
Visitados
Visitados T
T T
T TT TT T
T TT T
T T
T
16. Se estima el coste para llegar a cada uno de los nodos de “F” que aún no han
16.
16. S16.
e Se estima
Se
estima
sido estima
el coste
visitados. el para
el coste
coste para
para
llegar
Todos los llegar
a llegar
cada
nodos aa cada
uno cada
de han
ya uno
losunonodosde los
de
sido los
de nodos
nodos
“F” quede
visitados, de “F”
aún“F”
por que
lo que
no aún
han aún
sido
tanto, no han
no han
visitados.
acaba el Todos los
sido
nodossido visitados.
visitados.
algoritmo.
ya han sido Todos
Todos
visitados, porlos
los lo nodos
nodos
tanto, ya
ya
acaba han
hanel sido
sido visitados,
visitados,
algoritmo. por
por lo
lo tanto,
tanto, acaba
acaba el
el
algoritmo.
algoritmo.
A B C D E F G H
Costes AAi BB
7 C
C
10 D
D
4 E
E
12 FF
20 G
G
5 H
H
29
Costes
Costes ii 77 10
10 4
4 12
12 20
20 5
5 29
29
Ruta B C D B B D B
Ruta
Ruta BB C
C D
D BB B B D
D B
B
Ruta más corta: A – B– E
Ruta más corta: A – B– E – F – H.– F – H.
Ruta más
Ruta más corta:corta: A A– – B–B– E E– – FF – – H.
H.
Tomada
Tomada de Apuntes elaborados. Tema 9: por
de Apuntes elaborados. Tema 9: Grafos, Asencio,
Grafos, porQuevedo
Asencio, y López
Quevedo (s.f.),ypp. 11-14.
López
Tomada
Tomada de
(s.f.), pp.de11-14. Apuntes elaborados. Tema 9: Grafos,
Apuntes elaborados. Tema 9: Grafos, por Asencio, Quevedo y López por Asencio, Quevedo y López
(s.f.), pp.
(s.f.), pp. 11-14.
11-14.
Implemente
Implemente este algoritmo
este algoritmo en C++en y realice
C++ ylasrealicepruebas lasrespectivas.
pruebas respectivas.
Implemente este algoritmo en
Implemente este algoritmo en C++ y realice las pruebasC++ y realice las pruebas respectivas.
respectivas.
Por su parte los algoritmos de Floyd y Marshall siguen la siguiente secuencia:
Por su parte los algoritmos de Floyd y Marshall siguen la siguiente secuencia:
Por su
Por su parte
parte los los algoritmos
algoritmos de de Floyd
Floyd yy Marshall
Marshall siguensiguen la la siguiente
siguiente secuencia:
secuencia:
// Algoritmo de Floyd
// Algoritmo de Floyd
for//k=1 hasta N de Floyd
Algoritmo
//
forAlgoritmo
k=1 hastade N Floyd
for
forfor
for i=1
k=1i=1
k=1 hasta
hasta
hasta NNN N
hasta
for forfor
for j=1
i=1j=1
i=1 hasta
hasta
hasta hasta N
NN N
if for (Mik
forifj=1j=1 + Mkj<
hasta
(Mikhasta+ MkjN <NMij)
Mij) then then
Mij if
if M(M (M= ik
ij ik
ik
Mik +
= +MikMkjM+ +< MMMkjij
kj
kj
<
Mkj ij)
ij
) then
then
M = M + M
Tomada deMEstructuras
ij = Mik ik + M
ij ik kj
ij dekj datos (3.ª ed.), por Cairo y Guardati, 2010, p. 289.
kj
Tomada de Estructuras
Tomada de datos (3.ª
de Estructuras
Estructuras deed.),
datospor Cairo
(3.ª yed.),
Guardati,
ed.), por2010,
Cairo p. y289.
Guardati, 2010,
2010, p. p. 289.
289.
Tomada de de datos (3.ª por Cairo y Guardati,
Donde
Donde N esN es el número total de vértices del
Mgrafo;
es una M es unade Nmatriz de N x Ny elementos
Donde
Donde
y se Neles
N
inicia
número
es el número
el
con número
los
total de
costos
vértices
total
totaldel de
de
del grafo;
vértices
vértices
dígrafo, y del
del
k, i,grafo;
grafo;
j son
matriz
M
M es una
es una
variables
x N elementos
matriz
matriz
enteras. de N
de N xx N se inicia con los costos
N elementos
elementos
del y
dígrafo, y
se inicia k, i,
inicia con j son
con los variables
los costos
costos del enteras.
del dígrafo,
dígrafo, yy k, k, i,
i, jj son
son variables
variables enteras.
enteras.
y se

87
// Algoritmo de Warshall
for k=1 hasta N
for i=1 hasta N
UNIDAD III

for j=1 hasta N


if (A[i, j] = 0 then
A[i, j] = A[i, k] y A[k, j];

Tomada de Estructuras de datos (3.ª ed.), por Cairo y Guardati, 2010, p. 293

Donde N es el número total de vértices del grafo; A es una matriz de N x N elementos, inicialmente es igual a la
matriz del grafo, y k, i, j son variables enteras.
Tema N.º 2

88
for i=1 hasta N
for j=1 hasta N
if (A[i, j] = 0 then Estructura de Datos
A[i, j] = A[i, k] y A[k, j]; MANUAL AUTOFORMATIVO INTERACTIVO
Tomada de Estructuras de datos (3.ª ed.), por Cairo y Guardati, 2010, p. 293

Donde N es el número total de vértices del grafo; A es una matriz de N x N elementos,


inicialmente es igual a la matriz del grafo, y k, i, j son variables enteras.

Tema n.º 3: Árboles


Tema n.º 3:

UNIDAD III
Árboles
Los árboles, aunque similares a los grafos, encuentran su aplicación en otros
campos de la computación, principalmente en el diseño de compiladores y búsqueda
de datos de forma ágil. Como en el tema 2, el contenido está orientado a brindar
Los árboles,
pautasaunque similares a los
y algoritmos grafos, encuentran
referidos su aplicación
a la aplicación de en
losotros camposende vez
árboles la computación,
de su prin-
implementación.
cipalmente en el diseño de compiladores y búsqueda de datos de forma ágil. Como en el tema 2, el contenido
está orientado a brindar pautas y algoritmos referidos a la aplicación de los árboles en vez de su implementación.
1. Definición

Tema n.º 3
Un árbol es un tipo especial de grafo, cuya característica diferenciadora es que
1. Definición
cada nodo, a excepción del primero, tiene solo un predecesor. Un árbol es la
representación natural de información jerárquica y, gráficamente, es como se
Un árbol esmuestra en la figura
un tipo especial 45.cuya característica diferenciadora es que cada nodo, a excepción del pri-
de grafo,
mero, tiene solo un predecesor. Un árbol es la representación natural de información jerárquica y, gráficamente,
es como seFigura
muestra45. Ejemplo
en la figura 45.de árbol

Tomada de Data structures and algorithm analysis in C++, por Weiss,2014, p. 122)
Figura 45. Ejemplo de árbol
Tomada de Data structures and algorithm analysis in C++, por Weiss,2014, p. 122
De esta estructura se desprenden los siguientes conceptos:
a) Nodo raíz: Primer nodo, sin predecesor (A).
De esta estructura
b) Nodo sepadre:
desprenden
Nodolos siguientes
del conceptos:
cual parten otros nodos (A, D, E, F, G, J). Por ejemplo:
“E” es padre de “I” y “J”.
a) Nodoc)raíz: Primer
Nodo nodo,
hijo: sin predecesor
Nodo que sucede (A).
a otro. Por ejemplo “H” es hijo de “D”.
d) Nodos hermanos: Nodos que comparten el mismo padre. Por ejemplo “K”, “L”
b) Nodo padre:
y “M”Nodo
sondel cual parten otros nodos (A, D, E, F, G, J). Por ejemplo: “E” es padre de “I” y “J”.
hermanos.
e) Hojas: Nodos sin hijos. Por ejemplo “B”, “C”, “H”, “I”, etc.
c) Nodo hijo: Nodo que sucede a otro. Por ejemplo “H” es hijo de “D”.

d) Nodos hermanos: Nodos que comparten el mismo padre. Por ejemplo “K”, “L” y “M” son hermanos.
De igual forma se diferencia entre:
e) Hojas:a)Nodos
Ruta:sinSecuencia de nodos
hijos. Por ejemplo “B”,que unen
, “I”otros
“C”, “H” , etc. dos. Por ejemplo “A”, “E”, “J”, “Q”
es una ruta. Note que existe solamente una ruta desde la raíz de un árbol a
De igual forma una determinada
se diferencia entre: hoja.
b) Longitud: Es el número de segmentos en una ruta.
a) Ruta: Secuencia de nodos que unen otros dos. Por ejemplo “A”, “E”, “J”, “Q” es una ruta. Note que existe
solamente una ruta desde la raíz de un árbol a una determinada hoja.

b) Longitud: Es el número de segmentos en una ruta.

c) Profundidad: Longitud desde la raíz a un determinado nodo.

d)  ltura: Longitud de la ruta más larga desde un determinado nodo a una hoja. Note que la altura de un árbol
A
es igual a la altura de la raíz.

89
c) Profundidad: Longitud desde la raíz a un determinado nodo.
d) Altura: Longitud de la ruta más larga desde un determinado nodo a una hoja.
Note que la altura de un árbol es igual a la altura de la raíz.

2. Implementación de árboles

Ya que un árbol es un tipo de grafo, su implementación (en C++) también se basará


en estructuras (struct), aunque con una lógica distinta.
2. Implementación de árboles
A primera vista la lógica indica que el árbol se creará únicamente haciendo que un
UNIDAD III

Ya que undeterminado nodo


árbol es un tipo apuntesuaimplementación
de grafo, cada uno de sus nodostambién
(en C++) hijos; se
sinbasará
embargo, esto no (struct), aun-
en estructuras
necesariamente es así, ya que no es posible conocer con antelación la cantidad de
que con una lógica distinta.
los mismos. La solución es emplear una lista enlazada en la que cada nodo posea
A primeratres campos:
vista la lógicadato,
indicaprimer_hijo
que el árboly se
hermano_siguiente.
creará únicamente Observe
haciendola figura
que 46.
un determinado nodo apunte a
cada uno de sus nodos hijos; sin embargo, esto no necesariamente es así, ya que no es posible conocer con
Figura
antelación 46. de
la cantidad Representación del árbol
los mismos. La solución de la una
es emplear figura 25 basado
lista enlazada en cada
en la que nodos
nodo posea tres
primer_hijo y siguiente_hermano
campos: dato, primer_hijo y hermano_siguiente. Observe la figura 46.

A
Tema n.º 3

B C D E F G
N

H I J K L M N

P Q

Figura 46.
Tomada deRepresentación del árbol
Data structures and de la figura 25
algorithm basado in
analysis enC++,
nodos por
primer_hijo
Weiss,y2014,
siguiente_hermano
p. 123.
Tomada de Data structures and algorithm analysis in C++, por Weiss,2014, p. 123

Las flechas que se dirigen hacia abajo representan punteros hacia el primer_hijo de cada nodo, mientras que las
Las flechas que se dirigen hacia abajo representan punteros hacia el primer_hijo de
que se dirigen hacia la derecha representan su siguiente_hermano.
cada nodo, mientras que las que se dirigen hacia la derecha representan su
siguiente_hermano.
En C++ la estructura que representa cada nodo es:
En C++ la estructura que representa cada nodo es:
struct NodoArbol
{ struct NodoArbol
int
{ dato;
NodoArbol *primer_hijo;
int dato;
NodoArbol *sgte_hmano;
NodoArbol *primer_hijo;
}; NodoArbol *sgte_hmano;
};
Las reglas para crear el árbol e insertar/eliminar nodos serán las mismas que las empleadas para las listas enla-
zadas. El Las reglasprincipal
programa para crear el árbol
deberá invocare recursivamente
insertar/eliminar
a lanodos serán
estructura las mismas
(struct) a medidaque las
se agreguen nuevos
empleadas para las
3. Árbol binario
elementos al árbol. listas enlazadas. El programa principal deberá invocar
recursivamente a la estructura (struct) a medida se agreguen nuevos elementos al
árbol.En computación existe un tipo de árbol muy utilizado en la solución de diversos tipos
de problemas: el árbol binario. Su particularidad radica en que cada nodo puede tener
3. Árbol binario
a lo más dos nodos hijos, de ahí la denominación de “bi-nario”.
En computación existe un tipo de árbol muy utilizado en la solución de diversos tipos de problemas: el árbol
De forma genérica cada nodo representa una raíz (r), y sus nodos descendientes se
binario. Su particularidad radica
llaman “árbol en que(Acada
izquierdo” nodo derecho”
iz) y “árbol puede tener
(Ade) arespectivamente
lo más dos nodos
(verhijos,
figurade ahí la denominación
47).
de “bi-nario”.
De forma genérica cada
Figura nodo
47. representa una
Representación raíz (r), y de
simbólica susun
nodos descendientes
árbol se llaman
binario (izquierda) “árbol izquierdo” (Aiz)
y un
ejemplo del mismo (derecha)
y “árbol derecho” (Ade) respectivamente (ver figura 47).

r A

B C

Ai A F
D E
zq de

Fuente: Elaboración propia


Figura 47. Representación simbólica de un árbol binario (izquierda) y un ejemplo del mismo (derecha)
90 Fuente: Elaboración propia
3.1. Implementación de árboles binarios
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

3.1. Implementación de árboles binarios

UNIDAD III
Ya que en este tipo de árbol se conoce de antemano la cantidad de nodos hijos, la estructura (struct) para su
implementación es la siguiente:

struct NodoBinario
{
int dato;
NodoBinario *izquierdo;
NodoBinario *Derecho;
};

Tema n.º 3
3.2. Aplicación de árboles binarios
Este manual puntualizará en las aplicaciones:

a) Representación de expresiones matemáticas

b) Búsqueda

3.2.1. Representación de expresiones matemáticas

Esta aplicación de los árboles binarios, propia del diseño de compiladores, consiste en representar jerárquica-
mente una secuencia de caracteres que constituya una operación matemática. La representación finalizada se
denomina árbol de expresión. La figura 48 muestra un ejemplo.
Figura 48. Ejemplo de árbol de expresión y su equivalente matemático

Expresión equivalente:
(a+b*c) + ((d*e+f)*g)

Tomada de Data structures and algorithm analysis in C++, por Weiss, 2014, p.
129. Figura 48. Ejemplo de árbol de expresión y su equivalente matemático
Tomada de Data structures and algorithm analysis in C++, por Weiss, 2014, p. 129.
Para crear un programa capaz de construir este tipo de árboles es
imprescindible que antes se transforme la expresión a su representación
Para crear un programa capaz de construir este tipo de árboles es imprescindible que antes se transforme la ex-
posfija. Para ello, partiendo de la raíz, se visualiza recursivamente el árbol
presión a su representación posfija. Para ello, partiendo de la raíz, se visualiza recursivamente el árbol izquierdo,
izquierdo, luego el árbol derecho y después el operador.
luego el árbol derecho y después el operador.
Para el árbol de la figura 48, la expresión posfija equivalente es la siguiente:
Para el árbol de la figura 48, la expresión posfija equivalente es la siguiente:
abc*+de*f+g*+
abc*+de*f+g*+
El algoritmo para crear un árbol a partir de una expresión posfija se muestra
a continuación:
El algoritmo para crear un árbol a partir de una expresión posfija se muestra a continuación:

• • Leer
Leer la expresión la expresión
posfija símbolo porposfija símbolo por símbolo.
símbolo.
• Si el símbolo es un operando, se crea un nodo e inmediatamente un
apuntador a él en una pila.
• Si el símbolo es un operador, se crea el nodo para tal y, de los operandos
que aguardan en la pila, se copian sus direcciones en el nodo creado. 91
Entonces, estas direcciones son eliminadas de la pila, quedando solo una
abc*+de*f+g*+

El algoritmo para crear un árbol a partir de una expresión posfija se muestra


a continuación:

• Leer la expresión posfija símbolo por símbolo.


• Si el símbolo es un operando, se crea un nodo e inmediatamente un
apuntador a él en una pila.
• • SiSi el
el símbolo
símbolo es
esun
unoperando,
operador, sese
crea un nodo
crea e inmediatamente
el nodo para tal y, de un losapuntador
operandos a él en una pila.
que aguardan en la pila, se copian sus direcciones en el nodo creado.
• Si el símbolo es undirecciones
operador, sesoncreaeliminadas
el nodo parade
tal la
y, de losquedando
operandos que
soloaguardan en la pila, se copian
UNIDAD III

Entonces, estas pila, una


sus direcciones en el nodo
que apunta hacia el operador. creado. Entonces, estas direcciones son eliminadas de la pila, quedando solo
una que apunta hacia el operador.
A continuación, un ejemplo del algoritmo: (el ejemplo y los gráficos fueron
A continuación,
extraídos deun ejemplo
Weiss, del algoritmo:
1995, (el ejemplo y los gráficos fueron extraídos de Weiss, 1995, p. 102-104)
p. 102-104)

Expresión:
Expresión:ab+ a cb d+e c+d* e* + * *
• Leer símbolo: “a”. Como se trata de un operando, se agrega un puntero
• Leer símbolo: “a”. Como se trata de un operando, se agrega un puntero hacia él en la pila.
hacia él en la pila.
Tema n.º 3

• Leer siguiente símbolo: “b”. Como se trata de un operando, se agrega un


• Leer siguiente símbolo: “b”. Como se trata de un operando, se agrega un puntero hacia él en la pila.
puntero hacia él en la pila.

• Leer siguiente símbolo: “+”. Como se trata de un operador, se copian los


• Leer siguiente
punteros en susímbolo: “+”. Como
respectivo nodo se trata la
desde depila.
un operador, se copian
Entonces, los punteros
se eliminan tales en su respectivo nodo
desde la pila.de
direcciones Entonces, se eliminan solo
la pila, quedando tales una
direcciones
hacia eldeúltimo
la pila, nodo
quedando solo una hacia el último nodo
creado.
creado.

• Leer símbolos siguientes: “c”, “d” y “e”. Todos operandos.


• Leer símbolos siguientes: “c”, “d” y “e”. Todos operandos.
• Leer símbolos siguientes: “c”, “d” y “e”. Todos operandos.

• Leer símbolo siguiente: “+”. Se trata de un operador.

• Leer símbolo siguiente: “+”. Se trata de un operador.

92
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

• • Leer
Leer símbolo
símbolo siguiente:
siguiente: “+”.de
“+”. Se trata Seuntrata de un operador.
operador.
• Leer símbolo siguiente: “+”. Se trata de un operador.

UNIDAD III
Tema n.º 3
• Leer símbolo siguiente: “*”.
• Leer
• símbolo siguiente:
Leer símbolo “*”.
siguiente: “*”.

• Leer símbolo siguiente: “*”.


• Leer símbolo siguiente: “*”.

3.2.2. Búsquedas en árboles binarios


3.2.2. Búsquedas en árboles binarios
Para recorrer
Para recorrer un árbolun árbolesbinario
binario es que
necesario necesario que
cada uno decada uno de
sus nodos sus nodos
posea un valorposea
llave único, el cual puede
un valor llave único, el cual puede ser un dato de tipo entero u otro más
ser un dato de tipo entero u otro más complejo.
complejo.
La propiedad que convierte un árbol binario en un árbol binario de búsqueda, es que para cada nodo todos los
Ladepropiedad
valores su subárbol que convierte
izquierdo un árbol
son menores que él,binario
mientrasenqueun
los árbol binario
del subárbol de son mayores. La
derecho
búsqueda, es que para cada nodo todos los valores de su subárbol izquierdo
diferencia se muestra gráficamente en la figura 49.
son menores que él, mientras que los del subárbol derecho son mayores.
La diferencia se muestra gráficamente en la figura 49.

Figura 49. Árbol binario de búsqueda (izquierda) y árbol binario


93
genérico (derecha)
6 6
complejo.

La propiedad que convierte un árbol binario en un árbol binario de


búsqueda, es que para cada nodo todos los valores de su subárbol izquierdo
son menores que él, mientras que los del subárbol derecho son mayores.
La diferencia se muestra gráficamente en la figura 49.

Figura 49. Árbol binario de búsqueda (izquierda) y árbol binario


genérico (derecha)
6 6
UNIDAD III

2 8 2 8

1 4 1 4

3 3 7
Tema n.º 3

Tomada de Data structures and algorithm analysis in C++ Weiss, 2014,


p. 132.
Figura 49. Árbol binario de búsqueda (izquierda) y árbol binario genérico (derecha)
Tomada de Data structures and algorithm analysis in C++. Weiss, 2014, p. 132
El árbol de la derecha no puede considerarse como uno de búsqueda debido
El árbol de la derecha no puede
al nodo 7, yaconsiderarse
que si biencomo uno la
cumple depropiedad
búsqueda debido al nodo
respecto a su7, nodo
ya quepadre
si bien“4”
cumple la
propiedad respecto (es mayor
a su nodo y posicionado
padre a la derecha),
“4” (es mayor y posicionadono aes
la así respecto
derecha), no esalasí
nodo raíz “6”;
respecto al nodo raíz
“6”; al encontrarse alelencontrarse
nodo 7 en el el nodo 7izquierdo
subárbol en el subárbol izquierdo
de este debería ser de esteque
menor debería
la raíz. ser menor
que la raíz.
Proceso de búsqueda
Proceso de búsqueda
Al realizar la búsqueda de una determinada llave, el resultado debe ser el apuntador hacia el nodo que la posee,
o null si no existe tal
Al nodo. Weiss
realizar (1995, p. 106)
la búsqueda de propone el siguiente algoritmo
una determinada llave, el para esta tarea:
resultado debe ser el
apuntador hacia el nodo que la posee, o null si no existe tal nodo. Weiss
function(1995,buscar (x:propone
p. 106) integer; A: Árbol_de_búsqueda):
el siguiente algoritmo para estaap_árbol;
tarea:
begin
if A = null then
buscar := null;
else
if x < A^.elemento then
buscar := buscar(x, A^.izquierdo)
else
if x > A^.elemento then
buscar := buscar(x, A^.derecho)
else
buscar := A;
end; [buscar]

Programa 3.1

Su correspondiente implementación y un ejemplo de cómo usar la función buscar para insertar un nuevo ele-
mento al árbol, se muestra en el programa 3.2.

struct nodoArbol
{
int dato;
nodoArbol *a_izq;
nodoArbol *a_der;
};

typedef struct nodoArbol *TArbol;

nodoArbol *buscar(TArbol &arbol, int pDato)


{
if (arbol== NULL)
{return NULL;}

94
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

else if (pDato == arbol->dato)


{return arbol;}

UNIDAD III
else if (pDato < arbol->dato) // Si es menor buscar a la izquierda
{buscar(arbol->a_izq, pDato);}

else if (pDato > arbol->dato) // Si es mayor buscar a la derecha


{buscar(arbol->a_der, pDato);}
}

void insertarEnNodo(TArbol &arbol, int pNodo, int pDato, char pLado)

Tema n.º 3
{
// Capturar dirección del nodo buscado
nodoArbol *nodoBuscado;
nodoBuscado = buscar(arbol, pNodo);

if (nodoBuscado == NULL)
cout<<”El nodo no existe”<<endl;
else
{
// Crear nuevo
nodoArbol *nuevonodo;
nuevonodo = new struct nodoArbol;

nuevonodo->dato = pDato;
nuevonodo->a_izq = NULL;
nuevonodo->a_der = NULL;

if (pLado == ‘I’)
nodoBuscado->a_izq = nuevonodo;
else
nodoBuscado->a_der = nuevonodo;
}
}

void imprimir(TArbol &arbol, int n)


{
if(arbol==NULL)
return;

imprimir(arbol->a_der, n+1);

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


cout<<” “;

cout<< arbol->dato <<endl;

imprimir(arbol->a_izq, n+1);
}

Programa 3.2

Es preciso aclarar que el procedimiento de inserción del programa 3.2 solo busca el nodo solicitado y, si existe,
a continuación inserta el nuevo nodo en la posición indicada (izquierda o derecha); no realiza la tarea de validar
si el dato infringe la propiedad de un árbol binario de búsqueda (ver numeral 3.2.2), por lo que esta tarea se le
deja a usted, estimado estudiante.

95
Asimismo, una adaptación de esta función de búsqueda permite devolver los valores mínimo y máximo de todo
el árbol: el menor valor estará ubicado en el último nodo a la izquierda, mientras que el mayor estará en el último
UNIDAD III

nodo a la derecha; por lo tanto, el programa deberá simplemente recorrer el árbol por alguno de estos lados
dependiendo del dato deseado. Observe el programa 3.3

int buscar_minimo(TArbol &arbol)


{
int valor_minimo;
if (arbol == NULL)
valor_minimo = -1;
else if (arbol->a_izq == NULL)
Tema n.º 3

valor_minimo = arbol->dato;
else
valor_minimo = buscar_minimo(arbol->a_izq);
return valor_minimo;
}

int buscar_maximo(TArbol &arbol)


{
int valor_maximo;
if (arbol == NULL)
valor_maximo = -1;
else if (arbol->a_der == NULL)
valor_maximo = arbol->dato;
else
valor_maximo = buscar_minimo(arbol->a_der);
return valor_maximo;
}

Programa 3.3

Finalmente, el programa 3.4 ilustra cómo imprimir los valores de los nodos tomando en cuenta los tres posibles
tipos de ordenamiento: pre-orden (prefija), en orden y pos-orden (posfija).

void preOrden(TArbol arbol)


{
if(arbol!=NULL)
{
cout << arbol->dato <<” “;
preOrden(arbol->a_izq);
preOrden(arbol->a_der);
}
}

void enOrden(TArbol arbol)


{
if(arbol!=NULL)
{
enOrden(arbol->a_izq);
cout << arbol->a_dato<< “ “;
enOrden(arbol->a_der);
}
}

void postOrden(TArbol arbol)


{

96
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

if(arbol!=NULL)
{
postOrden(arbol->a_izq);

UNIDAD III
postOrden(arbol->a_der);
cout << arbol->dato<< “ “;
}
}

Programa 3.4. Adaptado del blog “Bloguando sobre programación”. Recuperado de http://blog.martincruz.me/2012/11/arbo-
les-binarios-de-busqueda-c.html

Tema n.º 3
Lectura seleccionada n.º 3

Los grafos
Esta lectura le permitirá conocer la situación real que conllevó al origen de la teoría de grafos, así como su vasto
campo de aplicación tanto en el campo de la ingeniería como de diversas ciencias.

García, F. (2004). La magia de los grafos. Revista de La Asociación de Autores Científico-Técnicos y Académicos,
34, pp. 31–47. Disponible en el aula virtual.

Actividad N.º 3
Foro de discusión sobre grafos

Instrucciones:

a) Escriba un programa para efectuar la ordenación topológica de un grafo (numeral 3.1)

b) Ingrese al foro y participe respondiendo las siguientes preguntas:

Si se usa una pila en vez de una cola para el algoritmo de ordenación topológica, ¿se obtiene una ordenación
topológica diferente? ¿En qué aspectos?

Actividad N.º 4
Foro de discusión sobre árboles

Instrucciones:

a) Ingrese al foro y participe respondiendo la siguiente pregunta:

Si se optara por implementar un árbol binario mediante listas enlazadas (estructuras de dos campos: dato, punte-
ro), en la que cada nodo almacenara un carácter de su expresión posfija equivalente, ¿qué ventajas y desventajas
ofrecería a las operaciones de búsqueda e inserción de datos? (Mencione 2 de cada una).

97
Glosario de la Unidad III
UNIDAD III

B
Binario. Compuesto de dos elementos, unidades o guarismos. (RAE, 2016)

N
Tema n.º 3

Nodo. En un esquema o representación gráfica en forma de árbol, cada uno de los puntos de origen de las dis-
tintas ramificaciones. (RAE, 2016)

P
Ponderar (de Grafo ponderado). Determinar el peso de algo. (RAE, 2016)

S
Struct (de C++). La palabra clave struct define un tipo de estructura o una variable de un tipo de estructura.
(MSDN, Microsoft)

T
 opología. Rama de las matemáticas que trata especialmente de la continuidad y de otros conceptos más genera-
T
les originados de ella, como las propiedades de las figuras con independencia de su tamaño o forma. (RAE, 2016)

Bibliografía de la Unidad III


Aho, A., Ullman, J. & Hopcroft, (1983). Data Structures and algorithms. Nueva Delhi: Pearson Education.

Asencio, A., Quevedo, E. & López, R. (s/f). Apuntes elaborados. Tema 9: Grafos [en línea]. España: Universidad
de las Palmas de Gran Canaria. Disponible en http://www.iuma.ulpgc.es/users/jmiranda/docencia/progra-
macion/Tema9_ne.pdf

Cairo, O. & Guardati, S. (2010). Estructuras de datos (3.ª ed.). México: Editorial McGraw Hill.

Charles, S. (2009). Python para informáticos: Explorando la información.

Cruz, D. (s/f). Apuntes de la asignatura: Estructura de datos [diapositiva]. México: Tecnológico de Estudios Supe-
riores de Ecatepec. Disponible en: http://myslide.es/documents/manual-estructura-de-datos.html

Cruz, M. (s.f.). Arboles Binarios de Busqueda en C++. Recorrido por niveles (Amplitud) [Blog post]. http://blog.
martincruz.me/2012/11/arboles-binarios-de-busqueda-c.html

García F. (s.f.). La magia de los grafos. Autores científico-técnicos y académicos. Disponible en http://www.acta.
es/medios/articulos/matematicas/034029.pdf

98
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Ignacio, J., & Zahonero, I. (2003). Programación en C. Metodología, Algoritmos y estructura de datos. Málaga,
España: Editorial McGraw Hill.

UNIDAD III
Mehta, D. P., & Sahni, S. (2005). Handbook of Data Structures and Applications. Florida, U.S.A.: Editorial Chap-
man & Hall/CRC. Disponibe en http://www.e-reading.club/bookreader.php/138822/Mehta_-_Handbook_of_
Data_Structures_and_Applications.pdf

Pérez, J. (2004). Capítulo 6. Matrices y determinantes. España: Instituto Nacional de Tecnologías Educativas y
de Formación del Profesorado. Disponible en: http://sauce.pntic.mec.es/~jpeo0002/Archivos/PDF/T06.pdf

Real Academia de la Lengua Española. (2016). Disponible en: http://www.rae.es/

Tema n.º 3
Sahni, S. (s.f.). Data structures, algorithms, and applications in C++. Hyderabad, India: Universities Press.

Weiss, M. (1995). Estructura de datos y algoritmos. EE. UU: Addison-Wesley Iberoamericana.

Weiss, M. (2014). Data structures and algorithm analysis in C++. U.S.A.: Pearson Education. Dispoible en http://
www.uoitc.edu.iq/images/documents/informatics-institute/Competitive_exam/DataStructures.pdf

99
Autoevaluación N.º3
UNIDAD III

1. ¿Qué es una pila?

a. Estructura de tipo LIFO

b. Estructura de tipo FOFI


Tema n.º 3

c. Estructura de tipo FIFO

d. Estructura de tipo FOLI

2. ¿Qué es una cola?

a. Estructura de tipo LIFO

b. Estructura de tipo FOFI

c. Estructura de tipo FIFO

d. Estructura de tipo FOLI

3. Una pila o cola se pueden implementar con los siguientes elementos de programación:

i) Estructuras (struct)

ii) Matrices

iii) Arreglos

iv) Punteros

a. Solo iii y iv

b. Solo iii

c. Solo i, iii, iv

d. Todos

4. Emplea punteros para su implementación:

a. Lista enlazada

b. Arreglos

c. Matrices

d. Ninguno

100
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

5. Es un conjunto finito de aristas y segmentos que los unen:

a. Matriz

UNIDAD III
b. Lista

c. Árbol

d. Grafo

6. La instrucción typedef de C++ permite

Tema n.º 3
a. Crear variables de diferentes tipos

b. Crear tipos de datos

c. Crear datos pesonalizados

d. Crear un alias para tipos de datos

7. Los componentes de un nodo (struct) de árbol binario son

a. Dato, puntero

b. Puntero, dato, puntero

c. Dato, variable, puntero

d. Puntero, variable, arreglo

8. La cantidad de segmentos de un árbol binario, respecto al número vértices es

a. Vértices + 1

b. Vértices–1

c. Vértices / segmentos

d. Vértices / caminos

9. Correlacione las propiedades de los árboles con su definición

i) Ruta w. Longitud desde la raíz a un determinado nodo


ii) Longitud x. Secuencia de nodos que unen otros dos
iii) Profundidad y. Longitud de la ruta más larga desde un determinado nodo a una hoja
iv) Altura z. Es el número de segmentos en una ruta

a. i-z, ii-x, iii-w, iv-y

b. i-x, ii-z, iii-y, iv-w

c. i-x, ii-z, iii-w, iv-y

101
d. i-x, ii-w, iii-y, iv-z

10. Un árbol binario de búsqueda se diferencia de un árbol binario genérico en que


UNIDAD III

a. Todos los elementos están ordenados desde la raíz hacia las hojas.

b. Todos los elementos están ordenados de tal forma que los menores queden a la izquierda y los mayo-
res a la derecha.

c. Todos los elementos están ordenados según su valor.

d. Todos los elementos están ordenados desde las hojas hacia la raíz.
Tema n.º 3

102
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

UNIDAD IV

Organización de datos y archivos

DIAGRAMA DE ORGANIZACIÓN

CONTENIDOS

AUTOEVALUACIÓN EJEMPLOS

BIBLIOGRAFÍA ACTIVIDADES

103
ORGANIZACIÓN DE LOS APRENDIZAJES

Resultado de aprendizaje de la Unidad IV:


Al finalizar la unidad, el estudiante será capaz de reconocer la organización de datos y archivos a través del estudio de casos.

CONOCIMIENTOS HABILIDADES ACTITUDES


Tema n.º 1: Tablas Hash. • Analiza y desarrolla algoritmos con • Demuestra perseverancia y es-
Tema nº 2: Modelo de datos relacio- Hash. fuerzo durante el desarrollo de los
nal. Actividad N.º 1 ejercicios.

Tema n.º 3: Organización de archivos. Foro de discusión • Toma conciencia de la importancia


de la asignatura en su formación
Lectura seleccionada 1: Sistemas de • Analiza las herramientas de los mo- profesional.
bases de datos frente a sistemas de delos de datos relacionales y los
archivos aplica en las diversas situaciones • Valora las relaciones entre sus
de la vida real. compañeros.
Autoevaluación de la Unidad IV
• Identifica las ventajas del uso de la
organización de archivos.
• Identifica datos relacionales para
un caso de estudios.
Actividad N.º 2
Foro de discusión

104
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Tema N.º 1: Tablas Hash

La velocidad de inserción y búsqueda de un determinado dato en un arreglo es


Tema N.º 1:
directamente proporcional al tamaño de este último; es decir, mientras más grande
sea el arreglo, mayor será el tiempo que se necesite para alguna de estas actividades.

UNIDAD IV
Tablas Hash
Frente a este problema, surgen las tablas Hash, las cuales permiten acceder de forma
directa -y por consiguiente rápida- a cualquiera de sus elementos; por tanto,
representan una gran ventaja cuando se tiene que trabajar con grandes cantidades
La velocidaddededatos.
inserción y búsqueda de un determinado dato en un arreglo es directamente proporcional al
tamaño de este último; es decir, mientras más grande sea el arreglo, mayor será el tiempo que se necesite para
1. Definición
alguna de estas actividades. Frente a este problema, surgen las tablas Hash, las cuales permiten acceder de
forma directa -y por consiguiente rápida- a cualquiera de sus elementos; por tanto, representan una gran ventaja
“Unaque
cuando se tiene tabla Hash
trabajar cones una cantidades
grandes estructuradede datos que permite almacenar objetos (o
datos.

Tema N.º 1
registros) de forma tal que una búsqueda determinada tenga un tiempo de
recuperación constante, sin importar la cantidad de elementos que tenga la tabla”.
(Frittelli, s/f, p. 1)
1. Definición
En términos técnicos, una tabla Hash o tabla de dispersión está compuesta por un
arreglo
“Una tabla Hash y unestructura
es una conjuntodede operaciones
datos matemáticas
que permite (llamada
almacenar objetos funcióndedeforma
(o registros) dispersión)
tal que una
que determinan la posición donde se insertará, eliminará o buscará un elemento
búsqueda determinada tenga un tiempo de recuperación constante, sin importar la cantidad de elementos enque
particular.
tenga la tabla”. (Frittelli, s/f, p. 1)
En términosPor ejemplo,
técnicos, comoHash
una tabla se observa
o tabla deen la figuraestá
dispersión 50,compuesta
la funciónpor
deundispersión recibe
arreglo y un el dato
conjunto de ope-
que desea(llamada
raciones matemáticas insertarse
funciónendeeldispersión)
arreglo (momento en el
que determinan que el donde
la posición dato pasa a llamarse
se insertará, eliminará
o buscará un“Llave”) y, en
elemento luego de aplicarle una serie de operaciones, devuelve el índice donde será
particular.
almacenado.
Por ejemplo, como se observa en la figura 50, la función de dispersión recibe el dato que desea insertarse en el
arreglo (momento
Figuraen50.el que el dato pasa
Proceso de ainserción
llamarse “Llave”)
de uny, luego
datodeempleando
aplicarle una serie
unadefunción
operaciones,
de de-
vuelve el índice donde
dispersión será almacenado.

Arreglo

Índice Valor

Índice 0
generado 1
Función de dispersión
Dato o llave 2
f(x)
3

N
Elaboración propia.
Figura 50. Proceso de inserción de un dato empleando una función de dispersión
Concretamente, necesitamos una Elaboración
funciónpropia.
que transforme llaves (números o cadenas)
en enteros en el rango [0...M-1], donde M representa el número de registros del
arreglo.
Concretamente, necesitamos una función que transforme llaves (números o cadenas) en enteros en el rango
[0...M-1], donde M representa el número de registros del arreglo.
Por supuesto, las funciones de dispersión deberán ser implementadas de tal forma
Por supuesto, lasdistribuyan
que funciones dehomogéneamente
dispersión deberán ser lasimplementadas de tal
llaves entre las forma(Allen,
celdas que distribuyan
1995, p. homogénea-
156);
es decir,
mente las llaves entreabarcar
las celdastodo el 1995,
(Allen, arreglo y evitar
p. 156); las colisiones
es decir, o,elen
abarcar todo palabras
arreglo sencillas,
y evitar que o,
las colisiones
en palabras dos llavesque
sencillas, nodos
caigan
llavesennolacaigan
misma posición.
en la misma posición.

2. Función de dispersión

2. Función a)
de Para
dispersión
llaves tipo entero:

Método de la división: La función de dispersión devuelve el residuo de


• entero:
a) Para llaves tipo
dividir la llave por el número casillas que tiene la tabla. Por ejemplo, si la
• Método de latabla Hash
división: es de tamaño
La función 12 y la
de dispersión llave aelinsertar
devuelve residuo es
de 100,
dividirentonces:
la llave por el número
casillas que tiene la tabla. Por ejemplo, si la tabla Hash es de tamaño 12 y la llave a insertar es 100,
entonces:

105
ℎ(𝑘𝑘𝑘𝑘) = 𝑘𝑘𝑘𝑘 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 𝑚𝑚𝑚𝑚
ℎ(100) = 100 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 12 = 4
Por lo tanto, el valor 100 (la llave) será insertado en la posición 4 del
arreglo.

De acuerdo con López (2002), esℎnecesario tomar


(𝑘𝑘𝑘𝑘) = 𝑘𝑘𝑘𝑘 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 𝑚𝑚𝑚𝑚 en cuenta las siguientes
recomendaciones para el ℎvalor de “m” cuando
(100) = 100 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 12 = 4 se use el método de la
división:
UNIDAD IV

Por lo tanto, el valor 100 (la llave) será insertado en la posición 4 del
- arreglo.
Por lo tanto, elEvitar que(lasea
valor 100 unserá
llave) número potencia
insertado de 2. 4 del arreglo.
en la posición
- Buenos valores son números primos y lejanos a potencias de 2.
De acuerdo con López
• Método (2002),
de la es necesarioSu
multiplicación: tomar en cuenta
algoritmo de las siguientesserecomendaciones
operación resume en dospara el valor
De acuerdo con López (2002), es necesario tomar en cuenta las siguientes
pasos:
de “m” cuando se use el método de la división:
recomendaciones para el valor de “m” cuando se use el método de la
- Evitar quedivisión:
sea un número potencia de 2.
Primero se multiplica
- Evitar que sea un la llave
número k por una constante
potencia de 2. A en el rango ] 0,1 [ y
- Buenosse valores
extrae son
la números
parte primos y lejanos
fraccionaria del a potencias
resultado. Luego, de 2.se multiplica este valor
- Buenos valores son números primos y lejanos a potencias de 2.
•por mde
• Método y se
Método toma
de la parte
la multiplicación: Suentera
la multiplicación: algoritmo Su delalgoritmo
resultado.
de operación dese operación
resume ensedosresume
pasos: en dos
Tema N.º 1

pasos:
Primero se multiplica la llave k por una constante A en el rango ] 0,1 [ y se extrae la parte fraccio-
naria Primero
del resultado. Luego, se la
se multiplica multiplicallave keste por valor
una por
constantem y se tomaA enlaelparte
rangoentera del[resultado.
] 0,1 y
Por ejemplo,
se extrae para
la parteuna llave
fraccionaria m=10000,
Por ejemplo, para una llave m=10000, k=123456 y A=0.618033… del k=123456
resultado. Luego, y A=0.618033…
se multiplica este valor
por m y se toma la parte entera del resultado.
ℎ(𝑘𝑘𝑘𝑘) = 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒(𝑚𝑚𝑚𝑚 ∗ �(𝑘𝑘𝑘𝑘𝐴𝐴𝐴𝐴 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 1)�)
ℎ(123456) = 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒�10000 ∗ (123456 ∗ 0.618033 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 1)�
ℎ(123456) = 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒(10000 ∗ (76300.0041151 … 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 1))
Por ejemplo,ℎpara(123456
una )= llave 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒
m=10000, (10000 ∗ 0.0041151
k=123456 … )y=A=0.618033…
41

Entonces, el valor 10000 ℎserá (𝑘𝑘𝑘𝑘) =insertado 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒(𝑚𝑚𝑚𝑚 ∗en la posición


�(𝑘𝑘𝑘𝑘𝐴𝐴𝐴𝐴 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 1)�) 41 del arreglo.
Entonces, el valor 10000 será insertado
ℎ(123456 en la posición
) = 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒�10000 ∗ (12345641 del∗ arreglo. 0.618033 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 1)�
Recuerda: ℎ 123456 = 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒(10000 ∗ 76300.0041151 … 𝑚𝑚𝑚𝑚𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 1))
( ) (
Mod es un operador que devuelve el residuo
ℎ(123456 ) = 𝑒𝑒𝑒𝑒𝑛𝑛𝑛𝑛𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒𝑒 de(10000 una división.
∗ 0.0041151 … ) = 41
Recuerda:
b) Para
Mod llaves
es tipo cadena:
Entonces, el valor
un operador 10000 el
que devuelve será insertado
residuo de unaen la posición 41 del arreglo.
división.

Una opción es sumar el código ASCII de cada uno de sus caracteres. El


Recuerda:
b) Para llaves tipo cadena:
Mod siguiente algoritmo
es un operador queilustra estaeloperación:
devuelve residuo de una división.
 na opción
U es sumar
function el código ASCII
dispersión de cada
(llave: uno de sus caracteres.
tipo_cadena; El siguiente
tamaño_llave: algoritmo ilustra esta
integer):
b) Para llaves tipo cadena:
operación:
ÍNDICE;
var val_dispersión, j: integer
function Una opción es sumar
dispersión
begin (llave: el tipo_cadena;
código ASCII de cada uno de integer):
tamaño_llave: sus caracteres.
ÍNDICE;El
siguiente
var val_dispersión, algoritmo j:ilustra
integeresta operación:
val_dipersión := codASCII(llave[1]);
begin for j:=2 to tamaño_llave do
function val_dispersión
val_dipersión dispersión (llave:
:= codASCII(llave[1]); tipo_cadena; +tamaño_llave:
:= val_dispersión codASCII(llave[j]); integer):
ÍNDICE;
for j:=2 dispersión := val_dispersion
to tamaño_llave do mod tamaño;
end var val_dispersión,
val_dispersión j: integer + codASCII(llave[j]);
:= val_dispersión
begin
dispersión := val_dispersion mod tamaño;
val_dipersión := codASCII(llave[1]);
Aunque
end esta función opera con rapidez, no es una buena alternativa cuando
for j:=2 to tamaño_llave do
se trata de arreglos grandes. Por :=
val_dispersión ejemplo, si se tiene un
val_dispersión + arreglo un arreglo de
codASCII(llave[j]);
tamaño 10007 y con palabras de 8 caracteres
dispersión := val_dispersion mod tamaño; como máximo, entonces el
Aunquemayor índice opera
esta end
función esperado será (122*8)=976,
con rapidez, puesto que
no es una buena alternativa el valor
cuando se tratamás alto grandes.
de arreglos
devuelto por codASCII será 122 (código de la letra zeta); por lo
Por ejemplo, si se tiene un arreglo un arreglo de tamaño 10007 y con palabras de 8 caracteres como tanto,
quedarán
máximo, entonces
Aunque laselcasillas
esta mayor
función 977
índice a
opera10007
esperado vacías.
con será (122*8)=976,
rapidez, no es una puesto que alternativa
buena el valor más alto devuelto por
cuando
codASCIIseserá 122de
trata (código de lagrandes.
arreglos letra zeta);Por
porejemplo,
lo tanto, quedarán las un
si se tiene casillas 977 un
arreglo a 10007 vacías.
arreglo de
Ahora observe
tamaño 10007y analice
y con elpalabras
siguiente dealgoritmo:
8 caracteres como máximo, entonces el
Ahora observe
mayory analice
índice elesperado
siguiente algoritmo:
será (122*8)=976, puesto que el valor más alto
devuelto por codASCII será 122 (código de la letra zeta); por lo tanto,
function dispersión (llave: tipo_cadena; tamaño_llave: integer): ÍNDICE;
quedarán las casillas 977 a 10007 vacías.
begin
dispersión := (codASCII(llave[1])+codASCII(llave[2])*27+codASCII(l-
Ahora observe y analice el siguiente algoritmo:
lave[3])*729) mod tamaño;

106
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

En este caso, para una llave de 3 caracteres como máximo se intenta que el valor generado por la función
de dispersión no pierda representatividad (tienda a 0) cuando la cadena tenga 1 o 2 caracteres (menor

UNIDAD IV
que 3). Para evitar ello, se multiplica cada posición con una potencia de 27 (que es el número de letras del
abecedario).

llave[1] * 270 + llave[2] * 271 + llave[3] * 272

Aunque existen 273 = 19683 combinaciones posibles con tres letras y se esperaría una distribución aproxi-
madamente homogénea en el arreglo ya propuesto (de tamaño 10007), lo cierto es lo siguiente:

• No todas esas combinaciones son palabras válidas.

Tema N.º 1
•  una solución temporal, ya que si el arreglo creciera sobre 19683, se estaría ante el mismo problema
Es
del primer algoritmo.

Analice el tercer intento de una función de dispersión para llaves de tipo cadena.

function dispersión (llave: tipo_cadena; tamaño_llave: integer): ÍNDICE;


var val_dispersión, j:integer;
begin
val_dispersión := codASCII(llave[1]);
for:=2 to tamaño_llave do
val_dispersión:=(val_dispersion*32 + codASCII(llave[j]))
mod tamaño;
dispersión:=val_dispersión
end

Este algoritmo ya considera a todos los caracteres de la llave (al margen de su tamaño) y se puede esperar
una buena distribución, pues lleva el resultado al intervalo apropiado. La operación usa 32 (en vez de 27),
ya que no es una multiplicación propiamente dicha, sino más bien se trata de un desplazamiento de cinco
bits (25). Para evitar que el resultado genere desbordamiento, es decir, un resultado mayor que el tamaño
del arreglo, es necesario usar el operador mod en cada iteración. La desventaja que ofrece es que tiende
a ser lenta con llaves grandes; sin embargo, para superar esto algunos programadores optan por emplear
solo partes de la llave como, por ejemplo, utilizan solo caracteres pares o solo los dos primeros caracteres
de cada palabra, entre otros.

3. Resolución de colisiones
Una colisión ocurre cuando, al intentar insertar un nuevo dato al arreglo, la función de dispersión genera un índice
en el cual ya existe un valor previo. Para superar este inconveniente existen dos métodos simples propuestos
por Weiss (1995, p. 159):

• Dispersión abierta

• Dispersión cerrada

3.1. Dispersión abierta


Consiste en tener una lista de los elementos con el mismo valor de dispersión (o el mismo índice). Se le deno-
mina también encadenamiento separado y gráficamente es como se muestra en la siguiente figura.

107
Consiste en tener una lista de los elementos con el mismo valor de dispersión (o
el mismo índice). Se le denomina también encadenamiento separado y
gráficamente es como se muestra en la siguiente figura.

Cálculo de índices:

Llaves
(x) 0 1 4 9 16 25 36 49 64 81
Cálculo de índices:

Llaves
UNIDAD IV

(x) 0 1 4 9 16 25 36 49 64 81
Función de dispersión x mod 10

Función de dispersión
Índices x mod 10
generados
0 1 4 9 6 5 6 9 4 1

Índices Asignación de datos:


generados
0 1 4 9 6 5 6 9 4 1
Tema N.º 1

Figura 51. Ejemplo de resolución de colisiones mediante dispersión


Asignaciónabierta.
de datos:

0 0
1 1 81
2
3
4 4 64
5 25
6 16 36
7
8
9 9 49

Figura 51.de
Tomada Ejemplo de resolución
Estructura de colisiones
de datos mediantepor
y algoritmos, dispersión
Weiss, abierta.
1995.
Tomada de Estructura de datos y algoritmos, por Weiss, 1995.
Luego de aplicar la función de dispersión al conjunto de llaves, los resultados dan
cuenta
Luego de aplicar de un de
la función conjunto dealcolisiones
dispersión conjunto decomo
llaves,es
loselresultados
caso de dan
las cuenta
llaves de
“1”unyconjunto
“81”, a de coli-
siones como es el caso de las llaves “1” y “81”, a las cuales se le asignó la casilla 1 del arreglo paraello,
las cuales se le asignó la casilla 1 del arreglo para almacenarse. Frente a la
almacenarse.
solución que propone el método de la dispersión abierta es enlazar ambos
Frente a ello, la solución que propone el método de la dispersión abierta es enlazar ambos elementos al array
elementos
mediante punteros, en la al arrayque
posición mediante punteros,
le corresponde, en la
formando unaposición
cadena. que le corresponde,
formando una cadena.
Para buscar un determinado elemento, simplemente se aplica la función de dispersión para determinar qué lista
Para buscarseun
recorrer. A continuación, determinado
recorre tal lista con elemento,
cualquiera desimplemente
los métodos yase aplica en
revisados la los
función
capítulosdeanterio-
dispersión para determinar
res, devolviéndose la posición donde se encuentra.qué lista recorrer. A continuación, se recorre tal lista
con cualquiera de los métodos ya revisados en los capítulos anteriores,
El programadevolviéndose la posición
1.1 muestra un ejemplo donde se encuentra.
de implementación de este método.

El programa 1.1 muestra un ejemplo de implementación de este método.

#include <iostream> // Verificar si en la posición ya hay


using namespace std; valores registrados
if (arreglo[pos]==NULL)
// Número de elementos del arreglo arreglo[pos] = nuevonodo;
const int NROELEMENTOS=10; else
{
struct nodo //Verificar si el valor ingresado
{ ya existe
int dato; q = arreglo[pos];

108
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

#include <iostream> // Verificar si en la posición ya hay va-


using namespace std; lores registrados

UNIDAD IV
if (arreglo[pos]==NULL)
// Número de elementos del arreglo arreglo[pos] = nuevonodo;
const int NROELEMENTOS=10; else
{
struct nodo //Verificar si el valor in-
gresado ya existe
{
q = arreglo[pos];
int dato;

struct nodo *sig;
while (q!=NULL)
};

Tema N.º 1
{
if (q->dato==nuevono-
void main() do->dato)
{ yaexiste =
nodo *arreglo[NROELEMENTOS]; true;
nodo *q, *ant; ant = q;
nodo *nuevonodo; q = q->sig;
int valor; }
int pos;
bool yaexiste=false; if (yaexiste)
cout<<”El elemento ya
// Inicializar arreglo existe en la lista”<<endl;
for (int i=0; i<NROELEMENTOS; i++) else
arreglo[i] = NULL; ant->sig = nuevonodo;
yaexiste = false;
// Solicitar 5 datos }
for (int i=0; i<5; i++) }
{
// Crear nuevo nodo e inicializar // Imprimir tabla
sus valores for (int i=0; i<NROELEMENTOS; i++)
nuevonodo = new(struct nodo); {
cout<<”P”<<i;
cout<<endl<<”Digite el valor a in- if (arreglo[i]==NULL)
sertar: “; cout<<” -> NULL”<<endl;
cin>>nuevonodo->dato; else
nuevonodo->sig = NULL; {
q = arreglo[i];
// Calcular posición de inserción while (q!=NULL)
(con función de dispersión)
{
pos=nuevonodo->dato%NROELEMENTOS;
cout<<” -> “<<q->da-
cout<<endl<<”Índice generado: to;
“<<pos<<endl<<endl;
q = q->sig;
}
cout<<endl;
}
}
system(“Pause”);
}

Programa 1.1

109
3.2. Dispersión cerrada
UNIDAD IV

También llamado direccionamiento abierto. La solución que propone para las colisiones consiste en recorrer el
arreglo hasta encontrar una celda vacía a través de la siguiente función:

di ( x ) = ( dispersión ( x ) + f ( i ) ) mod tamaño


En la fórmula anterior, la función f es la estrategia para la solución de colisiones, la cual puede ser de tres tipos:

Tipo de exploración Estrategia Descripción Inconvenientes


Tema N.º 1

Equivale a recorrer las celdas


en secuencia (con vuelta al
principio) en busca de una Se forman bloques de celdas
Exploración lineal f(i) = i celda vacía. ocupadas (agrupamiento
primario).
Requiere de arreglos relativa-
mente grandes.
Exploración cuadrática f(i) = i2 Elimina el agrupamiento No garantiza encontrar una cel-
primario. da vacía cuando el arreglo está
lleno a más de la mitad.
Dispersión doble f(i) = i2 * h2(x) h2(x) es una segunda función Requiere que el tamaño del
de dispersión. arreglo sea un número primo.
El resultado nunca debe ser
cero; por ejemplo 99, mod 9.

El programa 1.2 muestra la implementación de estos tres tipos de exploración como funciones de C++.

#include <iostream> void menu_colisión()


#include <math.h> {
using namespace std; cout<<endl<<”Se ha producido una
colisión.”<<endl;
const int MAXNROELEMENTOS = 17; cout<<”¿Con qué método desea soluciona-
rlo?:”<<endl;
int arreglo[MAXNROELEMENTOS];
cout<<”1. Exploración lineal”<<endl;
cout<<”2. Exploración cuadrática”<<endl;
void inicializar_arreglo()
cout<<”3. Dispersión”<<endl<<endl;
{
cout<<”Opción?: “;
for (int i=0; i<MAXNROELEMENTOS; i++)
}
arreglo[i] = NULL;
}
void main()
{
int función_hash(int valor)
locale::global(locale(“spanish”));
{

return valor%MAXNROELEMENTOS;
int pos=0;
}
int opcion=0;

int exploración_lineal(int pos)


inicializar_arreglo();
{
int pos_nueva, i=0;
// Solicitar 5 datos
bool encontrado=false;
for (int i=0; i<5; i++)
{
// Recorrer el arreglo hasta encontrar un
casillero vacío // Solicitar dato al usuario
pos_nueva = pos; int valor;
while (!encontrado) cout<<endl<<”Digite el valor a inser-
tar: “;cin>>valor;
{
i++;
pos_nueva=(pos_nueva+i)%MAXNROELEMEN-
TOS;

110
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

if (pos_nueva==pos) // Si se recorrió todos los // Calcular posición de inserción (Método de


elementos del arreglo sin éxito la división)

UNIDAD IV
break; pos = funcion_hash(valor);
if (arreglo[pos_nueva]==NULL) cout<<endl<<”Indice generado:
{encontrado=true;break;} “<<pos<<endl<<endl;
}
if (encontrado) // Verificar si se genera una colisión
return pos_nueva; if (arreglo[pos]==NULL)
else arreglo[pos]=valor;
return -1; else
} {
int exploración_cuadrática(int pos) menú_colisión();

Tema N.º 1
{ cin>>opcion;
int pos_nueva, i=0; switch ( opción )
bool encontrado = false; {

// Recorrer el arreglo hasta encontrar un case 1:


casillero vacío pos = ex-
while (!encontrado) ploración_lineal(pos);
{ break;
i++;
pos_nueva=pos+int(pow(i,2))%MAXNROELE- case 2:
MENTOS; pos= exploración_
cuadrática(pos);
if (i==MAXNROELEMENTOS+1) // Detener si break;
se hicieron los suficientes intentos
break; case 3:
pos = dis-
if (arreglo[pos_nueva]==NULL) persión(pos, valor);
{encontrado=true;break;} break;
}
default:
if (encontrado) cout<<”La opción
return pos_nueva; no existe”<<endl;
else }
return -1;
} if (pos==-1)
cout<<”No fue posible
encontrar una casilla libre”<<endl;
int dispersión(int pos, int valor)
else
{
arreglo[pos]=valor;
int pos_nueva, i=0;
}
bool encontrado=false;
}

while (!encontrado)
// Imprimir el arreglo
{
cout<<endl<<”Datos”<<endl;
i++;
cout<<”-----”<<endl;
pos_nueva = pos + i + funcion_hash(val-
or); for (int i=0; i<MAXNROELEMENTOS; i++)
if (i==MAXNROELEMENTOS+1) // Detener si cout<<”P”<<i<<”: “<<arreglo[i]<<endl;
se hicieron los suficientes intentos
break; system(“Pause”);
}
if (arreglo[pos_nueva]==NULL)
{encontrado=true; break;}
}

if (encontrado)
return pos_nueva;
else
return -1;
}

Programa 1.2
111
Tema N.º 2:
UNIDAD IV

Modelo de datos relacional


Todas las estructuras de datos revisadas a lo largo de este manual, como fueron las listas simples, las listas
enlazadas, las matrices, etc., son medios de almacenamiento temporales; es decir, mantienen los datos en
memoria mientras el programa que las genera está en ejecución. Esta característica resulta insuficiente para
aplicaciones que deben trabajar en el entorno empresarial contemporáneo, el cual no solamente exige que estas
sean precisas y veloces, sino también capaces de mantener un registro de cada transacción en un repositorio
Tema N.º 2

digital permanente: una base de datos.

El presente tema aborda uno de los tipos de estructuras que da soporte a una base de datos, el llamado modelo
relacional.

1. Base de datos
“Es una colección de datos, lógicamente relacionados, que apoyan el acceso compartido de muchos usuarios y
aplicaciones” (Loomis, 1991, p. 275).

Un sistema administrador de base datos (o DBMS por sus siglas en inglés) es un software que provee un con-
junto de servicios para que tanto programadores como aplicaciones puedan acceder y utilizar las bases de datos
sin enfrentarse a la complejidad que las subyace. La figura 52 muestra esta estructura.
Figura 52. Estructura Aplicación-DBMS-BD

Aplicación 1 Aplicación 2 Aplicación n

DBMS

BD

Tomada de Estructura de Figura


datos52.
y organización de archivos, por Loomis (1991).
Estructura Aplicación-DBMS-BD
Tomada de Estructura de datos y organización de archivos, por Loomis (1991).
2. El modelo entidad-relación

La historia de la informática da cuenta de cuatro modelos que se han desarrollado


2. El modelo entidad-relación
como estructura de una base de datos: el de red, el jerárquico, el modelo relacional
y el orientado a objetos. No obstante, en palabras de Silberschatz, Korth y Sudarshan
La historia
(2002), de el
la modelo
informática da cuentasedeha
relacional cuatro modelosactualmente
establecido que se han desarrollado como estructura
como el principal modelo de una base
de datos:
de datosel depara
red, el
lasjerárquico, el modelo
aplicaciones relacional y el orientado
de procesamiento de datos.a objetos.
Su gran Noaceptación
obstante, ensepalabras de
Silberschatz,
debe a su Korth y Sudarshan (2002), el modelo relacional se ha establecido actualmente como el principal
simplicidad.
modelo de datos para las aplicaciones de procesamiento de datos. Su gran aceptación se debe a su simplicidad.
Este modelo es el producto final de un proceso de diseño que inicia con la elaboración
del denominado “modelo entidad-relación”, el cual a su vez se construye basado en
la percepción de un mundo real que consiste en una colección de objetos básicos,
112 denominados “entidades” y “relaciones”. La figura 53 ilustra esta secuencia.

Figura 53. Etapas en el diseño del modelo relacional


como estructura de una base de datos: el de red, el jerárquico, el modelo relacional
y el orientado a objetos. No obstante, en palabras de Silberschatz, Korth y Sudarshan
(2002), el modelo relacional se ha establecido actualmente como el principal modelo
Estructura de Datos
de datos para las aplicaciones de procesamiento de datos. Su granMANUAL aceptación se
AUTOFORMATIVO INTERACTIVO
debe a su simplicidad.

Este modelo es el producto final de un proceso de diseño que inicia con la elaboración
del denominado “modelo entidad-relación”, el cual a su vez se construye basado en
la percepción de un mundo real que consiste en una colección de objetos básicos,
Este modelo es el producto
denominados final de un
“entidades” proceso de diseño
y “relaciones”. que inicia
La figura con la elaboración
53 ilustra del denominado “mode-
esta secuencia.
lo entidad-relación”, el cual a su vez se construye basado en la percepción de un mundo real que consiste en una

UNIDAD IV
colección de objetos
Figura básicos, en
53. Etapas denominados
el diseño“entidades”
del modeloy “relaciones”
relacional . La figura 53 ilustra esta secuencia.

Tema N.º 2
Realidad Modelo ER Modelo relacional
(Entidades y atributos) (Tablas)

Fuente: Elaboración propia


Figura 53. Etapas en el diseño del modelo relacional
Silberschatz, et al. (2002, p. 19) Fuente: Elaboración que
consideran propia“una entidad es una “cosa” u
“objeto” del mundo real claramente distinguible de otros objetos”. Por su parte,
Ricardo
Silberschatz, (2004,
et al. (2002,p.
p. 88) consideraque
19) consideran que es entidad
“una un “objeto
es unaque existe
“cosa” y se puede
u “objeto” distinguir
del mundo real claramen-
de otros objetos. Puede representar una persona, lugar, evento, objeto o concepto
te distinguible de otros objetos”. Por su parte, Ricardo (2004, p. 88) considera que es un “objeto que existe y se
puede en el mundo
distinguir realobjetos.
de otros que sePuede
planea modelar una
representar en la base de
persona, datos”.
lugar, Entonces,
evento, una entidad
objeto o concepto en el mundo
puede ser real o abstracta y siempre estará vinculada a un contexto determinado.
real que se planea modelar en la base de datos”. Entonces, una entidad puede ser real o abstracta y siempre
estará vinculada a un contexto determinado.

Algunos ejemplos de entidades son los siguientes:

Contexto: Contexto: Contexto:


Agencia bancaria Centro de estudios Restaurant
Entidades: Entidades: Entidades:
• Cliente • Alumno • Comensal
• Préstamo • Docente • Platillo
• Cajero • Asignatura • Chef
• Crédito • Horario • Mozo
• Analista • Etc. • Cajero
• Cuenta (bancaria) • Etc.
• Etc.

De acuerdo con el contexto, cada entidad se define con una serie de características o propiedades denominadas
“atributos”. A manera de ejemplo, a continuación, se enumeran posibles atributos para la entidad “Alumno”:

• Número de DNI

• Nombres

• Apellidos

• Dirección domiciliaria

• Número de teléfono

La migración desde el modelo entidad-relación al modelo relacional se realiza siguiendo una serie de pautas
que permiten convertir cada entidad detectada en una tabla y cada asociación entre ellas en una relación que
garantice la integridad de los datos.

113
Por consiguiente, el modelo relacional presenta las siguientes características:

• Representa la estructura de una base de datos relacional.


UNIDAD IV

• Se compone de dos elementos fundamentales: tablas y relaciones.

• 
Los datos se agrupan de acuerdo con la entidad a la que pertenecen y se asocian entre ellos gracias a las
relaciones entre tablas.

Las bases de datos relacionales se han convertido en el mecanismo de almacenamiento de datos más común
para las aplicaciones computacionales modernas.
Tema N.º 2

3. Fundamentos del modelo entidad-relación


A continuación, se presenta un ejemplo muy simplificado sobre cómo crear este modelo mientras se van des-
cribiendo sus componentes.

Imagine que se necesitan registrar los datos de matrículas de un centro de estudios superior.

1.º. Se analiza el contexto y se identifican las entidades que intervienen en la actividad “matrícula”.

• Alumno

• Asignatura

2.º. En función a las necesidades organizacionales, se anotan los atributos o características que se desean alma-
cenar de cada entidad. Entidad: Alumno Entidad: Asignatura
• N.º de DNI • Nombre
Atributos

• Nombres
Entidad: Alumno • Categoría
Entidad: Asignatura
• Apellidos • N.º de créditos
• N.º de DNI • Tipo sanguíneo • Nombre
Atributos

• Nombres • Observaciones • Categoría


• Apellidos • N.º de créditos
3.º. • Se procede
Tipo sanguíneo a graficar las entidades y se anota el verbo (o acción) que las
relaciona.
• Observaciones

Figura 54. Ejemplo del modelo entidad relación


3.º. Se procede a graficar las entidades y se anota el verbo (o acción) que las relaciona.

Tipo sanguineo Apellidos Categoría


Nombre

Observaciones
Nro. De créditos
Nombres

Alumno Se matricula Asignatura

Nro de DNI

Pertenece

Carrera
Nombre profesional

4.º. A continuación, se analiza la cardinalidad, es decir, qué cantidad de elementos


Figura 54.
de una entidad se relacionan Ejemplo
solo con del
un modelo entidad
elemento derelación
la otra entidad. Esta cantidad
se expresa como “uno” (1) o “muchos” (M).
En particular, refiriéndonos al ejemplo, las preguntas que permiten obtener la
cardinalidad de cada par de entidades son las siguientes:
114
• ¿En cuántas asignaturas puede matricularse un alumno?
Respuesta: Un alumno puede estar matriculado en muchas asignaturas.
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

4.º. A continuación, se analiza la cardinalidad, es decir, qué cantidad de elementos de una entidad se relacionan
solo con un elemento de la otra entidad. Esta cantidad se expresa como “uno” (1) o “muchos” (M).

UNIDAD IV
En particular, refiriéndonos al ejemplo, las preguntas que permiten obtener la cardinalidad de cada par de enti-
dades son las siguientes:

• ¿En cuántas asignaturas puede matricularse un alumno?

Respuesta: Un alumno puede estar matriculado en muchas asignaturas.

• En una asignatura, ¿cuántos estudiantes pueden estar matriculados?

Tema N.º 2
Respuesta: En una asignatura pueden estar matriculados muchos alumnos.

• ¿A cuántas carreras profesionales pertenece una asignatura?

Respuesta: Una asignatura pertenece a una sola carrera profesional.

• ¿Cuántas asignaturas puede tener una carrera profesional?

Respuesta: Una carrera profesional tiene muchas asignaturas.

El gráfico quedaría de la siguiente manera:


Figura 55. Ejemplo del modelo entidad-relación
Tipo sanguineo Apellidos Categoría
Nombre

Observaciones
Nro. De créditos
Nombres

Alumno M Se matricula M Asignatura


M

Nro de DNI

Pertenece
1

Carrera
Nombre profesional

Figura 55. Ejemplo del modelo entidad-relación


Las entidades con cardinalidad “uno” se conocen como “entidades fuertes” y las que
tienen cardinalidad “muchos”, como “entidades débiles”. Cuando una entidad fuerte
se relaciona
Las entidades con una “uno”
con cardinalidad débil,se
seconocen
dice que entre
como ellas existe
“entidades dependencia
fuertes” de existencia.
y las que tienen cardinalidad “mu-
Ricardo (2004, p. 106) expresa que una entidad es dependiente de la existencia
chos”, como “entidades débiles”. Cuando una entidad fuerte se relaciona con una débil, se dice que entre de ellas
otra si no puede existir en la base de datos sin una instancia correspondiente
existe dependencia de existencia. Ricardo (2004, p. 106) expresa que una entidad es dependiente de de la la exis-
otra entidad; por ejemplo, no tendría sentido almacenar datos acerca de órdenes de
tencia de otra si no puede existir en la base de datos sin una instancia correspondiente de la otra entidad; por
ejemplo,ventas (entidad
no tendría sentidodébil) si nodatos
almacenar se tiene
acercaantes datosde
de órdenes deventas
clientes (entidad
(entidad débil) fuerte). En antes
si no se tiene
resumen:
datos de clientes (entidad fuerte). En resumen:
• Las entidades fuertes existen por sí solas.
• Las entidades
• entidades
Las fuertesdébiles
existennecesitan de una entidad fuerte para que su existencia tenga
por sí solas.
sentido.
• Las entidades débiles necesitan de una entidad fuerte para que su existencia tenga sentido.
5.º. A continuación, es imprescindible identificar el atributo principal o llave para cada
entidad. Losesvalores
5.º. A continuación, de esteidentificar
imprescindible atributoeljamás seprincipal
atributo repiten oollave
quedan
para vacíos y se emplea
cada entidad. Los valores de
precisamente para identificar a cada elemento que representa la entidad.
este atributo jamás se repiten o quedan vacíos y se emplea precisamente para identificar a cada Algunas
elemento que
representaconsideraciones a tener
la entidad. Algunas en cuenta para
consideraciones elegir
a tener este atributo
en cuenta para elegirson las
este siguientes:
atributo son las siguientes:
• Verificar si la entidad ya tiene un atributo con las características descritas (sin
duplicados, sin vacíos). Por ejemplo, para la entidad alumno su atributo principal
bien podría ser su número de DNI.
• Si ninguno cumple estas condiciones, se puede optar por lo siguiente:
o Crear uno. Para el nombre de este nuevo atributo se suele usar el prefijo “id”
(de “identificador”) seguido del nombre de la entidad, por ejemplo, 115
“IdAsignatura”.
o Agrupar varios atributos de tal forma que la concatenación de sus valores
• 
Verificar si la entidad ya tiene un atributo con las características descritas (sin duplicados, sin vacíos). Por
ejemplo, para la entidad alumno su atributo principal bien podría ser su número de DNI.
UNIDAD IV

• Si ninguno cumple estas condiciones, se puede optar por lo siguiente:


o C
 rear uno. Para el nombre de este nuevo atributo se suele usar el prefijo “id” (de “identificador”) se-
guido del nombre de la entidad, por ejemplo, “IdAsignatura”.
o Agrupar varios atributos de tal forma que la concatenación de sus valores genere una clave.

Recuerde:
Tema N.º 2

Una llave puede estar compuesta por uno o varios atributos.

Gráficamente, estos atributos especiales se representan subrayando su nombre.


Figura 56. Ejemplo del modelo entidad-relación

4. Estructura de una base de56.


Figura datos relacional
Ejemplo del modelo entidad-relación
La implementación física (en el DBMS) del modelo entidad-relación genera nuevos
componentes y características que deben tenerse en consideración.
4. Estructura
4.1.Tabla
de una base de datos relacional
En términos técnicos, una tabla es un almacén de datos con una estructura similar
La implementación
a la de un física (en el
arreglo DBMS) del modelo
bidimensional. entidad-relación
Gráficamente, genera nuevos
se representa componentes
como y característi-
se muestra
cas que en
deben tenerse
la figura en consideración.
57.

4.1. Tabla Figura 57. Partes de una tabla.

En términos técnicos, una tabla es un almacén de datos con una estructura similar a la de un arreglo bidimensio-
nal. Gráficamente, se representa como se muestra en la figura 57. Atributos clave o
principal
Atributos de
Atributos clave o
la entidad principal
Atributos de
la entidad
Fuente: Elaboración propia

Una vez finalizado el proceso de diseño de una tabla, esta deberá ser llenada con
los datos que le corresponden.Figura
Para57.
ello la mayoría
Partes de sistemas gestores de base
de una tabla.
de datos vienen equipados con dos vistas
Fuente: que facilitan
Elaboración propia este trabajo: la vista diseño
y la vista de datos. Tal diferencia podrá notarlas en la figura 38.

116 Figura 58. Representación de la vista diseño (izquierda) y vista datos


(derecha) de una tabla.
Fecha Lugar
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Una vez finalizado el proceso de diseño de una tabla, esta deberá ser llenada con los datos que le corresponden.
Para ello la mayoría de sistemas gestores de base de datos vienen equipados con dos vistas que facilitan este

UNIDAD IV
trabajo: la vista diseño y la vista de datos. Tal diferencia podrá notarlas en la figura 58.

Fecha Lugar
DNI Nombres Apellidos
Nacimiento Residencia
42516191 Juan Valdez Quiroga 01/07/1990 Huancayo
10203245 Pedro Benegas Robles 15/08/1980 Lima
44553340 María Roncal Pérez 31/12/1981 NULL
41918070 Lucía Medrano López NULL Huancayo
10775655 Walter Quijada Moyano 07/09/1989 Huánuco
… … … … …

Tema N.º 2
Figura 58. Representación de la vista diseño (izquierda) y vista datos (derecha) de una tabla.
Fuente: Elaboración propia.

A cada fila de datos, le corresponde una y solo una entidad del mundo real, se le conoce también como “regis-
tro” o “tupla”.

Para Silberschatz et al. (2002, p. 126) una tabla tiene las siguientes características:

• Cada celda de la tabla contiene solo un valor.

• Cada columna tiene un nombre distinto, que es el nombre del atributo que representa.

• 
Todos los valores en una columna provienen del mismo dominio, pues todos son valores del atributo co-
rrespondiente.

• Cada tupla o fila es distinta; no hay tuplas duplicadas.

• El orden de las tuplas es irrelevante.

4.2. Tipos de atributos


Una tabla puede estar compuesta de diversos tipos de atributos, destacando entre ellos:

• Atributo principal: O llave primaria (primary key en inglés); está destinado a identificar unívocamente a cada
registro.

• 
Atributo secundario: O llave secundaria (foreign key en inglés); es un atributo propio de una entidad débil
y sus valores los hereda de la llave primaria de donde proviene.

• Atributo común: Describe cualquier propiedad o característica de la entidad.

• Atributo candidato: Cualquier combinación de atributos que pueda considerarse una llave.

4.3. Relaciones entre tablas


A diferencia del modelo ER, en el modelo relacional solo existen relaciones del tipo “uno a muchos”. Para su im-
plementación es necesario que la entidad débil posea un atributo adicional con las mismas características que la
llave principal de la entidad fuerte de la cual depende, por lo menos en lo que concierne a tipo y ancho de dato.

Por ejemplo, la implementación de la relación “asignatura-carrera profesional” (del modelo descrito anteriormen-
te) queda como sigue:

117
A diferencia del
de la modelo
entidad ER, en
fuerte de el
la modelo relacional
cual depende, por solo existen
lo menos en relaciones del
lo que concierne a tipo
tipo “unoyaancho
muchos”. Para su implementación es necesario que la entidad débil
de dato.
posea un atributo adicional con las mismas características que la llave principal
de la entidad fuerte de la
Por ejemplo, la implementación
cual depende, pordelolamenos en “asignatura-carrera
relación lo que concierne a tipo
profesional”
y ancho de dato.
(del modelo descrito anteriormente) queda como sigue:

Por ejemplo, la implementación de la relación “asignatura-carrera profesional”


(del modelo descrito
Figura 59. anteriormente) quedarelacional
Ejemplo de modelo como sigue:

tblAsignatura
Figura 59. Ejemplo de modelo relacional tblCarreraProfesional
Uno
UNIDAD IV

PK idAsignatura
Atributo PK idCarreraProf
adicional (FK)
tblAsignatura
nombre tblCarreraProfesional
Muchos
FK1 idCarreraProf Uno nombre
PK idAsignatura
Atributo PK idCarreraProf
adicional (FK)
nombre Muchos
Según FK1
la notación que se emplee, una
idCarreraProf relación entre dos tablas puede
nombre
Figura 59. Ejemplo de modelo relacional
representarse, entre muchas otras, de las siguientes maneras:

Según laSegún
notaciónlaquenotación
se emplee, una se
relación entre dos
unatablas puedeentre
representarse, entre muchas
puede otras, de
Tema N.º 2

que emplee, relación dos tablas


las siguientes maneras: entre
representarse, Representa
muchas otras, de las siguientes maneras: Representa
cardinalidad cardinalidad
“uno” “muchos”
Representa Representa
cardinalidad cardinalidad
“uno” “muchos”

a) Demostración que la relación “uno a muchos” del modelo ER realmente se


a) Demostración que la relación “uno a muchos” del modelo ER realmente se
refleja en la base de datos.
a) refleja
Demostración queenla la base “uno
relación de datos.
a muchos” del modelo ER realmente se refleja en la base de datos.
Observe las siguientes tablas:
Observe
Observe las siguientes las siguientes tablas:
tablas:
tblAsignatura tblCarreraProfesional
tblAsignatura
IdAsignatura Nombre
tblCarreraProfesional
IdCarreraProf Nombre
IdAsignatura
A002 Nombre
Matemática IdCarreraProf
C1 Nombre
Ing. Eléctrica
A002
A005 Matemática
Física I C1
C2 Ing. Eléctrica
Administración
A005 Física I
Fundamentos de C2 Administración
A007 Fundamentos
A007 electricidad de
A009 electricidad
Marketing
A009 Marketing
Introducción a la
A010 Introducción a la
A010 administración
administración

La cardinalidad indica que a cada carrera profesional le deben corresponder


La cardinalidad indica que a cada carrera profesional le deben corresponder
La cardinalidad una
una
o que
indica muchas
o muchas
asignaturas.
a cada Pero ¿cómo
carrera profesional
asignaturas.
implementar
le deben
Pero ¿cómo
ello?
corresponder
implementar una o muchas asignaturas. Pero
ello?
¿cómo implementar ello?
Pues bien, aquí es donde entra a trabajar la llave foránea, aquel campo
Pues bien, aquí es donde entra a trabajar la llave foránea, aquel campo
Pues bien, aquí adicional
adicional
de una
es donde entra
de una
entidad
a trabajar
entidad
débil.
la llave foránea, aquel campo adicional de una entidad débil.
débil.
Ahora observe como Ahoraeste
observe
campo,como este campo,
simplemente copiandosimplemente
el valor de sucopiando el valor
llave principal de su
“n” veces, llave reflejar
permite
Ahora observe como este campo, simplemente copiando el valor de su llave
lo siguiente: principal “n” veces, permite reflejar lo siguiente:
principal “n” veces, permite reflejar lo siguiente:
• A la carrera profesional “Ing. Eléctrica” (uno) le corresponde las
• A la carrera profesional “Ing. Eléctrica” (uno) le corresponde las
• asignaturas
A la carrera profesional “Ing.“Matemática I”,le“Física
Eléctrica” (uno) I” y “Fundamentos
corresponde de Electricidad”
las asignaturas “Matemática I”, “Física I” y
asignaturas “Matemática I”, “Física I” y “Fundamentos de Electricidad”
“Fundamentos (muchos).
de Electricidad” (muchos).
(muchos).
• A la carrera profesional “Administración” (uno) le corresponde las carreras
• A la carrera A la carrera
• profesional profesional “Administración”
“Administración” (uno)alelacorresponde (uno) le corresponde
las carreras las ecarreras
“Marketing” “Introducción a
“Marketing” e “Introducción Administración” (muchos).
“Marketing” e “Introducción a la Administración” (muchos).
la Administración” (muchos).

tblAsignatura TblCarreraProfesional
tblAsignatura
IdAsignatura Nombre IdCarreraProf
TblCarreraProfesional
IdCarreraProf Nombre
IdAsignatura
A002 Nombre
Matemática IdCarreraProf
C1 IdCarreraProf Nombre
A002 Matemática C1 C1 Ing. Eléctrica
A005 Física I C1 C1 Ing. Eléctrica
A005 Física I
Fundamentos de C1
C1
A007 Fundamentos
A007 electricidad de C1 C2 Administración
A009 electricidad
Marketing C2 C2 Administración
A009 Marketing
Introducción a la C2
A010 Introducción a la C2
A010 administración C2
administración

b) Demostración de la necesidad de mantener llaves primarias y secundarias.


118 b) Demostración de la necesidad de mantener llaves primarias y secundarias.
Posiblemente usted, estimado estudiante, habrá reparado en que no es
Posiblemente usted, estimado estudiante, habrá reparado en que no es
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

b) Demostración de la necesidad de mantener llaves primarias y secundarias.

Posiblemente usted, estimado estudiante, habrá reparado en que no es necesaria la tabla “tblCarreraProfesio-

UNIDAD IV
nal”, ya que al prescindir de ella el modelo aparentemente se hace más sencillo. Así:

TblAsignatura
IdAsignatura Nombre CarreraProf
A002 Matemática Ing. Eléctrica
A005 Física I Ing. Eléctrica
Fundamentos de
A007 Ing. Eléctrica
electricidad
A009 Marketing Administración

Tema N.º 2
Introducción a la
A010 Administración
administración

Pues bien, en la teoría de base de datos existe un tema llamado “Normalización” el cual describe, entre muchas
normas, la necesidad de mantener cada dato en su propia entidad; esto facilita en gran medida el mantenimiento
de la base de datos y su adaptación a nuevas necesidades. En este curso no se profundizará en los temas de la
normalización, pero se explicará con un ejemplo su importancia.

Imagine que la cada carrera profesional tuviese no uno sino más atributos, por ejemplo “Fecha de creación”,
“Dirección” y “Facultad”, entonces la tblAsignatura tendría los siguientes datos:

TblAsignatura
IdAsignatura Nombre CarreraProf FechaCreación Director Facultad
Richard
A002 Matemática Ing. Eléctrica Ago-2001 Ingeniería
Robles
Richard
A005 Física I Ing. Eléctrica Ago-2001 Ingeniería
Robles
Fundamentos de Richard
A007 Ing. Eléctrica Ago-2001 Ingeniería
electricidad Robles
Mónica Ciencias de
A009 Marketing Administración Mar-2004
Munive la empresa
Introducción a la Mónica Ciencias de
A010 Administración Mar-2004
administración Munive la empresa

¿Notó la importancia de mantener cada dato en su propia entidad? ¿Aún no? Primero, en esta tabla varios grupos
de datos se repiten, lo que conlleva a utilizar espacio de disco innecesariamente. Segundo, ¿cómo actualizaría
el nombre del Director de una carrera si este llegará a cambiar? ¡Exacto! Tendría que actualizar el nombre “n”
veces. Ahora, ¿qué pasaría si alguna de las filas queda sin actualizar por un error? ¿Y si un director está a cargo
de dos o más carreras? Complicado, ¿verdad?

Todos estos inconvenientes se ven superados cuando la tabla Carrera Profesional se mantiene de manera inde-
pendiente, tal como se le identificó en el modelo ER.

c) ¿Qué suceden con las relaciones de tipo “Muchos a muchos” identificadas en el modelo entidad-relación?

Ya que el modelo relacional solo permite la creación de relaciones de tipo “uno a muchos”, las de tipo “muchos
a muchos” que se generen en el ER deberán ser transformadas a través de las siguientes reglas:

• La relación, como tal, se convierte en una nueva tabla.

•  cardinalidad “muchos” se le asigna a esta nueva tabla, quedando las tablas que relacionaba con cardi-
La
nalidad “uno”.

119
a muchos”, las de tipo “muchos a muchos” que se generen en el ER deberán
ser transformadas a través de las siguientes reglas:

• La relación, como tal, se convierte en una nueva tabla.


• La cardinalidad “muchos” se le asigna a esta nueva tabla, quedando las
tablas que relacionaba con cardinalidad “uno”.

Por ejemplo, la relación “alumno-asignatura” quedaría de la siguiente manera


en el modelo
Por ejemplo, la relación relacional: quedaría de la siguiente manera en el modelo relacional:
“alumno-asignatura”
UNIDAD IV

tblAlumno tblMatricula
tblAlsignatura
PK DNI PK idMatrícula Uno
Uno PK idAsignatura
Nombres FK2 idAsignatura
Muchos
Apellidos Muchos FK1 DNI nombre
FechaNacimiento fecha idCarreraProf
LugarResidencia responsable
Tema N.º 2

Por la propia naturaleza de la transformación, la tblMatrícula ya tiene dos


Por la propia naturaleza
campos de la transformación,
(foráneos) por ladefecto:
tblMatrícula ya tiene dos campos
“idAsignatura” (foráneos)
y “DNI”; por defecto:se
no obstante, “idAsig-
natura” y “DNI”;pueden adicionar
no obstante, nuevos
se pueden campos
adicionar nuevosque permitan
campos un mejor
que permitan control
un mejor dedelas
control las matrí-
matrículas,
culas, por ejemplo: por ejemplo:
una llave primaria, la fecha una
de la llave primaria,
matrícula, la fecha
el responsable de la matrícula,
de realizarla, el que
etc. Es posible
responsable de realizarla, etc. Es posible que estos campos adicionales,
estos campos adicionales, por llamarlos de alguna forma, sean ya detectados en el modelo ER por lo que suele por
representárselesllamarlos de alguna
de la siguiente forma: forma, sean ya detectados en el modelo ER por lo que
suele representárseles de la siguiente forma:

Fecha Responsable

Se matricula

5. Interactuación
5. Interactuación Aplicación -de
Aplicación–Base Base de datos
datos
5.1.Creación de la base de datos y las tablas
5.1. Creación de la base de datos y las tablas
Los sistemas gestores de datos actuales (como SQL Server) permiten manipular
estos objetos, como su contenido, tanto de forma gráfica como a través de código,
Los sistemas gestores de datos actuales (como SQL Server) permiten manipular estos objetos, como su conte-
llamado Transact-SQL. El siguiente es un ejemplo de este código basado en las
nido, tanto de formatblCarreraProfesional
tablas gráfica como a través dey código, llamado Transact-SQL.
tblAsignatura El siguiente es un ejemplo de este
tratadas anteriormente.
código basado en las tablas tblCarreraProfesional y tblAsignatura tratadas anteriormente.
-- Creación de una base de datos llamada bdUniversidad
-- Creación
createde una base
database de datos llamada bdUniversidad
bdUniversidad
create go database bdUniversidad
go
-- Apuntar hacia la base de datos recién creada
-- Apuntar hacia la base de datos recién creada
use bdUniversidad
use bdUniversidad
go
go
-- Crear las tablas
-- Crear las tablas
create create table tblCarreraProfesional
table tblCarreraProfesional (idCarreraProf
(idCarreraProf varchar(2)
varchar(2) Primary Primary
key,
key,
nombre varchar(50))
nombre varchar(50))
create table tblAsignatura (idAsignatura varchar(4) Primary key,
create table
nombre varchar(50), tblAsignatura (idAsignatura varchar(4) Primary key,
idCarreraProf nombre varchar(50),
varchar(2)
idCarreraProf varchar(2)
Foreign key (idCarreraProf) References tblCarreraProfesional (idCarreraProf))
go Foreign key (idCarreraProf) References tblCarreraProfesional
(idCarreraProf))
go
Script Trasact-SQL Nro. 1
Script Trasact-SQL Nro. 1

120 5.2.Escribir y leer datos en una tabla desde una aplicación

Muchos lenguajes de programación proveen de métodos de acceso a datos desde


Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

5.2. Escribir y leer datos en una tabla desde una aplicación

UNIDAD IV
Muchos lenguajes de programación proveen de métodos de acceso a datos desde diversos motores (SQL Ser-
ver, Access, DB2, Oracle, entre otros). Para el ejemplo siguiente, en el cual se muestra como escribir y leer datos
en SQL Server, se empleó Visual Basic .Net 2012 por la simplicidad del código en esta tarea, lo cual facilitará su
comprensión y posterior replicación e implementación en otros lenguajes.

Para probar el código, diseñe un formulario como el siguiente:

Tema N.º 2
El proceso para guardar datos consiste en cuatro tareas:
El proceso para guardar datos consiste en cuatro tareas:
a) Declarar las variables para establecer la conexión entre la aplicación el
a) Declarar las variables para establecer la conexión entre la aplicación el sistema gestor de base de datos:
sistema gestor de base de datos:
- SQLConection
- SQLConection (contiene la(contiene la cadena
cadena conexión que conexión
establece laque establece
dirección la dirección
del servidor al quedel
se conec-
servidor al que se conectará, el nombre de la base
tará, el nombre de la base de datos, parámetros de seguridad entre otros). de datos, parámetros
de seguridad entre otros).
- SQLCommand (contiene la(contiene
- SQLCommand instrucciónlaSQL que realizará
instrucción SQL la que
tarea realizará
ya sea de la
escritura
tarea oya
lectura
sea de da-
tos). de escritura o lectura de datos).
b) Capturar los nuevos valores digitados por el usuario.
b) Capturar los nuevos valores digitados por el usuario.
c) Escribir las instrucciones de escritura para el comando.
c) Escribir d) las
Ejecutar el comando.
instrucciones de escritura para el comando.

d) Ejecutar el comando.diferente es el proceso para recuperar la data que consiste en:


Ligeramente
a) Declarar las variables para establecer la conexión entre la aplicación el
Ligeramente diferente es el proceso para recuperar la data que consiste en:
sistema gestor de base de datos.
a) - SQLConection
Declarar las variables para establecer la conexión entre la aplicación el sistema gestor de base de datos.
- SQLCommand
- SQLConection
b) Declarar los objetos que recibirán la información:
- SQLDataReader (Para recibir los datos)
- SQLCommand
- DataTable (Para mostrar al usuario a través de un control gridview)
b) c) los
Declarar Escribir
objetoslas instrucciones
que de lectura para el comando.
recibirán la información:
d) Ejecutar el comando.
- SQLDataReader (Para recibir los datos)
El programa
- DataTable 1.3 muestra
(Para mostrar al usuarioela través
programa completo
de un control para registrar una carrera
gridview)
profesional.
c) Escribir las instrucciones de lectura para el comando.
' Importar la librería que contiene las clases SQLCONECTION y SQLCOMMAND
Imports
d) Ejecutar System.Data.SqlClient
el comando.
Public Class frmEjemploConexión
El programa 1.3 muestra el programa completo para registrar una carrera profesional.
' 1. Declarar variables para la conexión
Dim conexion As New SqlConnection("SERVER=.;DATABASE=bdUniversidad;INTEGRATED
SECURITY=True")
Dim comando As SqlCommand

Sub LeerDatos() ' Leer datos y mostrarlos en el GridView 121


' 2. Declarar objetos que recibirán la información
‘ Importar la librería que contiene las clases SQLCONECTION y SQLCOMMAND
Imports System.Data.SqlClient
UNIDAD IV

Public Class frmEjemploConexión

‘ 1. Declarar variables para la conexión


Dim conexion As New SqlConnection(“SERVER=.;DATABASE=bdUniversidad;INTEGRATED
SECURITY=True”)
Dim comando As SqlCommand

Sub LeerDatos() ‘ Leer datos y mostrarlos en el GridView


Tema N.º 2

‘ 2. Declarar objetos que recibirán la información


Dim drCarrProfesional As SqlDataReader
Dim dtCarrProfesional As New DataTable

‘ 3. Escribir instrucciones para el comando


comando = New SqlCommand(“select * from tblCarreraProfesional”, conexion)
comando.CommandType = CommandType.Text

‘ 4. Ejecutar el comando
conexion.Open()
drCarrProfesional = comando.ExecuteReader()
dtCarrProfesional.Load(drCarrProfesional)
dgCarreraProfesional.DataSource = dtCarrProfesional
conexion.Close()

‘ Liberar la memoria y otros recursos de los objetos creados


dtCarrProfesional.Dispose()
End Sub

Sub RegistrarDatos()
‘ 2. Capturar valores ingresados por el usuario
Dim idCarreraProf As String
Dim NombreCarreraProf As String

idCarreraProf = txtIdCarrProf.Text
NombreCarreraProf = txtNombreCarrProf.Text

‘ 3. Escribir instrucciones para el comando


comando = New SqlCommand(“insert into tblCarreraProfesional values (‘”
& idCarreraProf & “’,’” & NombreCarreraProf & “’)”, conexion)
comando.CommandType = CommandType.Text

‘ 4. Ejecutar el comando
conexion.Open()
comando.ExecuteNonQuery()
conexion.Close()

‘ Mensaje de confirmación
MsgBox(“El registro fue insertado en la base de datos”)
End Sub

Private Sub btnRegistrarCarrProf_Click(sender As Object, e As EventArgs)


Handles btnRegistrarCarrProf.Click
RegistrarDatos()
LeerDatos()
End Sub
End Class

Programa 1.3

122
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Lo invitamos estimado estudiante, a programar la escritura y lectura de datos de asignaturas siguiendo el mismo
método expuesto.

UNIDAD IV
¡Ten en cuenta!

Cuando registre datos en un modelo relacional, asegúrese de realizarlo primero en las tablas principales (de
cardinalidad “uno”) para luego pasar a las tablas secundarias (de cardinalidad “muchos”).

Tema N.º 2

123
Tema N.º 3:
UNIDAD IV

Organización de archivos
Como se vio en el tema n.º 2, una base de datos compone un medio de almacenamiento estructurado respecto
a un área o proceso de la organización. En este último tema se presenta otra alternativa de almacenamiento
permanente, gracias al cual es posible guardar la información en entidades no estructuradas e independientes
llamadas archivos.
Tema N.º 3

1. Archivo

1.1. Definición
En principio, un archivo es un medio de almacenamiento permanente, como puede ser un documento generado
por un procesador de texto, una fotografía digital capturada por una cámara, entre muchos otros.

Sin embargo, en organización de archivos solamente es posible trabajar con algunos de ellos, ya que los con-
ceptos de registro y campo —vistos en el tema Nº 2— se mantienen. Es decir, los archivos a emplear deben
conservar esta estructura de los datos. Aunque son múltiples las opciones, por su simplicidad se suelen emplear
hojas de cálculo y también archivos de texto (txt).

Recuerda:

Un registro es un conjunto de campos en cada uno de los cuales se almacena un determinado valor.

Es preciso tomar en cuenta que mientras en una hoja de cálculo los registros estarán alojados en cada fila de
la misma, y un campo se ubicará en una columna específica, en un archivo de texto estos elementos estarán
divididos por saltos de línea y espacios respectivamente.

Finalmente, según Loomis (1995, p. 253) existen tres razones principales para estructurar un conjunto de datos
en archivos:

a) Tener un medio de almacenamiento permanente e independiente de la ejecución de un programa.

b)  n archivo almacena grandes cantidades de información, en ocasiones, inclusive, mayores que la capaci-
U
dad de la memoria principal.

c)  a tercera razón es que las aplicaciones acceden a una porción pequeña de los datos en un momento
L
determinado, y resulta ilógico almacenar toda esa información simultáneamente en la memoria principal.

1.2. Clasificación de los archivos


La autora citada continúa indicando la primera clasificación de los archivos, la cual se realiza por la función que
desempeñan en un sistema de información:

• 
Archivo maestro: Representa una visión estática e histórica de algún aspecto del negocio en un momento
dado. Por ejemplo, un archivo maestro de clientes, un archivo maestro de inventario, un archivo maestro
de pagos realizados, etc.

124
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

• 
Archivo de transacciones: Contiene los datos para agregar, eliminar o modificar un registro en un archivo
maestro. Cada registro de este archivo representa un evento o cambio.

UNIDAD IV
• 
Archivo de reporte: Contiene datos ya formateados para su presentación ante el usuario. Un ejemplo es
un archivo que se envía a una cola de impresión u otro que se utiliza para mostrarse en la pantalla de un
terminal.

• 
Archivo de trabajo: Son archivos temporales que se emplean únicamente para pasar datos entre progra-
mas.

• Archivo de programa: Contiene instrucciones para procesar datos. Su contenido puede estar escrito en un

Tema N.º 3
lenguaje de alto o bajo nivel, o bien, ser producto de una compilación.

• Archivo de texto: Contiene datos alfanuméricos y gráficos generados a través de un programa editor de
texto.

Otra forma de clasificar a los archivos es de acuerdo a la forma en que los programas acceden a ellos. Es decir:

• 
Archivo de entrada: Estos archivos son solamente de lectura y son utilizados por los programas para ex-
traer datos. Por ejemplo, para una aplicación que convierte cantidades a diferentes denominaciones, un
posible archivo de entrada sería uno que contenga la tabla de equivalencias entre las diferentes monedas
mundiales.

• Archivo de salida: Es de solo escritura. Un claro ejemplo de este tipo es un archivo de reporte.

• 
Archivo de entrada/salida: Por su parte, este tipo de archivos son leídos y escritos durante la ejecución de
un programa.

Es preciso aclarar que esta clasificación está determinada en mayor parte por el uso que le da una aplicación a
un archivo, más que por el mismo archivo en sí. En otras palabras, un archivo que es salida de un programa pue-
de ser entrada para otro.

Archivo de salida
(del programa 1) y
Programa 1 entrada (del Programa 2
programa 2)

Archivo de Archivo de
salida (del entrada (del
programa 1) programa 2)

Figura 60. Representación de los archivos clasificados por su forma de acceso


Autor: Elaboración propia

2. Organización de archivos
Hace alusión al conjunto de técnicas utilizadas para representar y almacenar registros en los archivos, más que
en estos últimos en sí mismos. Esta organización determina dos aspectos: la secuencia de los registros en el
archivo y las operaciones necesarias para llegar a ellos.

125
Figura 61. Distinción jerárquica entre las organizaciones fundamentales de
archivos
La siguiente gráfica muestra las cuatro técnicas que conforman este capítulo con las respectivas diferencias
Figura 61. Distinción jerárquica entre las organizaciones fundamentales de
entre ellas. ¿Con acceso de una llave?
archivos
UNIDAD IV

Si ¿Con acceso de una llave?

Si
¿Con acceso secuencial
únicamente?
¿Con acceso secuencial
No
únicamente? No

No
¿Con acceso directo No
Si únicamente?
¿Con acceso directo
Tema N.º 3

Si Siúnicamente? No

Si No
Organización Organización Organización Organización
secuencial relativa secuencial indexada multillave
Organización Organización Organización Organización
Tomada secuencial
de Estructura de datosrelativa
y organización desecuencial
archivos, Loomis,
indexada 1995. multillave
Tomada de Estructura de datos y organización de archivos, Loomis, 1995.
Figura 61. Distinción jerárquica entre las organizaciones fundamentales de archivos
2.1. Archivo secuencial
Tomada de Estructura de datos y organización de archivos, Loomis, 1995.
2.1. Archivo secuencial
En un
2.1. Archivo archivo secuencial los registros deben grabarse consecutivamente y leerse
secuencial
de la misma forma cuando el archivo se usa como entrada. La figura 62 ilustra lo
En un archivo secuencial los registros deben grabarse consecutivamente y leerse
descrito.
de lasecuencial
En un archivo misma forma cuandodeben
los registros el archivo se consecutivamente
grabarse usa como entrada. La figura
y leerse de la 62 ilustra
misma lo cuando el
forma
descrito.
archivo se usa como entrada. La figura 62 ilustra lo descrito.
Figura 62. Estructura de un archivo secuencial
Figura 62. Estructura de un archivo secuencial
Inicio del archivo Registro 1
Registro 2
Inicio del archivo Registro 1

Registro 2 N-1
Registro
… Registro N
Fin del archivo
Registro N-1
Fin del archivo Registro N

Tomada de Estructura de datos y organización de archivos, por Loomis,1995, p.


Figura 62. Estructura de un archivo secuencial
282.
Tomada de Tomada Estructura de datos
de Estructura y organización
de datos y organizacióndedearchivos,
archivos, porpor Loomis,1995,
Loomis,1995, p. 282. p.
282.
Por su propia naturaleza los archivos secuenciales se utilizan con mayor
Por su propiafrecuencia
naturaleza para procesamiento
los archivos secuencialespor lotes, con
se utilizan ya mayor
que todos los registros
frecuencia grabadospor lotes,
para procesamiento
Por su propia naturaleza los archivos secuenciales se utilizan con mayor
ya que todos deben ser leídos
los registros al momento
grabados deben ser deleídos
su utilización.
al momento de su utilización.
frecuencia para procesamiento por lotes, ya que todos los registros grabados
deben ser leídos al momento de su utilización.
Aunque su Aunque
aplicación suesaplicación
basta, es basta,
se suelen emplearse suelen emplear
en entornos en entornos
de carga de carga
de datos off-line; de datos
es decir, los usuarios
que generan off-line;
la data noes tienen
decir, acceso
los usuarios
directo al que generan
sistema la data no(por
de información tienen accesocognitivas,
limitaciones directo altécnicas,
Aunque su aplicación es basta, se suelen emplear en entornos de carga de datos
etc.), por losistema de información
que recurren a compartir los (por
datoslimitaciones cognitivas,
a través de archivos técnicas,
sencillos como los etc.), por lo que
mencionados (xls o txt).
off-line; es decir, los usuarios que generan la data no tienen acceso directo al
recurren
Posteriormente, a compartir los datos a través de archivos sencillos como los
sistemamediante aplicativos(por
de información pre-programados,
limitacionesse copia su contenido
cognitivas, técnicas, a laetc.),
base de pordatos central.
lo que
mencionados (xls o txt). Posteriormente, mediante aplicativos pre-programados,
recurren a compartir los datos a través de archivos sencillos como los
Ahora bien,seuncopia su organizado
archivo contenido secuencialmente
a la base de datos central.
puede estar compuesto solo por un tipo de registro, o
mencionados (xls o txt). Posteriormente, mediante aplicativos pre-programados,
pueden agruparse varios según se requiera, siempre y cuando tengan un propósito funcional y común y tengan
se copia su contenido a la base de datos central.
Ahora
relación lógica; bien,
para estounesarchivo
necesarioorganizado secuencialmente
que se adicione un campo quepuede permitaestar compuesto
diferenciarlos. solo ejemplo
Como
por
considereAhora un
que ademástipo de registro,
dearchivo o pueden
los datosorganizado agruparse
personales secuencialmente varios
de los empleados de según se
una empresa,requiera, siempre
se requiere y
mantener un
bien, un puede estar compuesto solo
historial de cuando
las tengan
unidades u un propósito
oficinas donde funcional
han prestado y común
sus y tengan
servicios. En relación
este caso, lógica;
el para
archivo ya esto
requiere dos
por un tipo de registro, o pueden agruparse varios según se requiera, siempre y
es necesario que se adicione un campo que permita diferenciarlos. Como ejemplo
tipos de formato:
cuando tengan un propósito funcional y común y tengan relación lógica; para esto
considere que además de los datos personales de los empleados de una empresa,
es necesario que se adicione un campo que permita diferenciarlos. Como ejemplo
se requiere mantener un historial de las unidades u oficinas donde han prestado
considere que además de los datos personales de los empleados de una empresa,
sus servicios. En este caso, el archivo ya requiere dos tipos de formato:
se requiere mantener un historial de las unidades u oficinas donde han prestado
sus servicios. En este caso, el archivo ya requiere dos tipos de formato:

126
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Formato de registro para datos personales de los empleados

Tipo de Número de Dirección

UNIDAD IV
Nombre Apellido Sexo Teléfono
registro empleado domiciliaria
1
1
Formato de registro para los datos de las unidades u oficinas

Tipo de registro Número de em- Nombre de la


Fecha de ingreso Fecha de salida
pleado oficina/unidad

Tema N.º 3
2
2
La principal ventaja que ofrece este tipo de archivos es su capacidad para acceder al “siguiente” registro de
manera rápida.
En el programa 3.1 se muestra cómo crear un archivo y guardar en él registros conformados por los siguientes
campos: nombre, apellido y edad de empleados; luego se recuperan y son mostrados en pantalla. Todo esto se
realiza de forma secuencial.

#include <iostream> Else


#include <fstream> cout<<”Error: El archivo no se pudo
#include <string> abrir”<<endl;
using namespace std; }

void main()
{ // LEER ARCHIVO
// Declarar campos del registro // -----------
char NombreEmp[20], ApellidoEmp[20];
int EdadEmp; ifstream lectura(“D:\RegistroEmpleado.txt”,
ios::out|ios::in);
// ESCRIBIR ARCHIVO
// ----------------- if (lectura.is_open())
// Solicitar los datos de 5 empleados y reg- {
istrarlos en un archivo txt lectura>>NombreEmp; // Leer primer reg-
for (int i=0; i<5; i++) istro
{
cout<<endl<<”Digite nombre del emplea- while (!lectura.eof()) // Recorrer el
do: “;cin>>NombreEmp; archivo
cout<<”Digite apellido del empleado: {
“;cin>>ApellidoEmp; lectura>>ApellidoEmp;
cout<<”Digite edad del empleado: lectura>>EdadEmp;
“;cin>>EdadEmp;
cout<<”Los datos del empleado
// Declarar un objeto vinculado al ar- son: “<<endl;
chivo cout<<NombreEmp<<” “<<Apelli-
ofstream escritura(“D:\RegistroEmplea- doEmp<<” “<<EdadEmp<<endl<<endl;
do.txt”, ios::out|ios::app);
lectura>>NombreEmp; // Leer
if (escritura.is_open()) // Abrir el siguiente registro
archivo y verificar que tal proceso }

fue exitoso. }
{
// Guardar datos en el archivo escritura.close();
escritura<<NombreEmp<<” “<<Apel- lectura.close();
lidoEmp<<” “<<EdadEmp<<endl;
} system(“Pause”);
}

Programa 3.1

127
Consideraciones técnicas sobre el código
En C++ la librería que permite acceder a archivos externos es “fstream” y trabaja creando objetos que apuntan
UNIDAD IV

a tales archivos. Por ejemplo, la instrucción “ofstream” (“o” inicial de output) abre un archivo de modo tal que se
pueda escribir en él; por su parte “ifstream” (“i” inicial de input) abre un archivo en modo lectura.
La sintaxis de ambas instrucciones es similar:
[instrucción]<nombre de objeto> (<ruta de archivo>, parámetros)
Donde:
• 
<nombre de objeto>: Representa el nombre del objeto que se creará (como si de cualquier otro tipo de
variable se tratara).
Tema N.º 3

• 
<ruta de archivo>: Permite especificar la ruta, el nombre y la extensión del archivo externo al cual se acce-
derá.
• Parámetros: Conjunto de valores para indicar el tipo de acceso al archivo. Por ejemplo:

ios::out|ios::in Abre un archivo en modo lectura.

ios::out Crea el archivo con la ruta y nombre especificados


y lo habilita para escritura. Si el archivo ya existe, lo
sobrescribe.

ios::out|ios::app Crea el archivo con la ruta y nombre especificados


y los habilita para escritura. Si el archivo ya existe,
únicamente lo abre para agregar información (no
borra lo anterior.)

Para guardar y recuperar información propiamente desde un archivo, se emplean los operadores “<<” y “>>”
respectivamente, tal como se utilizan para imprimir e ingresar información a una aplicación con cout y cin.

2.2. Archivo relativo


Se emplea cuando existe la necesidad de acceder individual y directamente a cada registro del archivo. En estos
tipos de archivo, existe una relación predecible entre la llave usada para identificar a cada registro y la localización
del mismo.
De forma similar a como operan las tablas Hash (vistas al inicio de esta unidad), cuando se crea un archivo relati-
vo debe establecerse una relación que será utilizada para obtener una dirección física a partir de un valor llamado
“llave”. Esta relación, llamada R, es una función de mapeo.
Entonces, al momento de grabar un registro en el archivo relativo, la función de mapeo R se usa para traducir el
valor llave a una dirección, la cual indica dónde deberá almacenarse el registro; lo mismo si desea recuperarse
un determinado valor.
Es preciso destacar que, a diferencia del archivo secuencial, en un archivo relativo se puede acceder directamen-
te al registro deseado, sin necesidad de hacerlo de forma serial. Esta característica permite emplearlo normal-
mente en procesos interactivos.
Loomis (1995) describe el siguiente ejemplo: “Considere un sistema bancario en línea, para el cual los cajeros
tienen terminales y acceso directos a las cuentas de clientes. Un archivo maestro simple podría tener registros
con el siguiente formato” (p. 342):
Archivo: Cuenta
Fecha de último Fecha último
Número de cuenta Tipo de cuenta Saldo
retiro depósito

128
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Suponga que el archivo “Cuenta” es de tipo relativo, con su llave “Número de cuenta”. Por su parte, la informa-
ción que registra el cajero por cada transacción tiene el siguiente formato:

UNIDAD IV
Archivo: Transacción

Número de cuenta Tipo de transacción Monto Fecha

Cuando el cajero ha atendido una transacción, esta se registra en el archivo del mismo nombre. A continuación,
esta información se emplea para recuperar o actualizar datos en el archivo “Cuenta”:
•  “Tipo de transacción” es “Información” entonces, a través de “número de cuenta”, se ubica el registro
Si

Tema N.º 3
correspondiente en “Cuenta” y se extraen los datos requeridos. Por ejemplo, Saldo y Fecha de último
retiro.
• Si “Tipo de transacción” es “Retiro” o “Depósito”, entonces, a través de “Número de cuenta”, se ubica el
registro correspondiente en “Cuenta” y se actualizan los campos respectivos.
Note que no es necesario acceder a todos los registros de “Cuenta”, sino directamente al objetivo.
Finalmente, entonces la principal ventaja que ofrece un archivo relativo es la habilidad para acceder a un registro
determinado de forma individual y directa. Eso quiere decir que la recuperación, inserción, modificación o hasta
borrado de un determinado registro no afecta en nada a los demás.
El programa 3.2 muestra cómo escribir y leer en un archivo de tipo relativo.

#include <iostream> // Si el nuevo Id debe ser insertado


#include <fstream> después del último registro conocido
#include <string> else
using namespace std; {
count = 0;
void main() while(!lectura.
eof())
{
{
// Variables para leer registros
count++;
char NombreEmp[20], ApellidoEmp[20];
lectura.
int IdEmp, EdadEmp; getline(cadena,80);
auxilia-
// Variables para el nuevo registro r<<cadena;
char NombreEmpNuevo[20], ApellidoEmp- if
Nuevo[20]; (count<=UltimoIdEmp)
int IdEmpNuevo, EdadEmpNuevo;
auxiliar<<endl;
// Variables para el programa }
char cadena[80]; int count=0, Ulti-
moIdEmp;
for (int
i=1;i<IdEmpNuevo-UltimoIdEmp;i++)
auxilia-
// Declarar objetos vinculados a los r<<endl;
archivos
ifstream lectura(“D:\RegistroEm-
pleadoRelativo.txt”, ios::out|ios::in); auxilia-
r<<IdEmpNuevo<<” “<<NombreEmpNue-
ofstream auxiliar(“D:\RegistroAuxiliar. vo<<””<<ApellidoEmpNuevo <<” “<<EdadEmp-
txt”, ios::out|ios::app); Nuevo<<endl;

}
}

lectura.close();
auxiliar.close();
remove(“D:\RegistroEmpleadoRelativo.
txt”);

129
// ---------------- rename(“D:\RegistroAuxiliar.txt”,”D:\Reg-
// Ingresar los datos de 5 personas istroEmpleadoRelativo.txt”);
UNIDAD IV

for (int i=0; i<5; i++) }


{ else
// Solicitar datos al usuario {
cout<<” REGISTRO DE NUEVO EMPLEA- cout<<”Error: El archivo no
DO “<<endl; se pudo abrir”<<endl;
cout<<”---------------------------- }
----”<<endl<<endl; }
cout<<”Digite Id: “;cin>>IdEmpNue-
vo; // IMPRIMIR REGISTROS
cout<<”Digite Nombre: “;cin>>Nom-
Tema N.º 3

ifstream lectura1(“D:\RegistroEm-
breEmpNuevo; pleadoRelativo.txt”, ios::out|ios::in);
cout<<”Digite Apellido: “;cin>>A-
pellidoEmpNuevo;
lectura1>>IdEmp;
cout<<”Digite Edad: “;cin>>EdadEmp-
Nuevo; while (!lectura1.eof())
{
if (lectura.is_open()) lectura1>>NombreEmp>>Apelli-
doEmp>>EdadEmp;
{
cout<<endl<<”Id Empleado:
lectura>>UltimoIdEmp; “<<IdEmp<<endl;
while(!lectura.eof()) cout<<”Nombre: “<<NombreEmp<<endl;
{ cout<<”Apellido: “<<Apelli-
lectura>>Nombre- doEmp<<endl;
Emp>>ApellidoEmp>>EdadEmp; cout<<”Edad: “<<EdadEmp<<endl;
count++; lectura1>>IdEmp;
lectura>>UltimoIdEmp; }
} lectura1.close();
lectura.close();
// ESCRIBIR ARCHIVO //LEER ARCHIVO (En esta ocasión el usu-
ario decide que registro imprimir)
// Reabrir el archivo (para //------------
que se posicione nuevamente en el primer lectura1.open(“D:\RegistroEmpleadoRela-
registro) tivo.txt”, ios::out|ios::in);
lectura.open(“D:\RegistroEm- int IdEmpBuscado;
pleadoRelativo.txt”,ios::out|ios::in); bool encontrado=false;

// Si el archivo aún no cout<<endl<<”Digite el códi-


tiene registros go de empleado que desea visualizar:
if (count==0) “;cin>>IdEmpBuscado;
{
// Agregar saltos de lectura1>>IdEmp;
línea hasta el nro de fila correspondiente while(!lectura1.eof())
y a continuación el nuevo registro
{
for (int i=1;i<IdEmp-
Nuevo;i++) lectura1>>NombreEmp>>Apelli-
doEmp>>EdadEmp;
auxiliar<<endl;
if (IdEmp==IdEmpBuscado)
auxiliar<<IdEmpNue-
vo<<” “<<NombreEmpNuevo<<” “ <<Apelli- {
doEmpNuevo<<” “<<EdadEmpNuevo<<endl; encontrado = true;
} cout<<endl<<”Id Empleado:
// Si el archivo ya tiene “<<IdEmp<<endl;
registros
else
{

130
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

// Si el nuevo Id es //LEER ARCHIVO (En esta ocasión el usuario decide


menor al Id del último empleado
// Si el archivo
if (count==0)
aún no tiene registros

que registro imprimir)
cout<<”Nombre: “<<Nombre-
//------------

UNIDAD IV
{ if (IdEmpNuevo < Ul- Emp<<endl;
lectura1.open("D:\RegistroEmpleadoRelativo.txt",
timoIdEmp) // Agregar saltos de línea hasta el nro
de fila correspondiente y a continuación el nuevo
ios::out|ios::in);
cout<<”Apellido: “<<Apelli-
int IdEmpBuscado;
{ registro doEmp<<endl;
bool encontrado=false;
for (int i=1;i<IdEmpNuevo;i++)
count auxiliar<<endl; = 0; cout<<”Edad:
cout<<endl<<"Digite el código de empleado que desea
while(!lectura. auxiliar<<IdEmpNuevo<<" “<<EdadEmp<<endl;
visualizar: ";cin>>IdEmpBuscado;
"<<NombreEmpNuevo<<" " <<ApellidoEmpNuevo<<"
eof()) "<<EdadEmpNuevo<<endl; lectura1>>IdEmp;
}
{ }
// Si el archivo ya tiene registros
while(!lectura1.eof())
{
lectura1>>IdEmp;
count++; else } lectura1>>NombreEmp>>ApellidoEmp>>EdadEmp;
{ if (IdEmp==IdEmpBuscado)
// Si el nuevo Id es menor al Id del {
if último empleado if (!encontrado)
encontrado = true;

Tema N.º 3
if (IdEmpNuevo < UltimoIdEmp) cout<<endl<<"Id Empleado: "<<IdEmp<<endl;
(count==IdEmpNuevo){ cout<<”El Id ingresado
cout<<"Nombre: no ex-
"<<NombreEmp<<endl;
count = 0;
while(!lectura.eof())
iste”<<endl;cout<<"Apellido: "<<ApellidoEmp<<endl;
cout<<"Edad: "<<EdadEmp<<endl;
auxiliar<<IdEmpNuevo<<” { “<<NombreEmpNue- }
vo<<” “<<ApellidoEmpNuevo <<” “<<EdadEmp-
count++; lectura1>>IdEmp;
Nuevo; system(“Pause”);
}
if (count==IdEmpNuevo)
else auxiliar<<IdEmpNuevo<<"
} if (!encontrado)
"<<NombreEmpNuevo<<" "<<ApellidoEmpNuevo <<" cout<<"El Id ingresado no existe"<<endl;
{ "<<EdadEmpNuevo;
else system("Pause");
lectura.getline(cadena,80); {
lectura.getline(cadena,80);
}

auxiliar<<cadena<<endl;
auxiliar<<cadena<<endl; }
}

} lectura.close();
}
}
lectura.
Programa 3.2
close();
}
Para probar este código, es necesario que el archivo “RegistroEmpleadoRelativo.txt”
ya exista en la ruta indicada. Como habrá notado, en este caso el proceso de inserción
de un nuevo registro es más complejo; esto debido a que ahora puede ubicarse en
Programa 3.2cualquier parte del archivo y ya no solamente al final como sucedía con los archivos
secuenciales. Otra consideración a tomar en cuenta es que en este ejemplo se
Para probaremplean
este código,
dosesarchivos:
necesario“RegistroEmpleadoRelativo”
que el archivo “RegistroEmpleadoRelativo.txt” ya existaelenmotivo
y “RegistroAuxiliar”; la ruta es
indica-
da. Como habrá
que con C++ (y los métodos mostrados) no es posible modificar el contenidodebi-
notado, en este caso el proceso de inserción de un nuevo registro es más complejo; esto
do a que ahora puede ubicarse
intermedio de un en cualquier
archivo; parte
por del archivo
ejemplo, y ya noelsolamente
agregar registro alnúmero
final como sucedía con
5 cuando ya los
archivos secuenciales.
existen 1 Otra consideración
y 10. Lo que ase tomar
haceen cuenta es que enlínea
es trasladar este ejemplo
a líneaseelemplean dos archivos:
contenido de
“RegistroEmpleadoRelativo” y “RegistroAuxiliar”;
“RegistroEmpleadoRelativo” el motivo
a “Registro es que y,
auxiliar” concuando
C++ (y selos llega
métodos mostrados)
al Id del nuevo no es
registro,
posible modificar se procede
el contenido a reemplazar
intermedio su contenido
de un archivo; con los
por ejemplo, nuevos
agregar datos.número
el registro Finalmente,
5 cuandoel ya
existen 1 y archivo
10. Lo queoriginal
se haceeses eliminado y “Registro
trasladar línea auxiliar”dees“RegistroEmpleadoRelativo”
a línea el contenido renombrado tomando ela lugar “Registro
auxiliar” y, cuando se llega al Id del nuevo registro, se procede a reemplazar sulocontenido
de aquel. La figura siguiente representa de mejor manera descrito.con los nuevos datos.
Finalmente, el archivo original es eliminado y “Registro auxiliar” es renombrado tomando el lugar de aquel. La
Figura
figura siguiente 63. Proceso
representa de inserción
de mejor manera lo descrito.de un nuevo registro en una posición
intermedia de un archivo relativo

Registro 1 Registro 1
Registro 2 Registro 2
<En blanco> Registro 3(Nuevo) <En blanco>
… …
Registro N Registro N
RegistroEmpleadoRelativo.txt RegistroAuxiliar.txt

Finalmente,
Figura con
63. Proceso este tipo
de inserción de de acceso
un nuevo a archivos
registro el usuario
en una posición eligedea un
intermedia qué registro
archivo relativodesea
acceder.

Finalmente, con2.3.Archivo
este tipo de acceso a archivos
secuencial el usuario elige a qué registro desea acceder.
indexado

Para imaginar el funcionamiento de este tipo de archivos, considere un diccionario


con un conjunto de lengüetas que proporcionan un índice al conjunto de palabras
organizadas de forma secuencial. Para encontrar una palabra en particular, por
ejemplo, “Programación”, normalmente no recorre todo el diccionario desde la
131
2.3. Archivo secuencial indexado
primera página. Ende lugar de eso, selecciona una lengüeta en con
particular, en este
UNIDAD IV

Para imaginar el funcionamiento este tipo de archivos, considere un diccionario un conjunto de lengüetas
caso la “P”, para dirigir la búsqueda a la sección más próxima a la palabra en el
que proporcionan un índice al conjunto de palabras organizadas de forma secuencial. Para encontrar una palabra
conjunto de datos. Ubicado en esta sección, nuevamente, la búsqueda no empieza
en particular, por ejemplo, “Programación”, normalmente no recorre todo el diccionario desde la primera página.
desde la primera palabra con “P”, sino que se busca en los encabezados que
En lugar de eso, selecciona una lengüeta en particular, en este caso la “P”, para dirigir la búsqueda a la sección
indican la primera y última palabra de cada página. Ya en la página respectiva,
más próxima a la palabra
recién empieza en eluna
conjunto de datos.
búsqueda Ubicado hasta
secuencial en estalasección,
palabra nuevamente,
deseada. la búsqueda no empie-
za desde la primera palabra con “P”, sino que se busca en los encabezados que indican la primera y última palabra
de cada página.
Para Ya el en la página respectiva,
funcionamiento recién
de este tipoempieza una búsqueda
de estructuras ya sonsecuencial hasta
necesarios la archivos:
dos palabra deseada.
un archivo índice y el archivo de datos propiamente. Observe la siguiente figura:
Tema N.º 3

Para el funcionamiento de este tipo de estructuras ya son necesarios dos archivos: un archivo índice y el archivo
de datos propiamente.
Figura 64.ObserveEjemplo la siguiente
y partes figura:
de una estructura de archivo indexado

Funete: Elaboración propia.


Figura 64. Ejemplo y partes de una estructura de archivo indexado
El programa 3.3 muestra cómo implementar archivos
Fuente: Elaboración propia. indexados a partir del ejemplo
mostrado en la figura 64.
El programa 3.3 muestra
#include cómo implementar archivos indexados
<iostream> //Si el anuevo
partirregistro
del ejemplo
estámostrado
después en
della figura 64.
#include <fstream> último registro existente
using namespace std; else
#include <iostream> //Si{ el nuevo registro está después del
void <fstream>
#include main() último count=0;
registro existente
{ whileelse (!diccionario.eof())
using namespace std;
// Variables para el diccionario {
int IdPalabra; { count++;
char palabra[20];
void main() count=0;
diccionario.getline(cadena,80);
while (!diccionario.eof())
{ // Variables para el indice dicAuxiliar<<cadena;
// Variables para el diccionario
char IdEntrada; if (count<=ultimoId)
{
int IdMin, IdMax;
int IdPalabra; count++; dicAuxiliar<<endl;
}
diccionario.getline(-
char //
palabra[20];
Variables para el nuevo registro cadena,80);
int IdNuevaPalabra; for (int i=1;i<IdMinE-
char PalabraNueva[20];
dicAuxiliar<<cadena;
ultimoId;i++)
// Variables para el indice
if (count<=ultimoId)
dicAuxiliar<<endl;
char //
IdEntrada;
Variables para el funcionamiento del dicAuxilia-
intprograma
IdMin, IdMax; dicAuxiliar<<IdNuevaPalabra<<"
r<<endl;
char IdEntradaB, cadena[100]; "<<PalabraNueva<<endl;
int IdMinE=0, IdMaxE=0, count=0,
}
}
// ultimoId=0;
Variables para el nuevo registro diccionario.close();
int IdNuevaPalabra;
bool empiezaConteo=false; dicAuxiliar.close();
char PalabraNueva[20]; }
ifstream indice ("D:\indice.txt",
ios::out|ios::in); else // Si la sección ya existe
ifstream diccionario {
("D:\diccionario.txt", ios::out|ios::in);
ofstream dicAuxiliar diccionario.open("D:\diccionario.txt",
("D:\DicAuxiliar.txt", ios::out|ios::in);
ios::out|ios::out);
count=0;
while (!diccionario.eof())
132
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

UNIDAD IV
for (int i=1;i<IdMinE-ulti-
// Variables para el funcionamiento del moId;i++)
programa dicAuxiliar<<endl;
char IdEntradaB, cadena[100];
int IdMinE=0, IdMaxE=0, count=0, ulti- dicAuxiliar<<IdNuevaPal-
moId=0; abra<<” “<<PalabraNueva<<endl;
bool empiezaConteo=false; }
diccionario.close();
ifstream indice (“D:\indice.txt”, dicAuxiliar.close();

Tema N.º 3
ios::out|ios::in); }
ifstream diccionario (“D:\diccionario.
txt”, ios::out|ios::in);
else // Si la sección ya existe
ofstream dicAuxiliar (“D:\DicAuxiliar.
txt”, ios::out|ios::out); {
diccionario.open(“D:\diccionario.
txt”, ios::out|ios::in);
cout<<”Digite la palabra a insertar:
“;cin>>PalabraNueva;
IdEntradaB = PalabraNueva[0]; // Cap- count=0;
turar el primer carácter (para posterior- while (!diccionario.eof())
mente buscarlo en el archivo índice) {
count++;
if (count==IdNuevaPalabra)
// ESCRIBIR EN EL ARCHIVO dicAuxiliar<<IdNue-
// ---------------------- vaPalabra<<” “<<PalabraNueva;
else
// Determinar el rango (IdMinE e Id- {
MaxE) donde se insertará la nueva palabra diccionario.getline(-
if (indice.is_open()) cadena, 80);
{ dicAuxiliar<<cade-
indice>>IdEntrada; na<<endl;
while (!indice.eof()) }
{ }
indice>>IdMin>>IdMax; diccionario.close();
if (IdEntradaB == IdEntrada) dicAuxiliar.close();
{ IdMinE = IdMin; Id- }
MaxE = IdMax; break; }
indice>>IdEntrada; remove(“D:\diccionario.txt”);
rename(“D:\DicAuxiliar.txt”, “D:\dic-
} cionario.txt”);
indice.close();
} // LEER EL ARCHIVO
else // ----------------------
cout<<”El archivo ‘Indice.txt’ no char palabraBuscada[20];
se pudo abrir”<<endl; cout<<endl<<”Digite la palabra a bus-
car: “;cin>>palabraBuscada;

133
en la sección que le corresponde bool encontrado=false;
if (diccionario.is_open()) int idencontrado=0;
UNIDAD IV

{
count=0; // Capturar el índice de la palabra
diccionario>>IdPalabra; (primera letra)
while (!diccionario.eof()) IdEntradaB = palabraBuscada[0];
{
// Determinar el rango (IdMinE e Id-
diccionario>>palabra; MaxE) donde se buscará la palabra
ifstream indice1(“D:\indice.txt”,
if (IdPalabra == IdMinE) ios::out|ios::in);
empiezaConteo=true;
Tema N.º 3

if (empiezaConteo) if (indice1.is_open())
if (IdPalabra<=Id- {
MaxE) indice1>>IdEntrada;
count++; while (!indice1.eof())
else {
empiezaConteo=- indice1>>IdMin>>IdMax;
false;
if (IdEntradaB == IdEntrada)
{ IdMinE = IdMin; Id-
diccionario>>IdPalabra; MaxE = IdMax; break; }
} indice1>>IdEntrada;
} }
else indice1.close();
cout<<”El archivo ‘diccionario.txt’ }
no se pudo abrir”<<endl;
else
diccionario.close();
cout<<”El archivo ‘Indice.txt’ no
se pudo abrir”<<endl;
// Capturar Id de la nueva palabra
IdNuevaPalabra = IdMinE + count; // Buscar la palabra
ifstream diccionario1 (“D:\diccionario.
if (count==10) // Si la sección está txt”, ios::out|ios::in);
llena (En este ejemplo cada sección acep-
ta un máximo de 10 palabras)
if (diccionario1.is_open())
cout<<”La seccion está
llena”<<endl; {
diccionario1>>IdPalabra;
// Insertar el nuevo dato while (!diccionario1.eof())
{
else if (count==0) // Si la sección aún diccionario1>>palabra;
no ha sido creada (No contiene palabra // Buscar solo en la sección
alguna) correspondiente
{ if(IdPalabra>=IdMinE && Id-
diccionario.open(“D:\diccionario. Palabra<=IdMaxE)
txt”, ios::out|ios::in); {
// Determinar ultimo id registrado if (strcmp(pal-
if (diccionario.is_open()) abra,palabraBuscada)==0)
{ { idencontrado
=IdPalabra; encontrado=true; }
diccionario>>ultimoId;
}
while(!diccionario.eof())
diccionario1>>IdPalabra;
{
}

134
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

// Determinar el ID de la nueva pal- if (encontrado)


abra { cout<<”Palabra encontrada en la

UNIDAD IV
diccionari- posición [“<<idencontrado<<”]”<<endl; }
o>>palabra; else
count++; { cout<<”No se encontró ninguna
diccionario>>ulti- coincidencia”<<endl; }
moId; }
} else
} cout<<”No se pudo abrir el archivo
diccionario.close(); ‘Diccionario.txt’”<<endl;
// Si el nuevo registro está antes del

Tema N.º 3
último registro existente system(“Pause”);
diccionario.open(“D:\diccionario. }
txt”, ios::out|ios::in);
if (IdMinE<ultimoId)
{
count=0;
while(!diccionario.eof())
{
count++;

if (count==IdMinE)
dicAuxilia-
r<<IdNuevaPalabra<< “ “<<PalabraNueva;
else
{
diccionario.
getline(cadena,80);
dicAuxiliar<<-
cadena<<endl;
}
}
}

Programa 3.3

Los métodos empleados para la inserción de nuevos registros son similares a los de los archivos secuenciales,
con la excepción que primero se determina el rango (IdMinE e IdMaxE) donde le corresponde grabarse.

El código para recuperar un registro específico sí es totalmente diferente, ya que la búsqueda debe centrarse
únicamente en la sección que le concierne. Si bien la instrucción while (!diccionario1.eof())recorre todo el archivo,
solo compara aquellas palabras que se encuentran entre IdMinE e IdMaxE.

2.4. Archivo multi-llave


“Existen numerosas técnicas que han sido utilizadas para implantar archivos multillave. La mayoría de estos
métodos están basados en la construcción de índices para proporcionar acceso directo mediante el valor de las
llaves” (Loomis, 1995, p. 446). Gracias a esta ventaja, es posible elaborar listados de datos contenidos en el
archivo de manera rápida.
Estructuralmente son similares a los archivos indexados, ya que trabajan con dos ficheros: uno que contiene los
índices y un segundo para los datos propiamente dichos.
Los métodos que se verán a continuación son dos:
a) La organización mediante inversión
b) La organización multilista

135
2.4.1. Organización de archivos mediante inversión
En este caso, el “archivo índice” contiene en cada fila el valor de una llave y a continuación una lista del conjunto
UNIDAD IV

de claves donde se puede encontrar esa llave en el “archivo de datos”. En términos gráficos, cada registro del
“archivo índice” apunta a uno o varios registros del “archivo de datos”. Observe la siguiente figura:
Tema N.º 3

Figura 65. Ejemplo de una estructura de archivos mediante inversión.


Elaboración propia.
¡Ten en cuenta!

Cuando el “archivo índice” apunta a los registros del “archivo de datos” donde coincide la llave, se dice que el
archivo de datos está “invertido sobre esa llave”.

Puede existir un archivo índice por cada columna a la cual se desee tener acceso directamente. Es debido a esta
cualidad que se le conoce a este tipo de organización como multillave.

Un algoritmo propuesto para la lectura de los registros se muestra en las siguientes líneas:
void listar_por_categoria(int categoría)
{
cargar_archivo(“índice”);
Ids_registros[] = recuperar_ids(categoría);

cargar_archivo(“datos”);

indice = 0;

mientras(índice != NULL)
{
imprimir_registro_Nro(Ids_registros[índice]);
índice = siguiente_indice(índice);
}
}

Respecto a su implementación en C++, como podrá notar, estimado estudiante, las técnicas son las mismas
que las empleadas para los archivos indexados, por lo que lo invitamos a implementar el ejemplo de la figura 65
y a verificar su funcionamiento.

2.4.2. Organización de archivos multilista

Por su parte, en este tipo de organización, cada fila del “archivo índice” apunta solo al primer registro del “archivo
de datos” donde aparece la llave; este tiene un puntador al segundo y así sucesivamente. En palabras de Loomis
(1995), las diferencias saltan a la vista:

136
un puntador al segundo y así sucesivamente. En palabras de Loomis (1995), Estructura
las de Datos
MANUAL AUTOFORMATIVO INTERACTIVO
diferencias saltan a la vista:

La organización multilista difiere de la de inversión en que, mientras que la


entrada en el índice de inversión para un valor de llave tiene un apuntador a
cada registro de datos (…), la entrada en el índice multilista (…) tiene un solo
La organización multilista
apuntador difiere registro
al primer de la de inversión
de datos.en que, mientras que la entrada en el índice de inver-
sión para p.
un 455
valor de llave tiene un apuntador a cada registro de datos (…), la entrada en el índice multilista

UNIDAD IV
(…) tiene un solo apuntador al primer registro de datos.
La figura siguiente intenta esclarecer este último tipo de organización continuando
p. 455con el ejemplo ya tratado.

La figura siguiente
Figuraintenta esclarecer
66. Archivo este último
índice tipo dede
y archivo organización continuando con el ejemplo ya tratado.
datos trabajador

Archivo índice Archivo de datos


“Categoría de trabajador” “Trabajador”
Categoría Siguiente
Señalador de
Llave Id de registro Nombre Edad
registro

Tema N.º 3
trabajador (Categoría)
15 1 1 15 2 Eva 24
23 4 2 15 8 Edmundo 24
31 3 3 31 5 Roy 31
4 23 6 Miguel 19
5 31 NULL Mónica 23
6 23 7 Paul 22
7 23 9 Reynaldo 23
8 15 NULL Carla 31
9 23 NULL Laura 19

Claro está que la Figura


organización
66. Archivomultilista requiere
índice y archivo de datosde una columna adicional por
trabajador
cada tipo de llave que se desee emplear.
Claro está que la organización multilista requiere de una columna adicional por cada tipo de llave que se desee
Un algoritmo que permite recuperar toda la información para una determinada
emplear.
llave es el siguiente:
Un algoritmo que permite recuperar toda la información para una determinada llave es el siguiente:
void listar_por_categoría(int categoría)
void listar_por_categoría(int categoría)
{
{ cargar_archivo(“índice”);
cargar_archivo(“índice”);
Id_primer_registro = Primer_Id(categoría);
Id_primer_registro = Primer_Id(categoría);
cargar_archivo(“datos”);
cargar_archivo(“datos”);
imprimir_registro_Nro(Id_primer_registro);
leer_siguiente_registro_de(Id_primer_registro);
imprimir_registro_Nro(Id_primer_registro);
mientras(siguiente_registro != NULL)
leer_siguiente_registro_de(Id_primer_registro);
{
mientras(siguiente_registro != NULL)
imprimir_registro_Nro(siguiente_registro);
{ siguiente_registro = leer_siguiente_registro_de(siguiente_registro);
}
imprimir_registro_Nro(siguiente_registro);
}
siguiente_registro = leer_siguiente_registro_de(siguiente_registro);
}
}
Lectura seleccionada n.º 04: Sistemas de bases de datos frente a sistemas
de archivos

Leer el apartado 1.2. “Sistemas de bases de datos frente a sistemas de archivos”


Lectura seleccionada n.º 04
(pp. 2-3).

Silberschatz, A., Korth, H. & Sudarshan S. (2002). Fundamentos de bases de datos.


Sistemas de bases de España:
Madrid, datos frente a sistemas de archivos
McGRAW-HILL/Interamericana de España, S. A. U. Disponible

Leer el apartado 1.2. “Sistemas de bases de datos frente a sistemas de archivos” (pp. 2-3).

Silberschatz, A., Korth, H. & Sudarshan S. (2002). Fundamentos de bases de datos. Madrid, España: Mc-
GRAW-HILL/Interamericana de España, S. A. U. Disponible en https://unefazuliasistemas.files.wordpress.
com/2011/04/fundamentos-de-bases-de-datos-silberschatz-korth-sudarshan.pdf

137
Actividad N.º 4
UNIDAD IV

Foro de discusión sobre tablas Hash

Instrucciones:

a) Implemente una aplicación que ejecute los tres métodos para evitar colisiones: exploración lineal, explo-
ración cuadrática y dispersión doble.
Tema N.º 3

b) Pruebe cada método con un arreglo relativamente grande (mayor a 100), llenándolo por lo menos a la mitad
de su capacidad. Anote el número de colisiones presentadas.

c) Ingrese al foro y participe respondiendo las siguientes preguntas:

¿Cuál de los tres métodos distribuye de forma más uniforme los datos?

¿A qué se debe esta diferencia? Explique.

Actividad N.º 5
Foro de discusión sobre modelo relacional y gestión de archivos

Instrucciones:

a) Repase la lectura seleccionada n.º 1.

b) Ingrese al foro y participe respondiendo las siguientes preguntas:

Mencione 3 ventajas y 3 desventajas de emplear el modelo relacional como almacén de datos.

Mencione 3 ventajas y 3 desventajas de emplear la gestión de archivos como método de almacén de


datos.

c) Mencione un caso real en el que sea más adecuado emplear el modelo relacional, y otro caso, en el que
sea más adecuado emplear la gestión de archivos.

138
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Glosario de la Unidad IV

UNIDAD IV
C
Cardinalidad, razón de. Expresa el número de entidades a las que otra entidad puede estar asociada vía un
conjunto de relaciones. (Silberschatz, Abraham & Korth, Henry, Sudarshan, S. Fundamentos de base de datos).

Tema N.º 3
Entidad. Una entidad es una cosa u objeto en el mundo real que es distinguible de todos los demás objetos.
(Silberschatz, Abraham & Korth, Henry, Sudarshan, S. Fundamentos de base de datos)

F
 unción. Relación entre dos conjuntos que asigna a cada elemento del primero un elemento del segundo o
F
ninguno. (Diccionario de la Real Academia Española)

I
Interactuar. Actuar recíprocamente. (Diccionario de la Real Academia Española)

M
Modelo. Esquema teórico, generalmente en forma matemática, de un sistema o de una realidad compleja,
como la evolución económica de un país, que se elabora para facilitar su comprensión y el estudio de su com-
portamiento. (Diccionario de la Real Academia Española).

O
Organizar. Poner algo en orden. Diccionario de la Real Academia Española

R
Relación. Es una asociación entre diferentes entidades. (Silberschatz, Abraham & Korth, Henry, Sudarshan, S.
Fundamentos de base de datos).

139
Bibliografía de la Unidad IV
UNIDAD IV

Aho, A., Ullman, J. & Hopcroft, J. (1983). Data structures and algorithms. Nueva Delhi: Pearson Education.

Cairo, O. y Guardati, S. (2010). Estructuras de datos (3.ª ed.). México: Editorial McGraw Hill.

Charles, S. (2009). Python para informáticos: Explorando la información.

Cruz, D. (s.f.). Apuntes de la asignatura: Estructura de datos. México: Tecnológico de Estudios Superiores de
Tema N.º 3

Ecatepec. Disponible en http://myslide.es/documents/manual-estructura-de-datos.html

Frittelli, V., Steffolani, F., Harach, J., Serrano, D., Fernández, J., Scarafia, D., Teicher, R., Bett, G., Tartabini, M. &
Strub, A. (s.f). Archivos Hash: Implementación y aplicaciones. Universidad Tecnológica Nacional, Facultad
Regional Córdoba. Disponible en http://conaiisi.unsl.edu.ar/2013/121-493-1-DR.pdf

Joyanes, L. y Zahonero, I. (2003). Programación en C. Metodología, algoritmos y estructura de datos. Málaga,


España: McGraw Hill.

Loomis, M. E. (1995). Estructura de datos y organización de archivos. México: Prentice-Hall Hispanoamericana.

López, J. C. (2002). Tablas Hash. Universidad del Valle. Colombia. Disponible en http://ocw.univalle.edu.co/ocw/
ingenieria-de-sistemas-telematica-y-afines/fundamentos-de-analisis-y-diseno-de-algoritmos/material/hash.
pdf

Mehta, D. P., & Sahni, S. (2005). Handbook of Data Structures and Applications. Florida, U.S.A.: Editorial Chap-
man & Hall/CRC. Disponibe en http://www.e-reading.club/bookreader.php/138822/Mehta_-_Handbook_of_
Data_Structures_and_Applications.pdf

Pérez, J. (2004). Matemáticas. Instituto Nacional de Tecnologías Educativas y de Formación del Profesorado.
España. Disponible en http://sauce.pntic.mec.es/~jpeo0002/Archivos/PDF/T06.pdf

Sahni, S. (2005). Data Structures, Algorithms, and Applications in C++ (2.ª ed.) Hyderabad, India: Universities
Press.

Silberschatz, A., Korth, H. & Sudarshan S. (2002). Fundamentos de bases de datos. Madrid, España: Mc-
GRAW-HILL/Interamericana de España, S. A. U. Disponible en https://unefazuliasistemas.files.wordpress.
com/2011/04/fundamentos-de-bases-de-datos-silberschatz-korth-sudarshan.pdf

Weiss, M. (1995). Estructura de datos y algoritmos. EE. UU.: Addison-Wesley Iberoamericana.

140
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

Autoevaluación N.º 4

UNIDAD IV
1. En una tabla hash, el tiempo de recuperación de la información es

a. Constante

b. Variable

Tema N.º 3
c. Inmediata

d. Superior a cualquier otro método

2. Conjunto de operaciones matemáticas que permiten escribir/leer datos en una tabla Hash.

a. Fórmula polinómica

b. Función de dispersión

c. Fórmula Hash

d. Función de cálculo

3. No es una característica del método de dispersión abierta.

a. Opera con un arreglo de punteros.

b. Los elementos que colisionan forman una lista enlazada.

c. Tiene límite máximo permitido de elementos.

d. Para buscar un elemento se recorre la lista correspondiente.

4. El modelo entidad-relación:

a. Es la estructura de una base de datos

b. Es un repositorio de datos volátil

c. Se diseña directamente desde la realidad

d. Está conformado por tablas y relaciones

5. Es un ejemplo de entidad y atributo (en ese orden)

a. Nombre – Alumno

b. Vehículo–camión

c. Teclado–Componente

d. Persona – nombre

141
6. No es una cualidad de un atributo principal en una base de datos:

a. Representa unívocamente a cada registro.


UNIDAD IV

b. Sus valores no se repiten.

c. Sus valores no pueden ser nulos.

d. Sus valores siempre son lógicos


Tema N.º 3

7. El modelo físico de base de datos es

a. Una consecuencia del modelo entidad-relación

b. Un diagrama hecho a base de rombos, elipse y rectángulos

c. Un conjunto de entidades

d. Un medio de comunicación entre la aplicación y los datos

8. Son tipos de archivos según la función que cumplen en un sistema de información:

i. Archivo de reporte

ii. Archivo de trabajo

iii. Archivo de programa

iv. Archivo maestro

a. i

b. i y iii

c. ii y iv
d. i y iv

9. Correlacione cada tipo de archivo con su definición o características particulares:

A Archivo secuencial Se emplea cuando se necesita acceder individual y directamente a


un registro.

B Archivo relativo Los registros se graban y recuperan uno a continuación de otro.

C Archivo secuencial indexado Permite acceder a los registros a través de diferentes campos.

D Archivo multillave Opera de forma similar a un diccionario de datos.

a. BADC

b. ABDC

c. DBAC

d. CABD

142
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

10. Es una desventaja de emplear archivos en vez de modelo relacional:

a. La gran cantidad de espacio de ocupan en disco.

UNIDAD IV
b. No se puede ver la información contenida directamente y con facilidad.

c. La integridad de datos.

d. Es imposible eliminar un registro relacionado a un archivo principal.

Tema N.º 3

143
ANEXO:
UNIDAD IV

Solucionario de LAS autoevaluaciOnES

Respuestas de la autoevaluación de la Unidad I


ANEXO

NÚMERO RESPUESTA
1 B
2 A
3 c
4 b
5 b
6 c
7 a
8 b
9 c
10 C

Respuestas de la autoevaluación de la Unidad II

Número Respuesta
1 D
2 C
3 B
4 A
5 A
6 A
7 A
8 B
9 D
10 C

144
Estructura de Datos
MANUAL AUTOFORMATIVO INTERACTIVO

UNIDAD IV
Respuestas de la autoevaluación de la Unidad III

Pregunta Alternativa
1 a
2 c

ANEXO
3 c
4 a
5 d
6 d
7 b
8 b
9 c
10 b

Respuestas de la autoevaluación de la Unidad IV

Pregunta Alternativa
1 a
2 b
3 c
4 a
5 d
6 d
7 a
8 d
9 a
10 c

145
MANUAL AUTOFORMATIVO Interactivo

E
ste manual autoformativo es el material didác- blioteca de recursos, muro y las tareas, siempre
tico más importante de la presente asignatu- acompañado de tus docentes y amigos.
ra. Elaborado por el docente, orienta y facilita
el auto aprendizaje de los contenidos y el desarrollo El modelo educativo de la Universidad Continen-
de las actividades propuestas en el sílabo. tal a distancia es innovador, interactivo e integral,
conjugando el conocimiento, la investigación y
Los demás recursos educativos del aula virtual la innovación. Su estructura, organización y fun-
complementan y se derivan del manual. Los con- cionamiento están de acuerdo a los estándares
tenidos multimedia ofrecidos utilizando videos, internacionales. Es innovador, porque desarrolla
presentaciones, audios, clases interactivas, se las mejores prácticas del e-learning universitario
corresponden a los contenidos del presente ma- global; interactivo, porque proporciona recursos
nual. La educación a distancia en entornos vir- para la comunicación y colaboración síncrona y
tuales te permite estudiar desde el lugar donde asíncrona con docentes y estudiantes; e integral,
te encuentres y a la hora que más te convenga. pues articula contenidos, medios y recursos para
Basta conectarse al Internet, ingresar al campus el aprendizaje permanente y en espacios flexi-
virtual donde encontrarás todos tus servicios: bles. Ahora podrás estar en la universidad en
aulas, videoclases, presentaciones animadas, bi- tiempo real sin ir a la universidad.

You might also like