Arreglos y Listas

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción

Dentro de los diferentes tipos de estructuras de datos que se utilizan para la organización de la información, tenemos las más simples, cuya finalidad es únicamente posicionar un dato de forma contigua a otro y, de esa manera, tener la posibilidad de acceder a él posteriormente; éstas son conocidas como arreglos y listas, las cuales son las más básicas que se estudiarán en este documento, y las más importantes también, ya que a partir de ellas se pueden formar otras estructuras de datos con un comportamiento más complejo o adecuado para alguna tarea particular.



Estructura de datos

Estructura de datos

El estudio de este tema te permitirá:

Generar un código de programación a partir del reconocimiento de las características de arreglos y listas, para almacenar y manipular datos de forma estructurada.

Arreglos


Partiendo de un modelo conceptual, podemos decir que en programación los arreglos son:

Estructuras de datos compuestos en las que se utilizan uno o más subíndices para identificar los elementos individuales almacenados, a los que es posible tener acceso en cualquier orden. (Joyanes, 2008)

La siguiente imagen representa un ejemplo de un tipo de arreglo.

Arreglo de una sola dimensión (vector)

Cervantes, G. (2017). Arreglo de una sola dimensión (vector) [ilustración].


En el contexto de los sistemas de cómputo, un arreglo —vector o matriz— es una estructura de datos que hace referencia a un grupo de casillas de memoria que se puede ver como una colección finita, homogénea y ordenada de elementos.




Una forma de pensar en un arreglo es como si fuera una hoja de Excel, donde las columnas o reglones son el índice que representa la posición en la que se localiza la casilla que contiene el o los datos. ¡Recuerda que en un arreglo todos los datos deben ser del mismo tipo!

Hoja de datos de Excel

Cervantes, G. (2017). Hoja de datos de Excel [ilustración].


En los lenguajes de programación de bajo nivel, o mejor conocidos como lenguaje máquina (ejemplo, el lenguaje C), un arreglo puede tener todos sus elementos, ya sea de tipo entero o de tipo carácter, pero no de ambos al mismo tiempo; sin embargo, en los lenguajes de alto nivel, también conocidos como de hoy en día, puede haber arreglos con tipos de datos mixtos.

Las dos operaciones básicas que se pueden realizar en un arreglo son:




El elemento de menor valor en un arreglo del tipo índice es su límite inferior, y el de mayor valor es su límite superior.

Arreglos unidimensionales


Un arreglo unidimensional es una estructura que…

Almacena datos de forma secuencial, está definida por una sola dimensión y sus nodos son leídos en una sola dirección.

Desde el punto de vista de las matemáticas, a una matriz —o conjunto de números o valores— de una dimensión se le llama vector. Está definida por la siguiente notación:

V = [0, 1, 2, 3, 4, 5]

Pero, ¿qué relación tiene un vector con los arreglos unidimensionales? Pues un vector es justamente un arreglo de este tipo que sólo utiliza un índice para referenciar a cada uno de sus elementos. La sintaxis de su declaración en la mayoría de los lenguajes de programación es como se muestra a continuación:

tipo_dato nombre_arreglo [tamaño];

La siguiente imagen es un ejemplo de programación de un arreglo, usando lenguaje C.

Ejemplo de programación de arreglo en C

Cervantes, G. (2017). Programación de arreglo en C [ilustración].


Las características de este arreglo son las siguientes:

  • Definimos el arreglo con el nombre de vector.
  • Su tamaño es de 10 números enteros.
  • Incluye la librería stdio.h para manejo de valores de entrada y salida.
  • Utiliza dos instrucciones de ciclo: for, una para grabar el arreglo con el incremento del índice y printf de lenguaje C para mostrar los valores.

Arreglos multidimensionales


Un arreglo también puede ser de dos o más dimensiones, por lo que, desde el punto de vista de las matemáticas, una matriz es un arreglo multidimensional. Por ejemplo, en lenguaje C, se definen igual que los vectores, con la excepción de que en este tipo de arreglos se requiere un índice por cada dimensión. Su sintaxis es la siguiente:


tipo_dato nombre_arreglo [tamaño 1][tamaño 2]...;


En el caso de la matriz bidimensional, ésta se representará gráficamente como una tabla con filas y columnas. Por ejemplo, una matriz de 2x3 (2 filas por 3 columnas), se inicializa de este modo usando el lenguaje C/C++:

Ejemplo de matriz bidimensional en lenguaje C

Cervantes, G. (2017). Ejemplo de matriz bidimensional en lenguaje C [ilustración].


Otro ejemplo es el de una matriz de 3x4 (3 filas por 4 columnas), usando los mismos lenguajes se inicializa de este modo:

int numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};


Donde quedarían asignados de la siguiente manera:

numeros[0][0]=1 numeros[0][1]=2 numeros[0][2]=3 numeros[0][3]=4
numeros[1][0]=5 numeros[1][1]=6 numeros[1][2]=7 numeros[1][3]=8
numeros[2][0]=9 numeros[2][1]=10 numeros[2][2]=11 numeros[2][3]=12


