Realmente es una forma muy conveniente de tener una lista de todos los nodos de forma accesible
Imaginemos el siguiente problema
Digamos que te dejan crear un Grafo con un 10 Millones de Nodos, imagina tu que haces todo perfectamente, los enlaces entre nodos, los pesos de las aristas etc...
En ese mismo problema te indican que tienes que hacer limpieza de X cantidad de Nodos ya sea algunos cuantos o todos.
Supongamos que es el mejor de los casos y que te piden borrar el grafo, para crear uno nuevo.
Lo mas facil seria crear un nuevo grafo y olvidarnos del anterior verdad?
pero son 10 Millones de nodos que siguen en la memoria
Lo logico es borrar todos los nodos y liberar la memoria que se utilizo en el momento.
¿Como lo harias sin tener una lista de todos los nodos?En caso de no tener una lista con todos los nodos, lo mas seguro es que tengas que recorrer el grafo nodo por nodo creando una lista de los nodos que ya liberastes y los que te faltan por liberar, lo cual podria llegar a ser un poco ineficiente.
Entonces mejor tener una lista que puedas recorrer de forma facil y sencilla para ir eliminándolos de uno por uno.
Veamos el siguiente codigo con una aproximaacion a generar un grado de forma muy sencilla.
Siendo el "Grafo" realmente un simple apuntador a un nodo, y cada nodo puede apuntar a mas nodos.
#include<stdio.h>
#include<stdlib.h>
typedef struct str_nodo *Nodo;
typedef struct str_nodo {
int valor;
Nodo *nodos; //Nodos con los que esta unido el nodo actual
int n_nodos;
}*Grafo;
Nodo crear_nodo(int valor);
void agregar_nodo(Nodo inicial,Nodo final); //Esta funcion une ambos nodos
int main() {
Grafo grafo;
grafo = crear_nodo(10);
agregar_nodo(grafo,crear_nodo(5)); //Aqui tenemos el nodo 10 <-> 5 Que apunta al nodo 5
agregar_nodo(grafo,crear_nodo(15));
agregar_nodo(grafo,crear_nodo(800));
agregar_nodo(grafo,crear_nodo(100));
//En este punto parece sencillo recorrer todos los nodos existentens, pero las cosas se podrian complicar un poco si agregamos nodos a los nodos ya existententes de forma aleatoria
return 0;
}
Nodo crear_nodo(int valor) {
Nodo nodo;
nodo
= calloc(1,sizeof(struct str_nodo
)); nodo->valor = valor;
nodo->nodos = NULL;
nodo->n_nodos = 0;
return nodo;
}
void agregar_nodo(Nodo inicial,Nodo final) {
inicial
->nodos
= realloc(inicial
->nodos
,(inicial
->n_nodos
+1 )*sizeof(struct str_nodo
*)); //Incrementamos el espacio para (inicial->n_nodos +1) Apuntadores final
->nodos
= realloc(final
->nodos
,(final
->n_nodos
+1 )*sizeof(struct str_nodo
*)); //Incrementamos el espacio para (final->n_nodos +1) Apuntadores
inicial->nodos[inicial->n_nodos] = final;
final->nodos[final->n_nodos] = inicial;
printf("%i <-> %i\n",inicial
->valor
,final
->valor
); inicial->n_nodos++;
final->n_nodos++;
}