PDA

Visualizza la versione completa : [C] creare un grafo


bubblesort
17-01-2008, 00:34
Salve a tutti, :ciauz:
la prima volta che scrivo sul forum anche se vi leggo da sempre.
Sto facendo un programma per un esame, ma non riesco a risolvere questo problema :dh: ..
il programma deve creare un grafo... ho scritto questa funzione ricorsiva che dovrebbe creare una lista collegata ma non funzia... mi da sempre

Segmentation fault (core dumped) :bh:

ma non capisco perch!!!
Vi metto anche la chiamante.. potete aiutarmi?



CHIAMANTE:
inizio_grafo_p = crea_grafo(numero_vertici_grafo);




CREA GRAFO:

vertice_grafo_t *crea_grafo (int numero_vertici_grafo)
{
vertice_grafo_t *vertice_p = NULL,
*primo_vertice_p = NULL;

if(numero_vertici_grafo == 1)
{
vertice_p = malloc(sizeof(vertice_grafo_t)); /* Crea vertice */
vertice_p->valore = numero_vertici_grafo; /* Imposta valore vertice corrente */
vertice_p->colore = bianco; /* Imposta colore vertice corrente */
crea_archi(); /* Crea adiacenze*/
vertice_p->vertice_succ_p = NULL;
primo_vertice_p = vertice_p;
}
else
{
vertice_p = malloc(sizeof(vertice_grafo_t)); /* Crea vertice */
vertice_p->valore = numero_vertici_grafo; /* Imposta valore vertice corrente */
vertice_p->colore = bianco; /* Imposta colore vertice corrente */
crea_archi(); /* Crea adiacenze*/
vertice_p->vertice_succ_p = crea_grafo(numero_vertici_grafo-1);
}

return(primo_vertice_p);
}


Potete aiutarmi?

Grazie!!!

menphisx
17-01-2008, 02:12
La funzione ritorna NULL quando non gli passi 1; perch ritorni primo_vertice_p, che non allocato, invece di vertice_p.
In pratica in tutti i casi tranne quando non 1 tu ritorni un puntatore nullo.

:ciauz:

bubblesort
18-01-2008, 17:46
Sembra che funzioni!
Grazie menphisx !
E' che mi intreccio un po' con i puntatori
La funzione dovrebbe prendere in pasto il numero di vertici del grafo collegarli in successione:

tipo: 1->2->3->...->NULL

restituire un puntatore al primo vertice..

l'ho corretta cos:



/*
* Crea grafo
*/
inizio_grafo_p = crea_grafo(numero_vertici_grafo, 1);







/*
* definizione funzione CREA VERTICI
*/
vertice_grafo_t *crea_grafo (int numero_vertici_grafo,
int valore_primo_vertice)
{
vertice_grafo_t *vertice_p = NULL;

if(numero_vertici_grafo == 1)
{
vertice_p = (vertice_grafo_t *) malloc (sizeof(vertice_grafo_t)); /* Crea vertice */
vertice_p->valore = valore_primo_vertice; /* Imposta valore vertice corrente */
vertice_p->colore = bianco; /* Imposta colore vertice corrente */
crea_archi(); /* Crea adiacenze*/
vertice_p->vertice_succ_p = NULL;

}
else
{
vertice_p = (vertice_grafo_t *) (sizeof(vertice_grafo_t)); /* Crea vertice */
vertice_p->valore = valore_primo_vertice; /* Imposta valore vertice corrente */
vertice_p->colore = bianco; /* Imposta colore vertice corrente */
crea_archi(); /* Crea adiacenze*/
vertice_p->vertice_succ_p = crea_grafo(numero_vertici_grafo-1, valore_primo_vertice + 1);

}

return(vertice_p);
}



Giusto? o no?

:ciauz:

menphisx
20-01-2008, 21:53
Mi pare di si :)

Loading