PDF de programación - Cap.2 - Definición de estructuras de datos en C.

Imágen de pdf Cap.2 - Definición de estructuras de datos en C.

Cap.2 - Definición de estructuras de datos en C.gráfica de visualizaciones

Publicado el 8 de Abril del 2020
63 visualizaciones desde el 8 de Abril del 2020
462,8 KB
36 paginas
Creado hace 10a (20/01/2010)
Capítulo 2.

1

Definición de Estructuras de Datos en C.

Se desea conocer las técnicas para diseñar estructuras de datos. Se repasan los conceptos de
tipos básicos, para luego desarrollar las herramientas de creación de nuevas estructuras,
haciendo énfasis en los conceptos de agrupación y vinculación. Dando ejemplos que
posteriormente se emplearán en el texto.

2.1. Tipos primitivos.

En los lenguajes de programación suele disponerse de tipos básicos o primitivos: caracteres,
enteros con y sin signo, reales o flotantes de simple y doble precisión.

Se dispone la forma de definir e inicializar variables de esos tipos, y también la forma de
escribir constantes de esos tipos.

Para los tipos primitivos existen numerosos y variados operadores que permiten construir
expresiones con variables y constantes de dichos tipos. En determinados casos existen
mecanismos automáticos para convertir valores de un tipo en otro, sin embargo es preferible la
conversión explícita a través del molde o “cast”.

Mediante las bibliotecas de entrada-salida pueden ingresarse o desplegarse valores de esos
tipos.

2.2. Mecanismos de estructuración.

Existen dos mecanismos básicos de estructuración de datos: la agrupación y la vinculación.

2.2.1. Grupos básicos.

La estructura (struct) permite agrupar elementos de diferente tipo. El arreglo agrupa elementos
de igual tipo. El string agrupa caracteres.


Profesor Leopoldo Silva Bijit

20-01-2010

2



Estructuras de Datos y Algoritmos

Figura 2.1. Agrupaciones de datos.



Se dispone de una forma de definir variables de esos grupos básicos, y los mecanismos de
acceso a las componentes: el discriminador del campo (un punto) para las estructuras; y los
paréntesis cuadrados o corchetes para delimitar el índice de la componente del arreglo. Las
operaciones que están definidas para estos grupos básicos son muy reducidas, el programador
debe crear sus propias funciones o métodos para efectuar operaciones más complejas sobre
estos grupos básicos. En el caso de strings existe una biblioteca estándar de funciones que los
manipulan (ver Apéndice 2).

Las agrupaciones pueden ser tan complejas como sea necesario: ya que es posible crear arreglos
de estructuras, y también estructuras que contengan arreglos y strings.

2.2.2. Vínculos.

Pueden establecerse relaciones entre elementos de datos. Los siguientes diagramas ilustran las
formas básicas de vinculación: vínculos de orden o secuencia en listas, relaciones jerárquicas en
árboles, e interconexiones complejas en grafos.


Figura 2.2. Vínculos entre componentes de datos.



Profesor Leopoldo Silva Bijit

20-01-2010

Estructura Arreglo String listas árboles grafos Definición de Estructuras de Datos en C.



3

El vínculo es el elemento de datos de una componente que permite accesar a otra componente.
Una componente puede contener información de uno o más vínculos.

El programador debe disponer de elementos del lenguaje que le permitan crear nuevos tipos de
datos, y mediante estos tipos crear funciones o métodos que realicen operaciones sobre las
componentes.

Cuando el número máximo de componentes es conocido de antemano, las componentes pueden
modelarse como una serie de arreglos agrupados en una estructura. En la cual se emplea uno o
varios arreglos para establecer el o los vínculos entre las componentes. Se suele definir como
cursor a una variable que contiene el valor del índice de una componente.

Otro mecanismo para establecer vínculos es el puntero, que es una variable que contiene la
dirección de otra componente. La vinculación a través de punteros suele emplearse
preferentemente en situaciones dinámicas, en las cuales el número de las componentes varía
durante la ejecución del programa; esto debido a que se crean, insertan y descartan
componentes.

2.3. Ejemplos basados en arreglos.

2.3.1. Acceso a componentes del arreglo.

El acceso a componentes se realiza vía indirección de un puntero constante que es el nombre del
arreglo, con un offset dado por el índice del elemento.

Se definen tipos de datos.
typedef int Tipo; /* tipo de item del arreglo */
typedef int Indice; /* tipo del índice */

Es práctica usual, definir mediante una constante el tamaño máximo del arreglo
#define MaxEntradas 10

Se definen e inician con valores dos arreglos
Tipo A[MaxEntradas]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Tipo B[MaxEntradas]={ 10,11,12,13,14,15,16,17,18,19};

A las funciones que manipulan arreglos se les suele pasar el arreglo por referencia.

Por ejemplo la función que imprime en una línea las componentes de un arreglo a.

void mostrar(Tipo *a, Indice inferior, Indice superior)
{
Indice i;
for (i = inferior; i <= superior; i++) printf(" %d ", a[i]);
putchar('\n');
}
Note que el primer argumento de la función también puede escribirse: Tipo a[].

