Punteros Dentro de Structs
Estructuras de datos esenciales como pilas, listas enlazadas y árboles pueden contener referencias a otros objetos del mismo tipo para crear conexiones o relaciones entre elementos. Las estructuras de datos se abordarán más adelante en este curso.
Los elementos de este tipo de estructuras de datos suelen llamarse nodos.
Si intentas crear una estructura que contenga un campo del mismo tipo que la propia estructura, recibirás un error:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
En este caso, ocurre una recursión infinita al determinar el tamaño de dicha estructura.
Esta idea puede implementarse utilizando un puntero a una estructura:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Este código funciona porque el compilador conoce el tamaño exacto de un puntero — normalmente 4 u 8 bytes, dependiendo del sistema.
No intenta calcular el tamaño de toda la estructura anidada; simplemente almacena una referencia (address) a ella.
Veamos cómo funciona esto en la práctica.
main.c
1234567891011121314151617181920212223242526#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }
struct Node kate = { "Kate" }; - el campo next no fue inicializado explícitamente en el inicializador de la estructura, por lo que se inicializará automáticamente como un puntero nulo (NULL), ya que este es el valor estándar para los punteros cuando no apuntan a ningún objeto.
while (pointer != NULL) - el bucle se ejecutará hasta que el puntero apunte a la dirección NULL.
En lenguajes de programación como C y C++, un puntero que es NULL generalmente indica el final de una lista (u otra estructura de datos). Por lo tanto, este bucle se ejecutará hasta que pointer sea NULL, lo que puede interpretarse como llegar al final de la lista o estructura de datos.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Can you explain why using a pointer solves the recursion problem?
What are some real-world examples of using linked lists or similar structures?
Can you show how to traverse a linked list in C?
Genial!
Completion tasa mejorada a 4.35
Punteros Dentro de Structs
Desliza para mostrar el menú
Estructuras de datos esenciales como pilas, listas enlazadas y árboles pueden contener referencias a otros objetos del mismo tipo para crear conexiones o relaciones entre elementos. Las estructuras de datos se abordarán más adelante en este curso.
Los elementos de este tipo de estructuras de datos suelen llamarse nodos.
Si intentas crear una estructura que contenga un campo del mismo tipo que la propia estructura, recibirás un error:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
En este caso, ocurre una recursión infinita al determinar el tamaño de dicha estructura.
Esta idea puede implementarse utilizando un puntero a una estructura:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Este código funciona porque el compilador conoce el tamaño exacto de un puntero — normalmente 4 u 8 bytes, dependiendo del sistema.
No intenta calcular el tamaño de toda la estructura anidada; simplemente almacena una referencia (address) a ella.
Veamos cómo funciona esto en la práctica.
main.c
1234567891011121314151617181920212223242526#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }
struct Node kate = { "Kate" }; - el campo next no fue inicializado explícitamente en el inicializador de la estructura, por lo que se inicializará automáticamente como un puntero nulo (NULL), ya que este es el valor estándar para los punteros cuando no apuntan a ningún objeto.
while (pointer != NULL) - el bucle se ejecutará hasta que el puntero apunte a la dirección NULL.
En lenguajes de programación como C y C++, un puntero que es NULL generalmente indica el final de una lista (u otra estructura de datos). Por lo tanto, este bucle se ejecutará hasta que pointer sea NULL, lo que puede interpretarse como llegar al final de la lista o estructura de datos.
¡Gracias por tus comentarios!