Otra forma de llenar el arreglo es mediante una instrucción FOR anidada, como se muestra en el siguiente código.


Manipulación de una matriz bidimensional en lenguaje C

Cervantes, G. (2017). Manipulación de una matriz bidimensional en lenguaje C [ilustración].


Como se representa en la imagen anterior, leemos los valores del arreglo con una instrucción scanf y los mostramos con una instrucción printf. Nótese que en ambos casos utilizamos una instrucción FOR anidada.

Por otro lado, un arreglo de dos dimensiones ilustra claramente las diferencias lógica y física de un dato, pues es una estructura de datos lógicos, útil en programación y en la solución de problemas. Sin embargo, aunque los elementos de dicho arreglo están organizados en un diagrama de dos dimensiones, el hardware de la mayoría de las computadoras no da este tipo de facilidad. El arreglo debe ser almacenado en la memoria de la computadora, la cual usualmente es lineal, es decir, cuenta con una arquitectura peculiar en la que el procesador ingresa la información secuencialmente hasta que una página de memoria se completa para continuar con la siguiente.

Un método para mostrar un arreglo de dos dimensiones en memoria es la representación fila mayor. Bajo esta representación, la primera fila del arreglo ocupa el primer conjunto de posiciones en memoria reservada para el arreglo; la segunda fila, el segundo y así sucesivamente. Observa las siguientes imágenes, te mostrarán de manera gráfica lo anteriormente mencionado.


Representación gráfica de un arreglo de memoria

Tevfik, A. (2014). Representación gráfica de un arreglo de memoria [ilustración]. Tomada de https://commons.wikimedia.org/wiki/File:Array_Representations.svg

Representación de un arreglo de memoria

(s. a.) (s. f.). Representación de un arreglo de memoria [ilustración]. Tomada de https://chessprogramming.wikispaces.com/file/view/Arrays2.gif/406078584/332x296/Arrays2.gif



Se considera pertinente explicar también el caso de un arreglo con estructura tridimensional, el cual es útil cuando se determina un valor mediante tres entradas y se especifica por medio de tres subíndices.




Observa la siguiente imagen.

Descripción gráfica de un arreglo de 3 dimensiones

Descripción gráfica de un arreglo de tres dimensiones


En relación con la imagen anterior, el índice de Z no se incrementa, sino hasta que todas las combinaciones posibles, índices X y Y, hayan sido completadas.


Operaciones con arreglos

Las operaciones básicas que se emplean en los arreglos son las siguientes:

Lectura/Escritura El proceso de lectura de un arreglo consiste en leer y asignar un valor a cada uno de sus componentes. Similar a la lectura, se debe escribir el valor de cada uno de los componentes.
Asiganación En este caso no es posible asignar directamente un valor a todo el arreglo; sino que se debe asignar el valor deseado a cada componente.
Actualización Este proceso se puede dar a través de tres operaciones básicas: inserción o adición de un nuevo elemento al arreglo; eliminación o borrado de un elemento del arreglo; y modificación o reasignación de un elemento del arreglo.
Ordenación
- Inserción
- Eliminación
- Modificación
- Ordenación
Es el proceso de organizar los elementos de un vector en algún orden dado que puede ser ascendente o descendente. Existen diferentes formas o métodos para hacer este proceso: método de burbuja, método de burbuja mejorado, ordenación por selección, inserción o método de la baraja, método Shell, Binsort o por urnas, ordenación por montículos o HeapSort, por mezcla o MergeSort, método de la sacudida o Shackersort, Rapid Sort o Quick Sort, por Árboles, etcétera.
Búsqueda Consiste en encontrar un determinado valor dentro del conjunto de datos del arreglo, para recuperar alguna información asociada con el valor buscado. Existen diferentes formas para hacer esta operación: búsqueda secuencial o lineal, búsqueda binaria, búsqueda HASH, árboles de búsqueda.

Los arreglos son estructuras de datos estáticas, ya que hay que declarar su tamaño antes de utilizarlos. A diferencia de los arreglos, las listas son estructuras de datos que pueden ir creciendo conforme se vaya requiriendo, por eso se considera que es una estructura de datos dinámica que veremos a continuación.

Listas


En la vida cotidiana utilizamos las listas para organizar una serie de actividades, o pasos, que son consecutivos el uno del otro y, de esa manera, podemos organizar también nuestras ideas, abordando los problemas de manera secuencial sin olvidar algún detalle. Un ejemplo de ello pueden ser los pasos que tenemos que seguir para cocinar un pastel, las actividades que tenemos que realizar durante el día o, incluso, sólo pueden ser los elementos de un conjunto, sin necesidad de orden particular, como la lista de compras del súper. Dos detalles importantes a tomar en cuenta en una lista son que en ella estarán todos los datos que vamos a necesitar para resolver un problema en cierto contexto y que a un dato de la lista le sigue otro, pudiendo ubicar cada uno de esos datos por su posición en la lista como: el primero, el último, el siguiente o el anterior.


Definición del tipo de dato abstracto lista

