Grafi in c

di il
15 risposte

Grafi in c

Buongiorno devo realizzare un grafo in c calcolando grado in entrata e uscita con matrice e lista di adiacenza..il prof ha spiegato solo la teoria ho iniziato a realizzato il grafo con lista di adiacenza ma ho un problema con la stampa dei nodi

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

typedef struct edge{
    int key;
    struct edge *next;
}edge;

typedef struct graph{
    int nv;
    edge **adj;
}graph;

graph *inizializza_grafo(int n)
{
 graph *G;
 int i;

 G=(graph *) malloc (sizeof(graph));
 if (G==NULL)//controlla se la memoria è stata allocata
    printf("\nERRORE! Non è possibile allocare memoria\n");
 else

 {
    G->adj=(edge**) malloc (n*sizeof(edge));
  if ((G->adj==NULL) && (n>0))//controlla se la memoria è stata allocata
  {
    printf("\nERRORE! Non è possibile allocare memoria\n");
    free(G);
    G=NULL;//annulla anche l'allocazione di sopra
  }

  else
  {
     G->nv=n;
    for (i=0;i<n;i++)
        G->adj[i]=NULL;//tutti i vertici del grafo puntano a NULL
  }//end else
 }//end else
 return G;
}

void stampa(graph *G)
{
 int i,ne=0;
 edge *e;

 if (G!=NULL)
 {
    printf("\nIl grafo ha %d vertici\n",G->nv);
    for (i=0;i<G->nv;i++)
    {
        e=G->adj[i];
        printf("\n%d",i);
        while (e!=NULL)
        {

            printf(" --> %d ",e->key);
            e=e->next;
            ne++;
        }
    }
    printf("\n\nIl grafo ha %d archi\n",ne);
 }
}


int main()
{
    graph *G,*Int = NULL;
    int n;

do
{
    printf("Inserire il num di nodi dei grafi:");
    scanf("%d",&n);
    G=inizializza_grafo(n);
    stampa(Int);
    printf("\n premere 0 per uscire \n");
    scanf("%d",&n);
}
while(n!=0);
}

15 Risposte

  • Re: Grafi in c

    'Ho un problema' non vuol dire nulla. Spiegati in dettaglio.
  • Re: Grafi in c

    oregon ha scritto:


    'Ho un problema' non vuol dire nulla. Spiegati in dettaglio.
    In pratica vorrei inserire i vertici e stamparli ma con il programma indicato nel messaggio precedente mi fa inserire i vertici ma non mi stampa nulla ed il programma termina
  • Re: Grafi in c

    Ma l'hai scritto tu quel codice ? Mi sembra proprio di no ...
  • Re: Grafi in c

    oregon ha scritto:


    Ma l'hai scritto tu quel codice ? Mi sembra proprio di no ...
    si ho scritto prendendo in considerazione le slide del prof..c'e il professore li ha spiegati un po molto confusi ha dato la teoria e varie funzioni senza spiegare come va creato effettivamente il grafo e per questo sono un po confusa
  • Re: Grafi in c

    Praticamente copiato da questo

  • Re: Grafi in c

    oregon ha scritto:


    Praticamente copiato da questo

    sono del mio prof.
  • Re: Grafi in c

    Ma scusami ... crei il grafo G e stampi il grafo Int ??? E che c'entra?
  • Re: Grafi in c

    oregon ha scritto:


    Ma scusami ... crei il grafo G e stampi il grafo Int ??? E che c'entra?
    ho sbagliato a scrivere e stampa G

    Io l'ho fatto in modo iterativo cosi
    
    #include <stdlib.h>
    #include <stdio.h>
    #define MAX 100
    
    /*
     *  struttura per la rappresentazione dei nodi della lista
     */
    
    struct nodo {
      int info;
      struct nodo *next;
    };
    
    /*
     *  Legge in input una sequenza di n interi e li memorizza su
     *  una lista. Restituisce il puntatore al primo elemento della lista.
     */
    
    struct nodo *leggi_lista(void) {
      struct nodo *p, *primo;
      int x, n, i;
    
      printf("Numero di elementi nella lista: ");
      scanf("%d", &n);
      primo = NULL;
      for (i=0; i<n; i++) {
        scanf("%d", &x);
        p = malloc(sizeof(struct nodo));
        p->info = x;
        p->next = primo;
        primo = p;
      }
      return(primo);
    }
    
    /*
     *  Legge in input le n liste di adiacenza (una per ogni
     *  vertice del grafo G). Restituisce il numero di vertici
     *  di cui e' costituito il grafo e l'array di puntatori
     *  ai primi elementi di ogni lista di adiacenza.
     */
    
    int leggi_grafo(struct nodo *lista[]) {
      int i, n;
      printf("Numero di vertici: ");
      scanf("%d", &n);
      for (i=0; i<n; i++) {
        printf("Lista di adiacenza del vertice %d.\n", i);
        lista[i] = leggi_lista();
      }
      return(n);
    }
    
    /*
     *  Calcola il grado entrante ed uscente di ogni vertice i del grafo.
     *  Memorizza in in[i] e in out[i] rispettivamente il grado entrante
     *  ed il grado uscente del vertice i.
     */
    
    void calcola(int n, struct nodo *l[], int in[], int out[]) {
      int i;
      struct nodo *p;
    
      for (i=0; i<n; i++) {
        in[i] = 0;
        out[i] = 0;
      }
      for (i=0; i<n; i++) {
        p = l[i];
        while (p != NULL) {
          out[i]++;
          in[p->info]++;
          p = p->next;
        }
      }
      return;
    }
    
    /*
     *  Funzione principale.
     */
    
    int main(void){
      int i, n, grado_in[MAX], grado_out[MAX];
      struct nodo *lista[MAX];
    
      n = leggi_grafo(lista);
      calcola(n, lista, grado_in, grado_out);
      for (i=0; i<n; i++) {
          printf("vertice %d: grado entrante = %d, grado uscente = %d\n", i, grado_in[i], grado_out[i]);
    
      }
      return(0);
    }
    
    Ma vorrei farlo in modo ricorsivo ma non so da dove iniziare
  • Re: Grafi in c

    Tu non hai fatto nulla ... hai semplicemente copiato questo

    http://web2.mat.uniroma3.it/users/liverani/IN110/20010509a.shtml

    Cambi codici copiati qui e lì e presupponi che ti venga scritto tutto quello che non trovi? Ma hai capito a cosa serve il forum?

    PROVA TU A SCRIVERE il codice e presentalo qui, poi si vede. Soprattutto non cambiare discorso in un thread mille volte perché, come ti è stato detto mille volte, non si capisce più nulla e non si risponde più.

    Hai iniziato con UN CODICE e un PROBLEMA DI STAMPA e ti ho detto cosa avevi fatto. Il thread è concluso.

    UN'ALTRA STORIA E' quella relativa ad UN ALTRO CODICE e alla questione iterativa/ricorsiva CHE COMUNQUE DEVI SCRIVERE TU.

    Buona giornata.
  • Re: Grafi in c

    oregon ha scritto:


    Tu non hai fatto nulla ... hai semplicemente copiato questo

    http://web2.mat.uniroma3.it/users/liverani/IN110/20010509a.shtml

    Cambi codici copiati qui e lì e presupponi che ti venga scritto tutto quello che non trovi? Ma hai capito a cosa serve il forum?

    PROVA TU A SCRIVERE il codice e presentalo qui, poi si vede. Soprattutto non cambiare discorso in un thread mille volte perché, come ti è stato detto mille volte, non si capisce più nulla e non si risponde più.

    Hai iniziato con UN CODICE e un PROBLEMA DI STAMPA e ti ho detto cosa avevi fatto. Il thread è concluso.

    UN'ALTRA STORIA E' quella relativa ad UN ALTRO CODICE e alla questione iterativa/ricorsiva CHE COMUNQUE DEVI SCRIVERE TU.

    Buona giornata.
    okay ho provato a scriverlo io con le librerie che ho ma non mi stampa gli adiacenti come lista di adiacenza
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "graph.h"
    #include "list.h"
    
    #define MAX 50
    int main(int argc, const char * argv[]) {
        int n;
        Graph *G;
        struct TList *L[MAX];
    
        n = leggi_grafo(L);
        G = initGraph(n);
        printGraph(G);
        return 0;
    }
    
    
    #ifndef Graph_List_h
    #define Graph_List_h
    
    struct TList {
        int target;
        int peso;
        struct TList* next;
    };
    
    typedef struct TList* List;
    
    // Inizializza un nuovo nodo
    List initNodeList(int info, int peso);
    
    // Stampa la lista
    void printList(List L);
    #endif
    
    
    
    #ifndef Graph_Graph_h
    #define Graph_Graph_h
    #include "list.h"
    
    struct Graph {
        List *adj;
        int nodes_count;
    };
    
    typedef struct Graph* Graph;
    
    // Inizializza un nuovo grafo
    // specifica in ingresso quanti nodi vuoi nel grafo
    Graph initGraph(int nodes_count);
    
    // Stampa il grafo
    void printGraph(Graph G);
    #endif
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <assert.h>
    #include "graph.h"
    
    Graph initGraph(int nodes_count) {
        Graph G = (Graph)malloc(sizeof(struct Graph));
        G->adj = (List *)calloc(nodes_count, sizeof(List));
        G->nodes_count = nodes_count;
        return G;
    }
    
    
    void printGraph(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");
            }
        }
    }
    
    int leggi_grafo(struct  Graph  *L[]) {
      int i, n;
      printf("Numero di vertici: ");
      scanf("%d", &n);
      for (i=0; i<n; i++) {
        printf("Lista di adiacenza del vertice %d.\n", i);
        L[i] = leggi_lista();
      }
      return(n);
    }
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "list.h"
    
    List initNodeList(int info, int peso) {
        List L = (List)malloc(sizeof(struct TList));
        L->target = info;
        L->peso = peso;
        L->next = NULL;
        return L;
    }
    
    void printList(List L) {
        if (L != NULL) {
            printf(" %d(%d) ", L->target, L->peso);
            printList(L->next);
        }
    }
    
    
    struct TList *leggi_lista(void) {
      struct TList *p, *primo;
      int x, n, i;
    
      printf("Numero di elementi nella lista: ");
      scanf("%d", &n);
      primo = NULL;
      for (i=0; i<n; i++) {
        scanf("%d", &x);
        p = malloc(sizeof(struct TList));
        p->target = x;
        p->next = primo;
        primo = p;
      }
      return(primo);
    }
    
  • Re: Grafi in c

    Che cosa intendi con il dire: "il professore ha spiegato SOLO la teoria".
    CHE COSA dovrebbe spiegarti, OLTRE alla teoria?
  • Re: Grafi in c

    migliorabile ha scritto:


    Che cosa intendi con il dire: "il professore ha spiegato SOLO la teoria".
    CHE COSA dovrebbe spiegarti, OLTRE alla teoria?
    Non la biasimo, è vero, spiegare la teoria è sufficiente, ma vedere come si implementa il codice è molto utile.
  • Re: Grafi in c

    Quella si chiama ""pappa pronta"".

    Gli Italiani sono famosi per "l'arte di arrangiarsi".

    Vorresti distruggere questa fama ottenuta in ANNI di sacrifici, chiedendo "la pappa pronta" ???

    Come dico sempre:""pussa via brutta bertuccia""!!!



    n ogni caso, FA PARTE della fase di COMPRENSIONE della teoria, quella di metterla in pratica AFFRONTANDONE le difficolta'.
    E' IL SUPERAMENTO DELLE DIFFICOLTA', le strade SBAGLIATE, gli ERRORI che ti fanno comprendere la teoria, NON avere tutto facile e la strada GIA' SPIANATA. Sapere COME risolvere l'esercizio NON TI FORNISCE NESSUNA INFORMAZIONE, se non il fatto di risolvere l'esercizio a colpo sicuro.

    Ma questo modo di procedere E' ASSOLUTAMENTE INUTILE, perche' nel momento in cui devi affrontare una difficolta' di qualche genere, NON AVRESTI NESSUNA ESPERIENZA e nessuna strategia sul come affrontarla.

    ANCHE GLI ERRORI sono FONTE DI CONOSCENZA: aver gia' affrontato un errore ti permette di identificarlo la volta successiva. E magari vedere l'errore che hanno fatto altri.
  • Re: Grafi in c

    migliorabile ha scritto:


    Quella si chiama ""pappa pronta"".

    Gli Italiani sono famosi per "l'arte di arrangiarsi".

    Vorresti distruggere questa fama ottenuta in ANNI di sacrifici, chiedendo "la pappa pronta" ???

    Come dico sempre:""pussa via brutta bertuccia""!!!

    Allora tutti i libri di programmazione offrono la "pappa pronta", poichè allegano spezzoni di codice sotto le spiegazioni . Non mi fraintendere, fare gli esercizi al posto dello studente lo ritengo sbagliato, ma far vedere l'implementazione di alcune parti del codice spiegandone il comportamento secondo me è produttivo. Ovviamente questa è la mia opinione, comunque imparare ad arrangiarsi è fondamentale. Sul fatto che gli errori sono fonte di conoscenza sono d'accordissimo con te, a volte si impara di più dagli errori che dai libri.
Devi accedere o registrarti per scrivere nel forum
15 risposte