Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Creazione e cancellazione grafo con matrice di adiacenza

    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):

    codice:
    #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?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non ho capito come dovrei allocarla :s

  4. #4
    Nessuno saprebbe aiutarmi? ^^"

  5. #5
    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:

    codice:
    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;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.