Una lista lineal es un conjunto de elementos de un tipo dado que se encuentran ordenados, aunque pueden variar en número. Los elementos de una lista se almacenan normalmente de manera contigua, es decir, un elemento detrás de otro en posiciones de la memoria.

Una lista enlazada es una estructura de datos fundamental que se utiliza para implementar otras estructuras de datos, como fue el caso de las pilas, las colas simples y las bicolas. Éstas cuentan con una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o apuntadores al nodo anterior o posterior.

A continuación mostramos la forma en que se puede representar una lista enlazada unidireccional; observa la siguiente imagen.

Representación de una lista enlazada unidireccional

Cervantes, G. (2017). Representación de una lista enlazada unidireccional [ilustración]


Definición de las operaciones sobre listas

Las operaciones que se tienen en una lista son:

Insert() (Agregar un elemento a la lista)
delete() (Quitar un elemento de la lista)

Otras operaciones que son menos relevantes, pero que pueden utilizarse en una lista son:

isEmpty() (Evalúa si la pila está vacía o no)
display() (Muestra los elementos de la pila, desde el inicio al final –NULL-))
size() (Muestra el tamaño actual de la pila)


Implantación de una lista

A continuación explicaremos, por medio de imágenes y código de programación en lenguaje C, la forma de implementar una lista enlazada simple.

Declaración de una lista enlazada simple en lenguaje C

Cervantes, G. (2017). Declaración de una lista enlazada simple en lenguaje C [ilustración].


En relación con el código anterior, es importante tomar en cuenta que el inicio de la lista enlazada simple debe ser declarado con un apuntador a nulo, como se ve representado en la siguiente imagen.

Representación de un apuntador nulo (creación de una lista)

Cervantes, G. (2017). Representación de un apuntador nulo (creación de una lista) [ilustración].


Por ejemplo, si quisiéramos agregar a la lista tres nombres de personas, de manera consecutiva lo declararíamos como se puede apreciar en la siguiente imagen.

Declaración para agregar tres nombres de manera consecutiva a una lista en lenguaje C

Cervantes, G. (2017). Declaración para agregar tres nombres de manera consecutiva a una lista en lenguaje C [ilustración].


La representación de la declaración anterior es la siguiente.

Representación de agregar tres nombres de manera consecutiva a una lista

Cervantes, G. (2017). Representación de agregar tres nombres de manera consecutiva a una lista [ilustración].


En caso de aplicar la operación delete() para eliminar un elemento de la lista, la representación sería la siguiente.

Representación de aplicar la operación delete() a una lista

Cervantes, G. (2017). Representación de aplicar la operación delete() a una lista [ilustración].


Actividad 1. Códigos de programación

En programación de sistemas es importante tener claro cómo programar las estructuras más básicas de datos; es decir, arreglos y listas, ya que esto nos dará la posibilidad de implementar un código más complejo y resolver diferentes tipos de problemas de programación.

Identifica si los códigos que se proporcionan son Falsos o Verdaderos.


Autoevaluación. Programación de arreglos y listas

La implementación en código de arreglos y listas es una habilidad básica para cualquier programador; el manejo de esta habilidad permitirá resolver diferentes problemas de programación.

Selecciona la opción que corresponda en cada caso.

Fuentes de información

Bibliografía

Bibliografía

Domínguez, E. D. (2014). Programación estructurada: raptor y lenguaje C. México: Alfaomega.

Guardati, S. (2015). Estructuras de datos básicas: programación orientada a objetos con java. México: Alfaomega.

Joyanes, L. (2008). Fundamentos de programación: algoritmos y estructuras de datos. Madrid: McGraw-Hill.

Kalicharan, N. (2013). Advanced topics in C: core concepts in data structures. Berkeley: Apress.

López, B. (2012). Estructuras de datos orientadas a objetivos: pseudocódigo y aplicaciones en C#.NET. México: Alfaomega.

López, B. (2015). Estructuras de datos orientadas a objetos. México: Alfaomega.

Maes, R. (2013). Physically Unclonable Functions: Constructions, Properties and Applications.
Berlin: Springer.

Malik, D. S. (2013). Estructura de datos con C++. México: Cengage Learning.

Weiss, M. A. (2012). Data Structures and Algorithm Analysis in Java. New Jersey: Addison-Wesley.


Documentos electrónicos


Martínez, J y Castro, R. (2012). Programación (estructura de datos) [Versión electrónica]. México: SUAYED-UNAM/FCA. Consultado el 18 de octubre de 2017 de http://fcasua.contad.unam.mx/apuntes/interiores/docs/20172/informatica/3/apunte/LI_1361_30096_A_Prog_estruc_datos_V1.pdf


Complementarias

Bibliografía

López, A. (2011). Estructura de datos con JAVA: un enfoque práctico. México: UNAM-Facultad de Ciencias.

Luján, S., Ferrández, A., Peral, J. y Requena, A. (2014). Ejercicios resueltos sobre programación y estructuras de datos. Alicante: Universidad de Alicante.

Mora, A. (2014). Bases de datos: diseño y gestión. España: Editorial Síntesis.

Weiss, M. A. (2013). Estructuras de datos en Java. Madrid: Addison-Wesley.


Cómo citar