Grafo orientato

di il
33 risposte

Grafo orientato

Buonasera dato un grafo orientato devo determinare il massimo grado entrante ed uscente..ho realizzato cioè ma mi da errore quando inserisco la coppia collegata da arco

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

struct TList {
    int target;
    struct TList* next;
};

typedef struct TList* List;

struct TGraph {
    List *adj;
    int nodes_count;
};

typedef struct TGraph* Graph;

List appendNodeList(List L, int target);
List initNodeList(int info);
Graph initGraph(int nodes_count);
void addEdge(Graph G, int source, int target);
void printList(List L);
void printGraph(Graph G);
void printGraphAux(Graph G);



Graph initGraph(int nodes_count) {
    Graph G = (Graph)malloc(sizeof(struct TGraph));
    G->adj = (List *)calloc(nodes_count, sizeof(List));
    G->nodes_count = nodes_count;
    return G;
}

void addEdge(Graph G, int source, int target) {
    assert(G != NULL);
    assert(source < G->nodes_count);
    assert(target < G->nodes_count);
    if (source != target) {
        G->adj[source] = appendNodeList(G->adj[source], target);
    }
    
}

List appendNodeList(List L, int target) {
    if (L != NULL) {
        if (L->target != target) {
            L->next = appendNodeList(L->next, target);
        }
    } else {
        L = initNodeList(target);
    }
    return L;
}

List initNodeList(int info) {
    List L = (List)malloc(sizeof(struct TList));
    L->target = info;
    L->next = NULL;
    return L;
}


void printGraphAux(Graph G) {
    if (G != NULL) {
        int x = 0;
        for (x = 0; x < G->nodes_count; x++) {
            printf("%d -> ", x);
            printList(G->adj[x]);
            printf("\n");
        }
    }
}

void printGraph(Graph G) {
    printGraphAux(G);
    printf("\n\n");
}


void printList(List L) {
    if (L != NULL) {
        printf(" %d ", L->target);
        printList(L->next);
    }
}



int main()
{
    
    int n,e,i,v,u;
    Graph *G = NULL;
    

    printf("\nEnter the number of vertices - ");
    scanf("%d",&n);

    initGraph(n);
    printf("\nEnter the number of edges - ");
    scanf("%d",&e);

    printf("\nVertices are - ");
    for(i=0;i<n;i++)
        printf("%d ",i);


    printf("\nEnter the edges separated by space - ");
    for(i=0;i<e;i++)
    {
        scanf("%d%d",&v,&u);
        addEdge(G, v, u);
    }
    
    printGraph(n);
    printf("\n\n");


}
Mi da questo errore nella funzione addEdge: assertion failed: (G != NULL), function addEdge, line 34.
Potete aiutarmi a risolvere?

