Originariamente inviato da jeremyj
Ho provato ad aggiungere il controllo if(G) come mi hai suggerito ma ritorna sempre "errore di segmentazione".
Per intenderci, compilando ed eseguendo esattamente il tuo stesso codice con solo la modifica (minimale) in rosso, non ottengo alcun errore di segmentazione

codice:
void aggiungi_arco(vertice_grafo_t * G, int x, int y)
{
    arco_grafo_t *arco, *e;
    arco = (arco_grafo_t *) malloc(sizeof(arco_grafo_t));	/*alloca memoria per un nuovo arco */
    while (G != NULL) {		/*scorre tutti i vertici del grafo */
	if (G->valore == x) {	/*se trova un vertice corrispondente al parametro x passato alla funzione */
	    if (G->lista_archi_p == NULL) {	/*se il nodo non ha archi */
		while (G != NULL) {	/*scorre tutti i vertici del grafo */
		    if (G->valore == y) {
			G->lista_archi_p = arco;
			arco->vertice_adiac_p = G;
			arco->arco_succ_p = NULL;
		    }
		    G = G->vertice_succ_p;	/*scorre G */
		}
	    } else {		/*se invece il nodo possiede gia degli archi */

		e = G->lista_archi_p;
		while (e->arco_succ_p != NULL)
		    e = e->arco_succ_p;	/*scorre e fino all'ultimo arco gia esistente */
		e->arco_succ_p = arco;	/*faccio puntare il puntatore all'arco successivo dell'ultimo arco al nuovo arco */
		while (G != NULL) {	/*visita tutti i vertici */
		    if (G->valore == y) {	/*se trova un vertice il cui valore è quello passato alla funzione */
			e->arco_succ_p = arco;	/*dall'ultimo arco puntiamo alla locazione del nuovo arco */
			e->vertice_adiac_p = G;	/*puntatore al vertice corrispondente al parametro y */
			e->arco_succ_p = NULL;
		    }
		}
		G = G->vertice_succ_p;
	    }
	}
	if (G)
	G = G->vertice_succ_p;
    }
    return;
}
e ho questo output (che comunque non ho controllato)

codice:
Nodi adiacenti al nodo 0 -> 

Nodi adiacenti al nodo 1 -> 

Nodi adiacenti al nodo 2 -> 

Nodi adiacenti al nodo 3 -> 3
                                                                                                                                                                       
Nodi adiacenti al nodo 4 ->                                                                                                                                            
                                                                                                                                                                       
Nodi adiacenti al nodo 5 ->                                                                                                                                            
                                                                                                                                                                       
Nodi adiacenti al nodo 6 ->
il fatto che G diventi NULL ad un certo punto e che questo ti faccia crashare il programma lo puoi verificare con delle semplicissime stampe del valore del puntatore.

EDIT: rileggendo ti ho indicato male la riga dell'errore nel mio primo messaggio. Intendevo dire l'istruzione "G = G->vertice_succ_p" dopo l'if principale, non dopo l'else. Ho notato solo ora che ce ne sono due uguali.