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