Ciao a tutti.
In relazione al thread da me aperto:
http://forum.html.it/forum/showthrea...readid=1529337
vi riporto il codice della funzione che mi causa l'errore. Precedentemente vi era un errore prima di questa e correggendolo l'errore mi si è spostato, quindi mi viene da pensare che ho commesso gli errori in "coppia" per una mia interpretazione maldestra.
Questa funzione prende in ingresso un array di interi, la testa del grafo precedentemente acquisito, la dim di esso e la dimensione del nuovo sottografo che verrà creato a aprtire dall'array di inetri.
L'array contiene solamente 0 e 1 che rappresentano il fatto che il nodo con nome i è presente nel sottografo (puntatore[i] vale 1) oppure no (puntatore[i] vale 0). Quindi nella prima fase che può sembrare insensata sto mettendo tutti i nomi dei nodi che dovranno far parte del nuovo sottografo in un array.
Ecco il codice:
codice:
/*************************************************/
/*Definizione della funzione verifica_connessione*/
/*************************************************/
int verifica_connessioni(int* puntatore,vertice_grafo_t *testa_v, int nodi, int nodi_sottografo)
{
int verifica,/*variabile da restituire, se 0->grafo non connesso, se 1->grafo connesso*/
i,j;/*indici di sscorrimento*/
int sottografo[nodi_sottografo];/*vettore che conterrà il nome dei vertici che compongono l'individuo*/
int *visitati;/*puntatore per contenere il valore di ritorno della funzione avvia_visita_grafo_amp(...);*/
vertice_grafo_t *vertice, *testa_sottografo, *vertice_grafo, *vertice_adiac;
arco_grafo_t *testa_a, *arco;/*puntatore a un arco del grafo e alla testa lista archi*/
printf("verifica_connessioni: attiva...\n");
/*metto i vertici del sottografo in un array*/
for(i=0, j=0;i<nodi;i++)
{
/*se la posizione i dell'array contiene un 1*/
if(puntatore[i] ==1)
{
/*allora memorizzo il valore di indice nel array che contiene i vertici del sottografo*/
sottografo[j] = i;
/*mi sposto in una nuova cella del sottografo*/
j++;
}
}
/*creo la lista primaria dei vertici*/;
testa_sottografo = vertice =(vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));
/*nomino il primo vertice*/
vertice->nome = sottografo[0];
/*pongo il puntatore al successivo a NULL*/
vertice->lista_archi = NULL;
/*procedo a creare gli altri vertici*/
for(i=1;i<nodi_sottografo;i++)
{
/*alloco spazio per il vertice successivo*/
vertice->next=(vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));
/*punto al vertice successivo*/
vertice = vertice->next;
/*nomino il vertice*/
vertice->nome = sottografo[i];
/*pongo il puntatore al successivo a NULL*/
vertice->lista_archi = NULL;
}
vertice->next = NULL;
/*creo la lista secondaria*/
/*scorro l'array individuo*/
for(i=0, vertice = testa_sottografo ;i<nodi_sottografo;i++)
{
/*per ogni vertice nell'individuo lo cerco nella lista primaria del grafo*/
for(vertice_grafo = testa_v; vertice_grafo != NULL; vertice_grafo = vertice_grafo-> next)
{
/*cerco il vertice che abbia lo stesso nome di quello contenuto nella posizione i di sottografo*/
if(sottografo[i] == vertice_grafo->nome)
{
/*controllo, per ogni arco della sua lista archi, se il vertice adiacente è persente nel sottografo*/
for(arco = vertice_grafo->lista_archi; arco != NULL ; arco = arco->next)
{
printf("Si blocca qui dopo un certo numero di iterazioni\n");
/*scorro gli elementi dell'array sottografo*/
for(j=0;j<nodi_sottografo;j++)
{
printf("Oppure qua, dipende dalle esecuzioni\n");
//printf("Confronto %d con %d con j = %d\n", arco->vertice_adiac->nome, sottografo[j], j);
/*se il vertice adiacente a questo arco è presente nel sottografo, aggiungo questo arco*/
if(arco->vertice_adiac->nome == sottografo[j])
{
/*cerco il vertice adiacente nella lista primaria del mio sottografo*/
vertice_adiac = testa_sottografo;
while(vertice_adiac->nome != arco->vertice_adiac->nome)
{
vertice_adiac = vertice_adiac->next;
}
/*se il vertice non possiede ancora una lista archi la creiamo*/
if(vertice->lista_archi == NULL)
{
/*creo un nuovo arco*/
vertice->lista_archi = (arco_grafo_t *)malloc(sizeof(arco_grafo_t));
/*potrebbe essere il primo e unico arco aggiunto*/
vertice->lista_archi->next = NULL;
/*regolo il puntatore al vertice adiacente*/
vertice->lista_archi->vertice_adiac = vertice_adiac;
/*copio il peso dell'arco del grafo nell'arco del sottografo*/
vertice->lista_archi->peso = arco->peso;
}/*end if*/
/*se la lista archi esiste già*/
else
{
/*cerco la coda della lista archi*/
testa_a = vertice->lista_archi;
while(testa_a->next != NULL)
{
testa_a = testa_a->next;
}
/*aggiungo il nuovo arco in coda*/
testa_a->next = (arco_grafo_t *)malloc(sizeof(arco_grafo_t));
/*punto alla nuova locazione*/
testa_a = testa_a->next;
/*metto il puntatore all'arco successivo al nuovo aggiungo a NULL*/
testa_a->next = NULL;
/*regolo il puntatore al vertice adiacente*/
testa_a->vertice_adiac = vertice_adiac;
/*copio il peso dell'arco del grafo nell'arco del sottografo*/
testa_a->peso = arco->peso;
//printf("Aggiungo l'arco di peso %.2lf al vertice %d.\n", arco->peso, vertice->nome);
}/*end else*/
}/*end if*/
}/*end for*/
}/*end for*/
}/*end if*/
}/*end for*/
/*passo al vertice del sottografo successivo*/
vertice = vertice-> next;
}/*end for*/
/*acquisisco il vettore contenente i vertici visitati*/
visitati = avvia_visita_grafo_amp(testa_sottografo, nodi_sottografo);
/*confronto i vertici visitati con quelli del sottografo*/
for(i=0;i<nodi_sottografo;i++)
{
if(sottografo[i] != visitati[i])
verifica = 0;
else
verifica = 1;
}
/*dealloco il sottografo*/
for(vertice = testa_sottografo; vertice->next != NULL; vertice = vertice->next)
{
free(vertice);
}
free(testa_sottografo);
printf("Verifica: %d.\n", verifica);
return(verifica);
}