Seguramente más de alguno quedará estancado en alguno de los temas de este curso, especialmente lo que estamos iniciándonos en el mundo de la tecnología. Por ello realicé un pequeño tutorial sobre cómo crear un nodo, para facilitar la comprensión del tema, ya que personalmente se me dificultó muchísimo.
Here we go:
Pasos para crear un nodo.
a) Crear la estructura Nodo y el tipo NODO.
Hay una diferencia entre typedef
y struct
, el primero se trata de copiar el tipo de variable, algo así como el copiar formato de office. Ejemplo:
typedef int A;A a;
Mi forma de interpretarlo es que le enviamos la instrucción al procesador que copie el formato de la variable A, y lo pegue en las nuevas variables que creamos seguidas de la A. Prácticamente la variable A se vuelve un tipo de variable.
En cambio struct
creamos un árbol de variables, y a eso se le debe el nombre struct, que significa “estructura” en español. El objetivo de la utilización de esta palabra reservada es darle más orden a las variables de nuestro programa, ya que permite agrupar las que estan relacionadas, como en una ficha cliente, nombre y dirección, es conveniente acceder a ellas mediante una estructura llamada cliente. Ejemplo:
Struct Cliente {
char nombre[100];
char direccion[100];
};
Volviendo a los Nodos, junto con la estructura creamos el typedef
, pero con una característica única: la autoreferencia. Esto se logra creando un puntero del tipo estructura dentro del nodo, que permitirá enlazar otros nodos. Ya sé, parece que dará algún error, y esto es parecido al efecto de poner dos espejos uno frente del otro, pero así es el proceso, hazlo sin miedo. Ejemplo:
typedef struct Node{
int var_1;
char var_2[5];
struct Node* next;
} NODE;
b) Crear la función que dará existencia al nodo.
Debido a que se recurrirá en varias ocasiones a una serie de pasos para crear los nodos, es eficiente crear una función para realizar la actividad y así ahorrar unas líneas de código.
Los pasos que deben guardarse en una función son:
Ejemplo:
NODE* createNode(int number){
NODE* newNode;
newNode= malloc(sizeof(NODE));
newNode->next = NULL;
newNode->number = number;
return newNode;
c) Crear la cabecera y resto de componentes de la lista enlazada
Antes de crear un nodo, debemos saber si será una cabecera, cola o un nodo intermedio. Si queremos crear una cabecera declaramos una nueva variable puntero tipo NODO, y le asignamos un nodo con la función declarada en paso anterior. Si queremos crear un nodo cola o intermedio, recorremos la lista hasta llegar al nodo cola, o al nodo que queremos anexar uno nuevo, y asignamos un nuevo nodo a su variable next, de esa manera hacemos que apunten al nuevo nodo que creamos.
Ejemplo:
NODE * start = NULL, * current;if(start= NULL)
{
start = createNode(number);
} else
{
current = start;while(current->next)
{
current = current->next;
};
current->next = createNode(number);
Punto importante: para recorrer los nodos, siempre debe hacerse desde la cabecera, y se logra con funciones loop como while
.
Este ejemplo, start
es la cabecera, y current
es la herramienta que nos sirve para recorrer la cadena de los nodos, gracias a la variable del struct
next.
Intento usar el Nodo* retornado por la función createNode() pero me sale error Segmentation Fault terminando con el programa. Creo que podría haber probema al intentar retornar una referencia hacia una variable local de la funcion, pero he visto que siempre lo hacen de esa forma a la funcion “createNode()” por lo que no entiendo por qué no me funciona a mi. Desde ya gracias por cualquier ayuda
excelente aporte!
Lo único para aclarar que en esta parte:
typedef struct Nodo { int var_1; char var_2[5]; struct Node * next; } NODO
la autoreferencia debe ser el mismo nombre del struct , para no confundir ambos deberían ser “node”.
typedef struct Node { int var_1; char var_2[5]; struct Node * next; } NODO
Muhas gracias!
Corregido!!, gracias por la observación.