Salve,
ho realizzato un piccolo programma il cui scopo è quello di realizzare un grafo e stamparlo a video.

codice:
[list=1][*]#include <stdio.h>[*]#include <stdlib.h>[*][*]/*LISTA PRIMARIA CONTENENTE I VERTICI DEL GRAFO*/[*]typedef struct vertice_grafo[*]{[*]   int valore;[*]   struct vertice_grafo *vertice_succ_p;  /*PUNTATORE AL VERTICE SUCCESSIVO*/[*]   struct arco_grafo *lista_archi_p;         /*PUNTATORE ALLA LISTA DEGLI ARCHI DEL NODO*/[*]}vertice_grafo_t;[*][*]/*LISTA SECONDARIA CONTENENTE GLI ARCHI DI UN NODO*/[*]typedef struct arco_grafo[*]{[*]   int peso;[*]   struct vertice_grafo *vertice_adiac_p;  /*PUNTATORE AL VERTICE ADIACENTE*/[*]   struct arco_grafo *arco_succ_p;          /*PUNTATORE AD EVENTUALI ALTRI ARCHI DEL NODO*/[*]}arco_grafo_t;[*][*]/*DICHIARAZIONE DELLE FUNZIONI*/[*]vertice_grafo_t *crea_grafo();[*]void stampa_grafo(vertice_grafo_t *G);[*]void aggiungi_arco(vertice_grafo_t *G, int x, int y);[*][*]int main(void)[*]{[*]   vertice_grafo_t *G;[*]   [*]   G = crea_grafo();[*]   aggiungi_arco(G, 2, 3);   /*si vuole creare un arco tra i vertici 2 e 3*/[*]   stampa_grafo(G);[*][*]   return(0);[*]}[*][*]/*DEFINIZIONE FUNZIONE PER LA CREAZIONE DEL GRAFO*/[*]vertice_grafo_t *crea_grafo()[*]{[*]   int i;[*]   vertice_grafo_t *G, *L;[*]   [*]   /*CREAZIONE DI UN GRAFO CON 7 VERTICI CON VALORI DA 0 A 6 PRIVO DI ARCHI*/[*]   G = (vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));[*]   G->valore = 0;[*]   G->vertice_succ_p = NULL;[*]   G->lista_archi_p = NULL;[*]   L = (vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));[*]   L->valore = 1;[*]   L->vertice_succ_p = NULL;[*]   L->lista_archi_p = NULL;[*]   G->vertice_succ_p = L;[*]   for(i = 2; i < 7; i++)[*]   {[*]      L->vertice_succ_p = (vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));[*]      L = L->vertice_succ_p;[*]      L->lista_archi_p = NULL;[*]      L->valore = i;[*]   }[*]   L->vertice_succ_p = NULL;[*][*]   return(G);[*]}[*][*]/*DEFINIZIONE FUNZIONE PER LA STAMPA A VIDEO*/[*]void stampa_grafo(vertice_grafo_t *G)[*]{[*]   arco_grafo_t *arco;[*]   vertice_grafo_t *G_adiacente;   /*raccoglie i vertici adiacenti dalla lista degli archi*/[*][*]   while(G != NULL)[*]   {[*]      printf("\nNodi adiacenti al nodo %d -> ", G->valore);[*]      arco = G->lista_archi_p;[*]      while(arco != NULL)[*]      {[*]         G_adiacente = arco->vertice_adiac_p;[*]         printf("%d", G->adiacente->valore);[*]         arco = arco->arco_succ_p;[*]         if(arco != NULL)[*]            printf(" -> ");[*]      }[*]      G = G->vertice_succ_p;[*]      printf("\n");[*]   }[*]   return;[*]}[*][*]/*DEFINIZIONE FUNZIONE PER AGGIUNGERE ARCO*/[*]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;[*]         }[*]      }[*]      G = G->vertice_succ_p;[*]   }[*]   return;[*]}[/list=1]
La compilazione va a buon fine senza segnalare ne errori ne warning, però quando vado a lanciare il programma mi restituisce "Errore di segmentazione".
Sono giorni che rigiro il programma sottosopra ma non riesco a venirne a capo, spero che qualcuno possa darmi una mano a trovare l'errore.
Grazie