Originariamente inviato da be_ar
So bene che potrei risolvere semplicemente riscrivendo le funzioni in modo che mi ritornino ogni volta un grafo, ma ho già scritto un bel po' di roba, non vorrei perdere troppo tempo (visto pure che ne ho poco per la consegna), ed inoltre, in questo modo, si risparmia un bel po' di codice.

Qualcuno, quindi, saprebbe dirmi come posso ottenere lo stesso risultato che ottengo in C++ con il C, lasciando quindi, tutte le mie funzioni void?
Il problema non è del passaggio del grafo alla funzione. G è un puntatore in main() e passandolo per riferimento fai già in modo che la funzione in questione possa modificarne il valore con la malloc(). Il problema è un altro (sempre in make_empty_graph()):

codice:
     (*G)->adj=(Pedge*) malloc (NV*sizeof (Pedge));
     for (i=0; i<NV; ++i)
     {
       (*G)->adj[i]->key=NULL;
     }
per il puntatore adj (di tipo Pedge *) allochi spazio per NV puntatori Pedge, correttamente; dopo però vai ad accedere ai campi key dei singoli puntatori allocati senza aver però allocato spazio anche per questi (e quindi per i campi key). Devi fare una doppia allocazione: una per il doppio puntatore e NV per gli NV puntatori singoli. Tra l'altro, NULL è generalmente definito come ((void *) 0), quindi è un puntatore, pertanto non assegnarlo a key che è un intero (assegna la costante intera 0).


codice:
     (*G)->adj=(Pedge*) malloc (NV*sizeof (Pedge));
     for (i=0; i<NV; ++i)
     {
       (*G)->adj[i] = (Pedge) malloc(sizeof(Tedge));
       (*G)->adj[i]->key=0;
     }
non sarebbe male anche scrivere dei controlli sui valori di ritorno delle varie malloc().