Libreria Grafi Parsing

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Libreria Grafi Parsing

    Allora fai queste correzioni e il codice funzionerà, ma se rivedi le strutture dati sarà tutto più semplice.

    In grafo.c
    
    GrafoAdj convertToLista (GrafoAdj G, GrafoMatr M, int n) {
        int i,j;
        for(i=0; i<n; i++) {
            G=creaNodoLista(G,i+1);
            printf("E' stato aggiunto il VERTICE  %d\n", i+1);
            for(j=0; j<n; j++) {
                if((M[i][j])==1) {
                    printf("Esiste un arco da %d a %d\n",i+1,j+1);
                    creaNodoListaAdj(G,j+1,i+1);
                }
    
            }
        }
    
        return G;
    }
    In grafolista.c
    
    void creaNodoListaAdj (GrafoAdj g, int val, int nodo) {
        if(g==NULL) printf("::Errore:: Grafo Vuoto!\n\n");
        else {
            if (g->vertice==nodo) { // verifica che il vertice del grafo corrisponde al nodo di cui bisogna aggiungere la lista di adj
                printf("g->vertice==nodo\n");
                g->adiacenze=lista_insert(g->adiacenze,val);
            } else
                creaNodoListaAdj(g->next,val,nodo);
        }
        return;
    }
    In grafoparser.c
    
    void verticiAdj (GrafoAdj G, GrafoMatr M, int nodo, FILE *file) {
        //Traduci vertici adiacenti
        int res,val;
        float peso;
        res=confronto(file,PUNT);  // Cerca freccia che indica a quali vertici punta il nodo in questione
        if (res) {
            // Se IL SIMBOLO PUNTATORE è stato trovata verificare che segua un peso
            sposta(file,PARSX);
            if(confronto(file,PESO)) {
                peso=traduciPeso(file);
    
                if(peso>1)
                    printf("ha %d figli: ", (int)peso);
                else if (peso==0)
                    printf("non ha figli.");
                else
                    printf("ha 1 figlio: ");
    
                while (peso>0) {
                    sposta(file,NODO);
                    sposta(file,BARRA); //dopo la barra si trovano i vertici adiacenti
                    sposta(file,NODO);
                    val=traduciIntero(file);
                    printf("%d ",val);
                    if(G!=NULL) creaNodoListaAdj(G,val,nodo);
                    else M[nodo-1][val-1]=1;
                    peso=peso-1;
                }
    
                printf("\n");
    
                sposta(file,PUNTOV);
            }
    
        }
    
        else printf("ERRORE SINTASSI PESO -2!\n");
    }
    In grafolista.h
    
    void creaNodoListaAdj (GrafoAdj g, int val, int nodo);
  • Re: Libreria Grafi Parsing

    Grazie mille funziona!
    Io nello scrivere la funzione in automatico avevo fatto che ritornasse il grafo, come mai in quel caso non funzionava? Cioè dico dal punto di vista teorico, perchè era sbagliato? Per capire meglio l'errore Ora provo a rielaborare il tutto cambiando le strutture dati, anche se ho qualche piccolo dubbio.

    Qualcosa del genere?
    grafo.h
    typedef struct GrafoL * GrafoList;
    typedef struct GrafoM * GrafoMatr;
    grafo.c
    #include "grafo.h"
    #include "grafolista.h"
    #include "grafomatrice.h"
    
    typedef struct grafoL{
        int numVertici;
        struct ListaAdj * adj;
        }GrafoL;
        
    typedef struct grafoM{
        int numVertici;
        MatrAdj adj;
        }GrafoM;
    
    grafolista.h
    typedef struct Lista * ListaAdj;
    grafolista.c
    typedef struct lista{
        int vertice;
        struct Lista *next;
        }Lista;
    grafomatrice.h
    typedef int** MatrAdj;
  • Re: Libreria Grafi Parsing

    violet_prog ha scritto:


    come mai in quel caso non funzionava?
    Ovviamente cambiava il puntatore a G e quindi perdevi quanto memorizzato prima.

    violet_prog ha scritto:


    Cioè dico dal punto di vista teorico, perchè era sbagliato?
    L'errore sta nel fatto che cambiando il puntatore non hai più di dati.

    Dovresti abituarti a vedere una struttura dati come una stanza, dentro può esserci tutto quello che vuoi, ma chi accede dall'esterno non è interessato a nulla di quello che c'è dentro, ha necessità solo che alla porta ci sia una maniglia per entrare. Solo chi sta dentro può operare su quella struttura dati, chi sta fuori deve poterci operare tramite le funzioni che a lui sono messe a disposizione. Tutto quello che non serve non si mette a disposizione.
  • Re: Libreria Grafi Parsing

    Ok grazie!
    Avevo modificato il messaggio precedente aggiungedo un'idea di strutture
  • Re: Libreria Grafi Parsing

    
        #include "grafo.h"
        #include "grafolista.h"
        #include "grafomatrice.h"
    
        typedef struct grafoL{
            int numVertici;
            ListaAdj * adj;
            }GrafoL;
           
        typedef struct grafoM{
            int numVertici;
            MatrAdj adj;
            }GrafoM;
    
    
    Può andar bene, ma grafolista.h e grafomatrice.h non le importi in main.c o altri moduli. Tutto deve essere gestito tramite grafo.h.

    Io avrei pensato per esempio che la parsificazione costruisce un vettore di archi e dopo aver parsificato prendi il vettore e chiedi ad una funzione di grafo.h di caricare il grafo. Tutto trasparente. Domani se cambia il modello del file, devi riscrivere la libreria che parsifica, ritornandoti di nuovo un vettore.
  • Re: Libreria Grafi Parsing

    Io avrei pensato per esempio che la parsificazione costruisce un vettore di archi e dopo aver parsificato prendi il vettore e chiedi ad una funzione di grafo.h di caricare il grafo. Tutto trasparente. Domani se cambia il modello del file, devi riscrivere la libreria che parsifica, ritornandoti di nuovo un vettore.
    in questo modo la libreria che parsifica non modifica direttamente il grafo, giusto?
    mi piace come idea, ci provo!
  • Re: Libreria Grafi Parsing

    Certo che no!
Devi accedere o registrarti per scrivere nel forum
21 risposte