Profesor Leopoldo Silva Bijit

20-01-2010

4



Estructuras de Datos y Algoritmos

Ejemplos de uso:
mostrar(A, 0, 4); imprime 0 1 2 3 4
mostrar(A+2, 0, 4); imprime 2 3 4 5 6

La manipulación de arreglos no suele verificar el rango del índice. En el caso de haberse
definido adyacentes los arreglos A y B, la referencia a A[12] está accesando efectivamente a
B[2], por eso se muestra un 12; pero es un error por acceso fuera de rango.

printf(" %d \n", A[12]); imprime 12
printf(" %d \n", B[-2]); imprime 8
printf(" %d \n", A[-1]); imprime cualquier cosa que estuviera almacenada antes de A
printf(" %d \n", 1[-1+B] ); imprime 10
printf(" %d \n", -1[B] ); imprime -11 (es una referencia correcta)

Similares errores pueden generarse accesando componentes indireccionando vía puntero:
printf(" %d \n", *(A+12)); imprime 12
printf(" %d \n", *(-2+B)); imprime 8

Los ejemplos anteriores ilustran que el acceso a componentes de un arreglo se efectúa mediante
indirección con el puntero que es el nombre del arreglo.
La expresión: A[c] se interpreta como el contenido de la dirección:
A + c*(tamaño del tipo del arreglo).

Donde A es la dirección de la primera componente del arreglo.

Empleando el lenguaje:

A[c] equivale a: *(A+c) y A es equivalente a &A[0].

Definición de matrices.

Puede definirse una matriz de caracteres, arr, de R renglones y C columnas mediante:

#define R 8 //renglones
#define C 10 //columnas
char arr[R][C];

Figura 2.2.a. Matriz de caracteres



Profesor Leopoldo Silva Bijit

20-01-2010

arr arr[3] arr[3][5] Definición de Estructuras de Datos en C.



5

Entonces: arr[3] es el cuarto renglón de la matriz arr, y es un arreglo de C caracteres. Puede
considerarse que arr[3] es la dirección de inicio de ese arreglo; es decir, es un puntero constante
que indica la primera componente de ese arreglo. Puede escribirse, usando notación de punteros
como: *(arr+3).

La expresión: a[3][5], denota el sexto carácter del cuarto renglón. La cual puede escribirse,
usando notación con punteros, mediante: * ( *(arr+3) + 5 ).
Puede concluirse que arr es un puntero a un puntero a carácter.

Definición de arreglo de arreglos.

Empleando definición de tipos puede crearse el tipo renglón, como un arreglo de C caracteres.
Y mediante este nuevo tipo puede definirse una matriz ar, como un arreglo de renglones.
Definiciones que se muestran a continuación.

#define R 8 //renglones
#define C 10 //columnas
typedef char renglon[C];
renglon ar[R];

La expresión ar[3] es el cuarto renglón. La expresión: * ( *(ar+3) + 5 ) corresponde al sexto
carácter almacenado en el cuarto renglón, y es equivalente a: ar[3][5].

Con el mismo procedimiento se pueden estructurar organizaciones más complejas. Por ejemplo
una matriz cuyo contenido sea un arreglo.
Los arreglos aseguran que las componentes quedan adyacentes en memoria. En el caso de
matrices, el último elemento del primer renglón queda adyacente con el primer elemento del
segundo renglón.

Arreglo de punteros a renglones.

Un ejemplo de creación de estructuras de datos, empleando el lenguaje C, es diseñar un arreglo
de punteros pt, que apunten a los renglones de una matriz.

Figura 2.2.b. Arreglo de punteros a arreglos de caracteres



Profesor Leopoldo Silva Bijit

20-01-2010

ar (*pt[2])[5] pt 6



Estructuras de Datos y Algoritmos

Las siguientes declaraciones de tipos y definiciones de variables, crean el espacio que
almacenará a la estructura de datos.

typedef char renglon[C]; //definición de tipo renglón como un arreglo de C caracteres
typedef renglon * prenglon; //definición del tipo puntero a renglón
renglon ar[R]; //Matriz de caracteres como arreglo de renglones
prenglon pt[R]; //Arreglo de punteros a los renglones.

Es preciso vincular los punteros del arreglo con los renglones, lo cual se efectúa con:
for(i=0; i<R; i++) pt[i]=&ar[i]; //llena arreglo de punteros a renglones.

Entonces: pt[2] contiene un puntero al tercer renglón. Lo cual puede escribirse: *(pt +2 ).
La expresión: *(pt[2]) es el tercer renglón, que en este caso es un arreglo de C caracteres; es
decir: *( *(pt+2)) es el valor del puntero al inicio de ese renglón. Y consecuentemente:
*( *(pt+2)) +5 es el pun
  • Links de descarga
http://lwp-l.com/pdf17514

Comentarios de: Cap.2 - Definición de estructuras de datos en C. (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad