Estructura anidada en C con ejemplos

Prerrequisito: Estructuras en C

Una estructura anidada en C es una estructura dentro de una estructura. Una estructura se puede declarar dentro de otra estructura de la misma manera que los miembros de una estructura se declaran dentro de una estructura.

Sintaxis:

estructura nombre_1
{
    miembro1;
   miembro2;
   .
   .
   miembro;

   estructura nombre_2
   {
       miembro_1;
       miembro_2;
       .
       .
      miembro_n;
   }, var1
} var2;

Se puede acceder al miembro de una estructura anidada usando la siguiente sintaxis:

Nombre de variable de Outer_Structure. Nombre de variable de Nested_Structure. miembro de datos para acceder 

Ejemplo:

  • Considere que hay dos estructuras Empleado (estructura dependiente) y otra estructura llamada Organización (estructura externa) .
  • La estructura Organización tiene miembros de datos como nombre_organización, número_organización.
  • La estructura Empleado está anidada dentro de la estructura Organización y tiene miembros de datos como id_empleado, nombre, salario.

Para acceder a los miembros de Organización y Empleado se utilizará la siguiente sintaxis:

org.emp.employee_id;
org.emp.nombre;
org.emp.salario;

org.nombre_organización;
org.organization_number;

Aquí, org es la variable de estructura de la estructura externa Organización y emp es la variable de estructura de la estructura interna Empleado.

Diferentes formas de anidar la estructura.

La estructura se puede anidar de las siguientes maneras diferentes:

  1. Por estructura anidada separada
  2. Por estructura anidada incrustada .

1. Por estructura anidada separada: en este método, se crean las dos estructuras, pero la estructura dependiente (Empleado) debe usarse dentro de la estructura principal (Organización) como miembro. A continuación se muestra el programa C para implementar el enfoque:

C

// C program to implement 
// the above approach
#include <stdio.h>
#include <string.h>
  
// Declaration of the 
// dependent structure
struct Employee
{
  int employee_id;
  char name[20];
  int salary;
};
  
// Declaration of the 
// Outer structure
struct Organisation 
{
  char organisation_name[20];
  char org_number[20];
    
  // Dependent structure is used 
  // as a member inside the main
  // structure for implementing 
  // nested structure
  struct Employee emp; 
};
  
// Driver code
int main()
{
  // Structure variable
  struct Organisation org; 
    
  // Print the size of organisation 
  // structure
  printf("The size of structure organisation : %ld\n", 
          sizeof(org));
    
  org.emp.employee_id = 101;  
  strcpy(org.emp.name, "Robert");
  org.emp.salary = 400000;
  strcpy(org.organisation_name, 
         "GeeksforGeeks");
  strcpy(org.org_number, "GFG123768");
    
    
  // Printing the details
  printf("Organisation Name : %s\n", 
          org.organisation_name);  
  printf("Organisation Number : %s\n", 
          org.org_number);  
  printf("Employee id : %d\n", 
          org.emp.employee_id);  
  printf("Employee name : %s\n", 
          org.emp.name);  
  printf("Employee Salary : %d\n", 
          org.emp.salary);  
}

Producción:

El tamaño de la organización de la estructura: 68
Nombre de la organización: GeeksforGeeks
Número de organización: GFG123768
Identificación del empleado: 101
Nombre del empleado: Robert
Salario del empleado: 400000

2. Por estructura anidada incrustada: con este método, permite declarar una estructura dentro de una estructura y requiere menos líneas de código. 

Caso 1: se producirá un error si la estructura está presente pero falta la variable de estructura.

C

// C program to implement 
// the above approach
#include <stdio.h>
  
// Declaration of the outer
// structure
struct Organisation 
{
  char organisation_name[20];
  char org_number[20];
    
  // Declaration of the employee
  // structure
  struct Employee 
  {
    int employee_id;
    char name[20];
    int salary;
      
  // This line will cause error because 
  // datatype struct Employee is present ,
  // but Structure variable is missing.
  }; 
};
  
// Driver code
int main()
{
  // Structure variable of organisation
  struct Organisation org;
  printf("%ld", sizeof(org));
}

Producción:

Error

Nota:

Cada vez que se crea una estructura anidada incrustada, la declaración de la variable es obligatoria al final de la estructura interna, que actúa como miembro de la estructura externa. Es obligatorio que la variable de estructura se cree al final de la estructura interna. 

Caso 2: Cuando la variable de estructura de la estructura interna se declara al final de la estructura interna. A continuación se muestra el programa C para implementar este enfoque:

C

// C program to implement
// the above approach
#include <stdio.h>
#include <string.h>
  
// Declaration of the main
// structure
struct Organisation 
{
  char organisation_name[20];
  char org_number[20];
    
  // Declaration of the dependent
  // structure
  struct Employee 
  {
    int employee_id;
    char name[20];
    int salary;
      
  // variable is created which acts 
  // as member to Organisation structure.
  } emp; 
};
  
// Driver code
int main()
{
  struct Organisation org;
    
  // Print the size of organisation 
  // structure
  printf("The size of structure organisation : %ld\n", 
          sizeof(org));
    
  org.emp.employee_id = 101;  
  strcpy(org.emp.name, "Robert");
  org.emp.salary = 400000;
  strcpy(org.organisation_name, 
         "GeeksforGeeks");
  strcpy(org.org_number, "GFG123768");
    
    
  // Printing the details
  printf("Organisation Name : %s\n", 
          org.organisation_name);  
  printf("Organisation Number : %s\n", 
          org.org_number);  
  printf("Employee id : %d\n", 
          org.emp.employee_id);  
  printf("Employee name : %s\n", 
          org.emp.name);  
  printf("Employee Salary : %d\n", 
          org.emp.salary);  
}

Producción:

El tamaño de la organización de la estructura: 68
Nombre de la organización: GeeksforGeeks
Número de organización: GFG123768
Identificación del empleado: 101
Nombre del empleado: Robert
Salario del empleado: 400000

Inconveniente de la estructura anidada

Los inconvenientes de las estructuras anidadas son:

  • No es posible la existencia independiente: es importante tener en cuenta que la estructura Empleado no existe por sí sola. No se puede declarar una variable de estructura de tipo struct Employee en ningún otro lugar del programa.
  • No se puede usar en estructuras de datos múltiples: la estructura anidada no se puede usar en estructuras múltiples debido a la limitación de declarar variables de estructura dentro de la estructura principal. Entonces, la forma más recomendada es usar una estructura separada y se puede usar en múltiples estructuras de datos

Ejemplo de estructura anidada en C

A continuación se muestra otro ejemplo de una estructura anidada en C.

C

// C program to implement 
// the nested structure
#include <stdio.h>
#include <string.h>
  
// Declaration of Outer structure
struct College 
{
  char college_name[20];
  int ranking;
    
  // Declaration of Inner structure
  struct Student 
  {
    int student_id;
    char name[20];
    int roll_no;
      
  // Inner structure variable
  } student1;
}; 
  
  
// Driver code
int main()
{
  struct College c1 = {"GeeksforGeeks", 7,
                      {111, "Paul", 278}};
  
  printf("College name : %s\n", 
          c1.college_name);
  printf("Ranking : %d\n", 
          c1.ranking);
  printf("Student id : %d\n", 
          c1.student1.student_id);
  printf("Student name : %s\n", 
          c1.student1.name);
  printf("Roll no : %d\n", 
          c1.student1.roll_no);
  return 0;
}

Producción:

Nombre de la universidad: Ranking GeeksforGeeks : 7
Identificación del estudiante: 111
Nombre del estudiante: Paul
Roll no: 278

Nota:

No se permite anidar la estructura dentro de sí misma. 

Ejemplo:

estudiante de estructura
{

    nombre de char[50];

    dirección char[100];

    int roll_no;

    geek estudiante de estructura; // Inválido

}

Pasar estructura anidada a función

Una estructura anidada se puede pasar a la función de dos maneras:

  1. Pase la variable de estructura anidada a la vez.
  2. Pase los miembros de la estructura anidada como argumento a la función.

Analicemos cada una de estas formas en detalle.

1. Pase la variable de estructura anidada a la vez: al igual que otras variables, una variable de estructura anidada también se puede pasar a la función. A continuación se muestra el programa C para implementar este concepto:

C

// C program to implement
// the above approach
#include <stdio.h>
  
// Declaration of the inner 
// structure
struct Employee 
{
  int employee_id;
  char name[20];
  int salary;
};
  
// Declaration of the Outer 
// structure
struct Organisation 
{
  char organisation_name[20];
  char org_number[20];
    
  // Nested structure
  struct Employee emp; 
};
  
// Function show is expecting 
// variable of outer structure
void show(struct Organisation);
  
// Driver code
int main()
{
  struct Organisation org = {"GeeksforGeeks", "GFG111",
                            {278, "Paul",5000}};
    
  // Organisation structure variable 
  // is passed to function show
  show(org);
}
  
// Function shoe definition
void show(struct Organisation org )
{
  // Printing the details
  printf("Printing the Details :\n"); 
  printf("Organisation Name : %s\n", 
          org.organisation_name);  
  printf("Organisation Number : %s\n", 
          org.org_number);  
  printf("Employee id : %d\n", 
          org.emp.employee_id);  
  printf("Employee name : %s\n", 
          org.emp.name);  
  printf("Employee Salary : %d\n", 
          org.emp.salary);  
}

Producción:

Impresión de los detalles:
Nombre de la organización: GeeksforGeeks
Número de la organización: GFG111
Identificación del empleado: 278
Nombre del empleado: Paul
Salario del empleado: 5000

2. Pase los miembros de la estructura anidados como argumentos a la función: Considere el siguiente ejemplo para pasar el miembro de la estructura del empleado a una función display() que se usa para mostrar los detalles de un empleado.

C

// C program to implement
// the above approach
#include <stdio.h>
  
// Declaration of the inner 
// structure
struct Employee 
{
  int employee_id;
  char name[20];
  int salary;
};
  
// Declaration of the Outer 
// structure
struct Organisation 
{
  char organisation_name[20];
  char org_number[20];
    
  // Nested structure
  struct Employee emp; 
};
  
// Function show is expecting 
// members of both structures
void show(char organisation_name[], 
          char org_number[],
          int employee_id, 
          char name[], int salary);
  
// Driver code
int main()
{
  struct Organisation org = {"GeeksforGeeks", "GFG111",
                            {278, "Paul",5000}};
    
  // Data members of both the structures
  // are passed to the function show
  show(org.organisation_name, org.org_number,
       org.emp.employee_id, org.emp.name,
       org.emp.salary);
}
  
// Function show definition
void show(char organisation_name[], 
          char org_number[],
          int employee_id, 
          char name[], int salary)
{
  // Printing the details
  printf("Printing the Details :\n"); 
  printf("Organisation Name : %s\n", 
          organisation_name);  
  printf("Organisation Number : %s\n", 
          org_number);  
  printf("Employee id : %d\n", 
          employee_id);  
  printf("Employee name : %s\n", 
          name);  
  printf("Employee Salary : %d\n", 
          salary);  
}

Producción:

Impresión de los detalles:
Nombre de la organización: GeeksforGeeks
Número de la organización: GFG111
Identificación del empleado: 278
Nombre del empleado: Paul
Salario del empleado: 5000

Acceso a la estructura anidada

Se puede acceder a la estructura anidada de dos maneras:

  1. Usando la variable Normal.
  2. Usando la variable Puntero.

Analicemos cada uno de estos métodos en detalle.

1. Uso de la variable normal: las variables de estructura externa e interna se declaran como variables normales y se accede a los miembros de datos de la estructura externa usando un solo punto (.) y se accede a los miembros de datos de la estructura interna usando los dos puntos. A continuación se muestra el programa C para implementar este concepto:

C

// C program to implement
// the above approach
#include <stdio.h>
#include <string.h>
  
// Declaration of inner structure
struct college_details
{
  int college_id;
  char college_name[50];
    
};
  
// Declaration of Outer structure
struct student_detail
{
  int student_id;
  char student_name[20];
  float cgpa;
    
  // Inner structure variable
  struct college_details clg;
} stu;
  
// Driver code
int main()
{
  struct student_detail stu = {12, "Kathy", 7.8, 
                              {14567, "GeeksforGeeks"}};
    
  // Printing the details
  printf("College ID : %d \n", stu.clg.college_id);
  printf("College Name : %s \n", stu.clg.college_name);
  printf("Student ID : %d \n", stu.student_id);
  printf("Student Name : %s \n", stu.student_name);
  printf("Student CGPA : %f \n", stu.cgpa);
  return 0;
}

Producción:

ID de la universidad: 14567  
Nombre de la universidad: GeeksforGeeks  
ID del estudiante: 12  
Nombre del estudiante: Kathy  
Student CGPA: 7.800000 

2. Uso de la variable de puntero: se declara una variable normal y una variable de puntero de la estructura para explicar la diferencia entre las dos. En el caso de la variable de puntero, se utilizará una combinación de punto (.) y flecha (->) para acceder a los miembros de datos. A continuación se muestra el programa C para implementar el enfoque anterior:

C

// C program to implement
// the above approach
#include <stdio.h>
#include <string.h>
  
// Declaration of inner structure
struct college_details
{
  int college_id;
  char college_name[50];
    
};
  
// Declaration of Outer structure
struct student_detail
{
  int student_id;
  char student_name[20];
  float cgpa;
    
  // Inner structure variable
  struct college_details clg;
} stu, *stu_ptr;
  
// Driver code
int main()
{
  struct student_detail stu = {12, "Kathy", 7.8, 
                              {14567, "GeeksforGeeks"}};
    
  stu_ptr = &stu;
    
  // Printing the details
  printf("College ID : %d \n", stu_ptr->clg.college_id);
  printf("College Name : %s \n", stu_ptr->clg.college_name);
  printf("Student ID : %d \n", stu_ptr->student_id);
  printf("Student Name : %s \n", stu_ptr->student_name);
  printf("Student CGPA : %f \n", stu_ptr->cgpa);
  return 0;
}

Producción:

ID de la universidad: 14567  
Nombre de la universidad: GeeksforGeeks  
ID del estudiante: 12  
Nombre del estudiante: Kathy  
Student CGPA: 7.800000 

Una estructura anidada permitirá la creación de tipos de datos complejos según los requisitos del programa.

Publicación traducida automáticamente

Artículo escrito por sathiyamoorthics19 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *