2.1.1 struct

 

Una estructura básica de un nodo para crear listas de datos seria:

struct nodo {

   int dato;

   struct nodo *otronodo;

};

El campo "otronodo" puede apuntar a un objeto del tipo nodo. De este modo, cada nodo puede usarse como un ladrillo para construir listas de datos, y cada uno mantendrá ciertas relaciones con otros nodos.

Para acceder a un nodo de la estructura sólo necesitaremos un puntero a un nodo.

Durante el presente curso usaremos gráficos para mostrar la estructura de las estructuras de datos dinámicas. El nodo anterior se representará asi:

gráfico de nodo

Las estructuras dinámicas son una implementación de TDAs o TADs (Tipos Abstractos de Datos). En estos tipos el interés se centra más en la estructura de los datos que en el tipo concreto de información que almacenan.

Las estructuras dinámicas de datos se pueden dividir en dos grandes grupos:

Lineales: listas enlazadas, pilas, colas

No lineales: árboles , grafos

Las estructuras dinámicas de datos son de gran utilidad para almacenar datos del mundo real, que están cambiando constantemente. Por ejemplo si tenemos almacenados en un array los datos de los alumnos de un curso, los cuales estan ordenados de acuerdo al promedio, para insertar un nuevo alumno seria necesario correr cada elemento un espacio: Si en su lugar se utilizara una estructura dinámica de datos, los nuevos datos del alumno se pueden insertar fácilmente.

Una estructura (struct) permite agrupar variables de varios tipos bajo un mismo nombre. De esta forma es posible crear elementos de datos complejos, basándose en los tipos básicos que suministra el lenguaje de programación.

Una declaración de estructura define un tipo, y por lo tanto será posible definir variables de este nuevo tipo. Cada una de estas variables estará compuesto a su vez por las variables que se definieron en la estructura.

Una declaración típica de estructuras sería:

   struct nombre {
      componente1 ;
      componente2 ;
      ...
      componenteN ;
   } lista-variables ;

Cada uno de los componentes de la estructura tiene a su vez la forma de una declaración de variables:

   tipo nombre ;

Por ejemplo, para declarar una estructura que permita manejar, de manera conjunta, los datos de algunos alumnos de determinado curso, se podría hacer:

   struct Alumno {
      char Nombre[30];
      char NumAlumno[8];
      float Nota1;
      float Nota2;
      float Nota3;
      float NotaFinal;
   } A1, A2, A3;

Esta declaración define tres variables (A1, A2 y A3), cada una compuesta a su vez por un string para el nombre, un string para su número de alumno, tres float para sus notas parciales, y un float para su nota final.

Los elementos que componen una estructura se acceden mediante la notación:

   estructura.componente

Por ejemplo, el string que contiene el nombre del segundo alumno se referencia como:

   A2.Nombre

Al igual que con los tipos simples de C, es posible definir vectores compuestos de estructuras. Así, sería posible hacer la definición anterior aplicable a un mayor número de alumnos:

   struct Alumno {
      char nombre[30];
      char NumAlumno[8];
      float Nota1;
      float Nota2;
      float Nota3;
      float NotaFinal;
   } Alumnos[NUM_ALUMNOS];

En este caso, el nombre del primer alumno se referenciaría como:

   Alumnos[0].Nombre

En las versiones ANSI de C (como gcc), también es posible asignar estructuras, pasarlas como argumentos a funciones y retornarlas como resultado de funciones. En el caso del paso de estructuras como argumento, éstas se pasan por referencia, por lo que es posible cambiar el contenido de las variables dentro de la función y los cambios se propagarán al retornar. Las siguientes acciones y declaraciones serían válidas:

   A2 = A1;     /* Asignacion de una estructura a otra */
 
   /* Funcion que retorna una estructura */
   struct Alumno NuevoAlumno(char Nombre[]) { ...
 
   /* Funcion que recibe como argumento una estructura */
   void CalculaNota(struct Alumno A1) { ...

Importante:

Observe que el nombre del tipo que debe usarse lleva incluido el prefijo struct. Para el caso de nuestro ejemplo:

   struct Alumno

Haciendo uso de typedef será posible manejar estos nuevos tipos sin necesidad de acarrear constantemente el prefijo mencionado.

Una vez dada la declaración inicial de una estructura, es posible definir más variables del nuevo tipo definido. Esto se hace siguiendo la sintaxis:

   struct nombre var1, var2, ... ;

Continuando con el ejemplo inicial, podrían definirse estructuras adicionales para almacenar la información de otros alumnos:

   struct Alumno A4, A5;

También es posible inicializar estructuras durante su declaración, empleando una sintaxis similar a la utilizada para inicializar vectores. Por ejemplo:

   struct Alumno A = {"Elvira", "98231465", 6.0, 5.5, 5.0, 5.5};