PDA

Visualizza la versione completa : [C] Creazione e cancellazione grafo con matrice di adiacenza


Kuroda
24-03-2017, 14:09
Salve a tutti, come esercizio universitario dovrei creare in C un grafo con matrice di adiacenza (per il momento vuoto), stamparlo ed eliminarlo. Il problema che il programma smette di funzionare durante l'allocazione della matrice, e non capisco perch. Questo il codice ( solo una bozza, so che pieno di difetti ma mi serve solo per vedere se le funzioni sono corrette):


#include<stdio.h>
#include<stdlib.h>

struct dirgraph_s {
int** adj; //Matrice di adiacenza.
int n; //Numero di nodi del grafo.
};
typedef struct dirgraph_s* dirgraph_t;

dirgraph_t dirgraph_create(int n) {

int i;

dirgraph_t graph;
graph->adj = (int**)malloc(n*sizeof(int *)); //allocazione array di puntatori a righe

for(i=0; i<n; i++) //allocazione riga per ogni puntatore dell'array
graph->adj[i] = (int *)malloc(n*sizeof(int));

return graph;
}

int dirgraph_destroy(dirgraph_t graph) {

if(graph->adj != NULL)
{
free(graph);
return 1;
}
else if(graph->adj == NULL)
return -1;
else
return 0;
}

int main()
{
dirgraph_t graph;
int i, n;

printf("Scegliere cosa fare:\n0 - Eliminare il grafo e chiudere il programma.\n1 - Creare il grafo.\n2 - Stampare il grafo.\n");
scanf("%d", &i);

if(i == 0)
{
int out = dirgraph_destroy(graph);

if(out == 1)
printf("Il grafo stato cancellato correttamente.\n");
else if(out == 0)
printf("Il grafo gi vuoto.\n");
else
printf("Errore.\n");
}
else if(i==1)
{
printf("Inserire il numero di vertici presenti nel grafo:\t");
scanf("%d", &n);
graph = dirgraph_create(n);
}
else if(i==2)
{
int n1, n2;

if(graph->adj != NULL)
{
for(n1=0; n1<n; n1++)
{
for(n2=0; n2<n; n2++)
{
printf("%d\n", graph->adj[n1][n2]);
}
}
}
else
printf("Errore: grafo non trovato.");
}
else
{
printf("Errore: comando non valido.\n");
exit(1);
}
}

Qualcuno saprebbe aiutarmi?

oregon
24-03-2017, 14:55
In dirgraph_create
dirgraph_t graph

non hai allocato la struttura prima di usarla.

E nel main dovresti impostare a NULL il puntatore

dirgraph_t graph;

Kuroda
25-03-2017, 13:47
Non ho capito come dovrei allocarla :s

Kuroda
28-03-2017, 14:07
Nessuno saprebbe aiutarmi? ^^"

Kuroda
31-03-2017, 12:21
Ok, ho modificato il codice in questo modo (ed ho messo dirgraph_t = NULL nel main) ed ora non mi d pi nessun tipo di warning, ma il programma va in crash comunque quando provo a creare il grafo:


dirgraph_t dirgraph_create(int n) {

int i, j;
dirgraph_t graph = NULL;

graph->adj = (int**)malloc(n*sizeof(int *)); //allocazione array di n puntatori a righe
for(i=0; i<n; i++) //allocazione riga per ogni puntatore dell'array
graph->adj[i] = (int *)malloc(n*sizeof(int));
graph->n = n;

for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
graph->adj[i][j] = 0;
}

return graph;
}

Loading