[C] Creazione grafo con matrice di adiacenza

di il
4 risposte

[C] Creazione grafo con matrice di adiacenza

Salve a tutti, per un esercizio universitario ho necessità di creare un grafo con matrice di adiacenza. Questo è il codice di creazione:
#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, j;
    	dirgraph_t graph;
    
	graph->n = n;
	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));
	
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
			graph->adj[i][j] = 0;
	}

	return graph;
}


Nel momento della compilazione però mi dice che alla riga di graph->n = n; il grafo non è inizializzato... ma non lo sto inizializzando ora? Non capisco come dovrei inizializzare il grafo prima di usarlo.

4 Risposte

  • Re: [C] Creazione grafo con matrice di adiacenza

    ASSIOMA/REGOLA di PLUTONIO (vale notevolmente piu' dell'ORO), sopprattutto in C/C++:

    INIZIALIZZARE SEMPRE LE VARIABILI LOCALI.

    Questo viene fatto in automatico SOLO se il TIPO della variabile e' una classe/struttura e questa ha un costruttore di default, ALTRIMENTI devi chiamare esplicitamente il costruttore.

    Nel tuo coso, "digraph_t" (che e' un puntatore a "digraph_s", ti direi, 'pessima scelta del nome, meglio chiamarlo 'dgraph_ptr') NON E' una struttura, ma UN PUNTATORE, e i puntatori, LI DEVI INIZIALIZZARE ESPLICITAMENTE:
    
    ...
    typedef struct dirgraph_s* dirgraph_ptr;
    
    dirgraph_t dirgraph_create(int n) {
    
       int i, j;
       dirgraph_ptr graph;
       
       // CHI HA INIZIALIZZATO 'graph' ??????????????
       
       graph->n = n;
       ..
    
  • Re: [C] Creazione grafo con matrice di adiacenza

    Ok, ho provato a modificare il codice in questo modo (so che il codice fa pena ma mi serve solo per testare le funzioni di creazione/cancellazione):
    #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 = 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;
    }
    
    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 = NULL;
        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);
        }
        return 0;
    }
    Non mi dà più nessun errore quando lo compilo, ma al momento della creazione mi dà un errore di segmentazione che non so a cosa è dovuto,
  • Re: [C] Creazione grafo con matrice di adiacenza

    MA PER FORZA! Zanzara!
    
    dirgraph_t graph = NULL;  // <<<<   MA CHE ACCIDERBOLINA COMBINI !!!!!!!
       
        graph->adj = (int**)malloc(n*sizeof(int *)); //allocazione array di n puntatori a righe. E 'graph' CHI LO HA ALLOCATO !!!!!!
    
    RAGIONA, per la pupattola: non scrivere codice a casaccio, leggendo SOLO le parole dei posti che vengono scritti!
  • Re: [C] Creazione grafo con matrice di adiacenza

    dirgraph_t dirgraph_create(int n) {
    
        int i;
        dirgraph_t graph = (struct dirgraph_s*)malloc(sizeof(struct dirgraph_s));
       
        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;
    }
    Risolto, grazie.
Devi accedere o registrarti per scrivere nel forum
4 risposte