33 Risposte

  • Re: Grafo orientato

    Io non capisco quale sia il senso di aprire contemporaneamente stessi thread su forum diversi…

    Ma il codice lo hai scritto tu? Sai cosa è assert?
  • Re: Grafo orientato

    Http://www.cplusplus.com/reference/cassert/assert

    Suggerimento: qualcosa che riguardi la initGraph?
  • Re: Grafo orientato

    Ma CHE SENSO HA mettersi ad inserire un arco alla volta!
    NON TI PASSA PIU' !!!!!

    Il codice non lo ha scritto lui!

    1) il codice e' in inglese ed e' strano che un Italiano scriva in inglese
    2) il codice usa alcune soluzioni implementative DECISAMENTE RAFFINATE che il nostro autore NON PUO' conoscere, altrimenti non avrebbe i problemi che sta' riscontrando
    3) manca TOTALMENTE il codice per calcolare il grado di un nodo
    4) manca TOTALMENTE il codice per calcolare il grado massimo

    Qui' gatta ci cova
  • Re: Grafo orientato

    migliorabile ha scritto:


    Ma CHE SENSO HA mettersi ad inserire un arco alla volta!
    NON TI PASSA PIU' !!!!!

    Il codice non lo ha scritto lui!

    1) il codice e' in inglese ed e' strano che un Italiano scriva in inglese
    2) il codice usa alcune soluzioni implementative DECISAMENTE RAFFINATE che il nostro autore NON PUO' conoscere, altrimenti non avrebbe i problemi che sta' riscontrando
    3) manca TOTALMENTE il codice per calcolare il grado di un nodo
    4) manca TOTALMENTE il codice per calcolare il grado massimo

    Qui' gatta ci cova
    Mancano perche volevo prima calcolare gli adiacenti e poi il grado massimo uscente ed entrante...ed il codice l'ho scritto io
  • Re: Grafo orientato

    _Achille ha scritto:


    Io non capisco quale sia il senso di aprire contemporaneamente stessi thread su forum diversi…

    Ma il codice lo hai scritto tu? Sai cosa è assert?
    che allora mettetevi d'accordo prima dite che non va scritto tutto in un thread se si trattano di cose diverse e poi dite il contrario mettetevi il cervello in pace!!!
  • Re: Grafo orientato

    Intanto non hai letto la mia risposta.

    Ma il cervello lo devi accendere tu... Achille parlava di stesso thread IN FORUM DIVERSI.
    Questa pratica qui è VIETATA
  • Re: Grafo orientato

    oregon ha scritto:


    Http://www.cplusplus.com/reference/cassert/assert

    Suggerimento: qualcosa che riguardi la initGraph?
    grazie come dice qui ho provato ad inserire una: #define NDEBUG ma non mi funziona lo stesso mi porta un'errore qui
    
    void printGraphAux(Graph G) {
        if (G != NULL) {
            int x = 0;
            for (x = 0; x < G->nodes_count; x++) {
                printf("%d -> ", x);
                printList(G->adj[x]);
                printf("\n");
            }
        }
    }
    
    quando deve inserire la "freccia"
  • Re: Grafo orientato

    oregon ha scritto:


    Intanto non hai letto la mia risposta.

    Ma il cervello lo devi accendere tu... Achille parlava di stesso thread IN FORUM DIVERSI.
    Questa pratica qui è VIETATA
    ah allora mi scuso non succederà più
  • Re: Grafo orientato

    saraciao ha scritto:


    oregon ha scritto:


    Http://www.cplusplus.com/reference/cassert/assert

    Suggerimento: qualcosa che riguardi la initGraph?
    grazie come dice qui ho provato ad inserire una: #define NDEBUG ma non mi funziona lo stesso mi porta un'errore qui
    
    void printGraphAux(Graph G) {
        if (G != NULL) {
            int x = 0;
            for (x = 0; x < G->nodes_count; x++) {
                printf("%d -> ", x);
                printList(G->adj[x]);
                printf("\n");
            }
        }
    }
    
    quando deve inserire la "freccia"
    No, io ti avevo detto di controllare la initGraph e come l'hai usata. Il messaggio della assert ti deve far capire che qualcosa non va in G.

    P.S. non basta copiare il codice dal forum di UniNa, bisogna capirlo!
  • Re: Grafo orientato

    oregon ha scritto:


    saraciao ha scritto:


    oregon ha scritto:


    Http://www.cplusplus.com/reference/cassert/assert

    Suggerimento: qualcosa che riguardi la initGraph?
    grazie come dice qui ho provato ad inserire una: #define NDEBUG ma non mi funziona lo stesso mi porta un'errore qui
    
    void printGraphAux(Graph G) {
        if (G != NULL) {
            int x = 0;
            for (x = 0; x < G->nodes_count; x++) {
                printf("%d -> ", x);
                printList(G->adj[x]);
                printf("\n");
            }
        }
    }
    
    quando deve inserire la "freccia"
    No, io ti avevo detto di controllare la initGraph e come l'hai usata. Il messaggio della assert ti deve far capire che qualcosa non va in G.

    P.S. non basta copiare il codice dal forum di UniNa, bisogna capirlo!
    a me sembra corretto initGraph...non ho copiato dal forum unina...il debug mi dice che c'è un errore qui
    
    
    void printGraphAux(Graph G) {
        if (G != NULL) {
            int x = 0;
            for (x = 0; x < G->nodes_count; x++) {
                printf("%d -> ", x);
                printList(G->adj[x]);
                printf("\n");
            }
        }
    }
    
    
  • Re: Grafo orientato

    Riparti dalla assert. Perché ti dava errore? Controlla di nuovo come hai usato la initGraph.

    P.S
    Puoi spiegare perché hai usato quelle tre assert? Perché le hai inserite? A cosa servono? Sono le stesse assert identiche in un codice preso da UniNa. Dunque ci dobbiamo bere che le hai inserite tu? La sincerità è la prima cosa...
  • Re: Grafo orientato

    oregon ha scritto:


    Riparti dalla assert. Perché ti dava errore? Controlla di nuovo come hai usato la initGraph.

    P.S
    Puoi spiegare perché hai usato quelle tre assert? Perché le hai inserite? A cosa servono? Sono le stesse assert identiche in un codice preso da UniNa. Dunque ci dobbiamo bere che le hai inserite tu? La sincerità è la prima cosa...
    ho aggiunto la: #define NDEBUG ed in tal modo in debuggano non mi da errore...ti ripeto mi da errore quando inserisco la freccia per gli adiacenti nella
    void printGraphAux(Graph G).
  • Re: Grafo orientato

    Ti ripeto l'ultima volta ... controlla come hai usato la initGraph. Quello che hai fatto ha disabilitato la assert ma la assert segnala un problema che dipende dall'uso della initGraph. Se non vuoi seguire i consigli e fare come sempre di testa tua continua sul forum di inforge o tomshw e auguri.
  • Re: Grafo orientato

    oregon ha scritto:


    Ti ripeto l'ultima volta ... controlla come hai usato la initGraph. Quello che hai fatto ha disabilitato la assert ma la assert segnala un problema che dipende dall'uso della initGraph. Se non vuoi seguire i consigli e fare come sempre di testa tua continua sul forum di inforge o tomshw e auguri.
    La sto controllando e non vedo errori sinceramente
Devi accedere o registrarti per scrivere nel forum
33 risposte