Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema sul programma
Forum - C/C++ - problema sul programma

Avatar
aleandro03 (Normal User)
Newbie


Messaggi: 15
Iscritto: 20/05/2013

Segnala al moderatore
Postato alle 10:29
Sabato, 25/05/2013
Questo topic è stato chiuso dal moderatore

ciao, ho fatto un programma che tramite bfs dovrebbe calcolare il cammino minimo di un grafo però quando mando in esecuzione il prgramma alla fine dell'esecuzione mi dice annullato core dump creato e praticamente non parte il programma e non capisco il motivo...per favore mi date una mano?adesso vi posto il codice


Codice sorgente - presumibilmente C++

  1. /*
  2.  *  inclusione delle librerie
  3.  */
  4.  
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7.  
  8.  
  9. /*
  10.  *  definizione della costante che indica la massima dimensione
  11.  *  del grafo (|V|<MAX).
  12.  */
  13.  
  14. #define MAX 100
  15.  
  16.  
  17. /*
  18.  *  definizione della struttura utilizzata per rappresentare i
  19.  *  vertici del grafo nelle liste di adiacenza ed i nodi della
  20.  *  coda Q.
  21.  */
  22.  
  23. struct nodo {
  24.   int info;
  25.   struct nodo *next;
  26. };
  27.  
  28.  
  29. /*
  30.  *  Legge in input una sequenza di n interi e li memorizza su
  31.  *  una lista. Restituisce il puntatore al primo elemento della lista.
  32.  */
  33.  
  34. struct nodo *leggi_lista(void) {
  35.   struct nodo *p, *primo;
  36.   int x, n, i, centrali;
  37.   FILE *file_centrali;
  38.   file_centrali = fopen("centrali.txt",
  39.                         "r");
  40.   fscanf(file_centrali,
  41.          "%d",
  42.          &centrali);
  43.   printf("Numero centrali adiacenti: ");
  44.   scanf("%d", &n);
  45.   primo = NULL;
  46.   for (i=0; i<n; i++) {
  47.     scanf("%d", &x);
  48.     p = malloc(sizeof(struct nodo));
  49.     p->info = x;
  50.     p->next = primo;
  51.     primo = p;
  52.   }
  53.   return(primo);
  54. }
  55.  
  56.  
  57. /*
  58.  *  Legge in input le n liste di adiacenza (una per ogni
  59.  *  vertice del grafo G). Restituisce il numero di vertici
  60.  *  di cui e' costituito il grafo e l'array di puntatori
  61.  *  ai primi elementi di ogni lista di adiacenza.
  62.  */
  63.  
  64. int leggi_grafo(struct nodo *lista[]) {
  65.   int i, n, centrali;
  66.   FILE *file_centrali;
  67.   file_centrali = fopen("centrali.txt",
  68.                         "r");
  69.   fscanf(file_centrali,
  70.          "%d",
  71.          &centrali);
  72.   printf("Numero totale di centrali: ");
  73.   scanf("%d", &n);
  74.   for (i=0; i<n; i++) {
  75.     printf("Lista di adiacenza del vertice %d.\n", i);
  76.     lista[i] = leggi_lista();
  77.   }
  78.   return(n);
  79. }
  80.  
  81.  
  82. /*
  83.  *  accoda
  84.  *
  85.  *  aggiunge un nodo alla coda Q; "primo" punta la primo elemento,
  86.  *  "ultimo" punta all'ultimo elemento della coda.
  87.  */
  88.  
  89. void accoda(struct nodo **primo, struct nodo **ultimo, int x) {
  90.   struct nodo *p;
  91.  
  92.   p = malloc(sizeof(struct nodo));
  93.   p->info = x;
  94.   p->next = NULL;
  95.   if (*primo == NULL)
  96.     *primo = p;
  97.   if (*ultimo != NULL)
  98.     (*ultimo)->next = p;
  99.   *ultimo = p;
  100.   return;
  101. }
  102.  
  103.  
  104. /*
  105.  *  estrai
  106.  *
  107.  *  restituisce il primo elemento della coda e lo elimina dalla coda stessa.
  108.  */
  109.  
  110. int estrai(struct nodo **primo, struct nodo **ultimo) {
  111.   int r;
  112.  
  113.   if (*primo == NULL) {
  114.     r = -1;
  115.   } else {
  116.     r = (*primo)->info;
  117.     *primo = (*primo)->next;
  118.   }
  119.   return(r);
  120. }
  121.  
  122.  
  123. /*
  124.  *  bfs
  125.  *
  126.  *  visita in ampiezza del grafo rappresentato tramite le liste di
  127.  *  adiacenza l[0], ..., l[n-1]; la visita parte dal vertice s.
  128.  */
  129.  
  130. void bfs(struct nodo *l[], int n, int d[], int pi[], int s) {
  131.   struct nodo *primo, *ultimo, *v;
  132.   int colore[MAX], i, u;
  133.  
  134.   primo = NULL;
  135.   ultimo = NULL;
  136.   for (i=0; i<n; i++) {
  137.     colore[i] = 0;
  138.     d[i] = -1;
  139.     pi[i] = -1;
  140.   }
  141.   colore[s] = 1;
  142.   d[s] = 0;
  143.   accoda(&primo, &ultimo, s);
  144.   while (primo != NULL) {
  145.     u = estrai(&primo, &ultimo);
  146.     v = l[u];
  147.     while (v != NULL) {
  148.       if (colore[v->info] == 0) {
  149.         colore[v->info] = 1;
  150.         d[v->info] = d[u] + 1;
  151.         pi[v->info] = u;
  152.         accoda(&primo, &ultimo, v->info);
  153.       }
  154.       v = v->next;
  155.     }
  156.     colore[u] = 2;
  157.   }
  158.   return;
  159. }
  160.  
  161.  
  162. /*
  163.  *  Funzione principale.
  164.  */
  165.  
  166. int main(void){
  167.   int i, n, d[MAX], pi[MAX], sorgente;
  168.   int centrali;
  169.   FILE *file_centrali;
  170.   file_centrali = fopen("centrali.txt",
  171.                          "r");
  172.   fscanf(file_centrali,
  173.          "%d",
  174.          &centrali);
  175.   struct nodo *lista[MAX];
  176.  
  177.   n = leggi_grafo(lista);
  178.   printf("Sorgente della visita: ");
  179.   scanf("%d", &sorgente);
  180.   bfs(lista, n, d, pi, sorgente);
  181.   for (i=0; i<n; i++) {
  182.     printf("Vertice %d: padre=%d, distanza=%d\n", i, pi[i], d[i]);
  183.   fclose(file_centrali);
  184.   }
  185.   return(0);
  186. }


PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 17:08
Sabato, 25/05/2013
Sembra che hai gia' ricevuto una risposta. http://forum.ubuntu-it.org/viewtopic.php?f=33&p=4394281


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM