grafi in c

Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Nuovo Utente
125
1
Buongiorno devo realizzare un progetto che gestisce le prenotazioni dei voli..ho problemi con il popolare il grafo in realtà volevo creare un file e tramite questo popolare il grafo ho iniziato a fare cosi ma non mi funziona potete aiutarmi posto il codice
C:
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <string.h>

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

typedef struct TList* List;
struct TGraph {
    List *adj;
    int nodes_count;
    char** cityNames;
};

typedef struct TGraph* Graph;

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

void freeGraph(Graph G) {
    if (G != NULL) {
        if (G->nodes_count > 0) {
            int i = 0;
            for (i = 0; i < G->nodes_count; i++) {
                freeList(G->adj[i]);
            }
        }
        free(G);
    }
}

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

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

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


List removeEdge(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] = removeNodeList(G->adj[source], target);
    }
    return G->adj[source];
}


void addNode(Graph G, char* newCity) {
    if (G != NULL) {
        List * old=G->adj;
        char** old_matrix = G->cityNames;
        int i=0;
        G->adj = (List *)calloc(G->nodes_count+1, sizeof(List));
        assert(G->adj != NULL);
        G->cityNames = (char**)calloc(G->nodes_count+1, sizeof(char*));
        assert(G->cityNames != NULL);
        for(i=0;i<G->nodes_count;i++){
            G->adj[i]=old[i];
            G->cityNames[i] = old_matrix[i];
        }
        G->nodes_count += 1;
        G->adj[G->nodes_count-1] = NULL;
        G->cityNames[G->nodes_count-1] = (char*) calloc(strlen(newCity)+1, sizeof(char));
        assert(G->cityNames[G->nodes_count-1] != NULL);
        strcpy(G->cityNames[G->nodes_count-1], newCity);
    }
}


void removeNode(Graph G, int node_to_remove) {
    if (G != NULL) {
        int i = 0;
        int x = 0;
        List *tmp = G->adj;
        char** old_matrix = G->cityNames;
        G->adj = (List *)calloc(G->nodes_count-1, sizeof(List));
        assert(G->adj != NULL);
        G->cityNames = (char**)calloc(G->nodes_count-1, sizeof(char*));
        assert(G->cityNames != NULL);
        for (i = 0; i < G->nodes_count; i++) {
            if (i != node_to_remove) {
                G->adj[x] = checkListRemoval(tmp[i], node_to_remove);
                G->cityNames[x] = old_matrix[i];
                x++;
            } else {
                free(old_matrix[i]);
                freeList(tmp[i]);
            }
        }
        free(tmp);
        free(old_matrix);
        G->nodes_count -= 1;
    }
}


List checkListRemoval(List L, int node_to_remove) {
    if (L != NULL) {
        L->next = checkListRemoval(L->next, node_to_remove);
        if (L->target == node_to_remove) {
            List tmp = L->next;
            free(L);
            return tmp;
        } else if (L->target > node_to_remove) {
            L->target -= 1;
        }
    }
    return L;
}



int menu(void){
int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
printf("* * * * * * * * * * * * * * * * * * * * * * *  Benvenuto in gestione prenotazione voli\n* * * * * * * * * * * * * * * * * * * * * * *  \n");

    printf(" 1. Accesso amministratore\n");
   printf(" 2. Accesso utente\n");
    printf(" 3. Uscire\n");
    printf("Inserisci scelta:");
    scanf("%d",&scelta); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
   while(scelta<0 || scelta>3) {
       printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
      printf("Scelta: ");
      scanf("%d", &scelta);
   return scelta;

   }

return scelta;

}

int menuUtente(void){
int sceltaUt; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
printf("* * * * * * * * * * * * * * * * * * * * * * * *                   UTENTE\n* * * * * * * * * * * * * * * * * * * * * * * *  \n");

    printf(" 1. Effettua Iscrizione\n");
    printf(" 2. effettua accesso\n");
    printf("Inserisci scelta:");
    scanf("%d",&sceltaUt); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
   while(sceltaUt<0 || sceltaUt>2) {
       printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
      printf("Scelta: ");
      scanf("%d", &sceltaUt);
   return sceltaUt;

   }

return sceltaUt;

}

int menuAmministratore(void){
int sceltaAmministratore; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
printf("* * * * * * * * * * * * * * * * * * * * * * * *                 AMMINISTRATORE \n* * * * * * * * * * * * * * * * * * * * * * * *  \n");

    printf(" 1. Inserisci destinazione \n");
    printf(" 2. Stampa destinazioni\n");
    printf(" 3. Cancella destinazione\n");
    printf("Inserisci scelta:");
    scanf("%d",&sceltaAmministratore); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
    while(sceltaAmministratore<0 || sceltaAmministratore>3) {
       printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
      printf("Scelta: ");
      scanf("%d", &sceltaAmministratore);
   return sceltaAmministratore;

   }

return sceltaAmministratore;

}

struct TGraph* Graph_init_from_file()
{
    char* city[40];
    int n = 0;
  
    struct TGraph *temp;
    struct TGraph *Graph = NULL;
    Graph = initGraph(n,city);

    FILE *filehandler;
    filehandler = fopen("destinazioni.txt", "r");
    if(filehandler != NULL){
        while(!feof(filehandler)){
            fgets(city, 40, filehandler);
            strtok(city,"\n");
            temp = initGraph(20, city);
            addNode(Graph,temp);
          
        }

        fclose(filehandler);
    }

    return Graph;
}
int main() {
    int scelta;
    int sceltaUt;
    int sceltaAmministratore;
    char email;
    char pwd;
  //  Graph G = NULL;
    char destinazione ;
    char emailAmministratore;
    char pwdAmministratore;
    int n;
    char deleteDestinazione;


  
    while((scelta = menu())){
    switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
    {
  
    case 1:
            printf("Inserisci email: ");
            scanf("%s", &emailAmministratore);
                    
            printf("Inserisci password(max 7 caratteri): ");
            scanf("%s", &pwdAmministratore);
        
            while((sceltaAmministratore = menuAmministratore())){
                    switch (sceltaAmministratore) {
                   case 1: //stampa archivio contenente le destinazioni e le tratte
                  
                
            
                      break;
                   case 2: //inserisce voli e tratte
                
                break;
                      case 3: //elimina tratte e destinazioni
                           printf("Inserisci destinazione da eliminare: ");
                           scanf("%s", &deleteDestinazione);
                        
                          break;
                  }
              }
            return 0;
          
         break;

    case 2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/
              while((sceltaUt = menuUtente())){
                  switch (sceltaUt) {
                    case 1:
                    
                      printf("Inserisci l'email: ");
                      scanf ("%s", &email);
                    
                      printf("Inserisci password(max 7 caratteri): ");
                      scanf("%s", &pwd);
                    
                      printf("\niscrizione effettuata con successo");

                
                      break;
                   case 2:
                     printf("Inserisci l'email: ");
                     scanf ("%s", &email);
          
                     printf("Inserisci password(max 7 caratteri): ");
                     scanf("%s", &pwd);
          
                      printf("accesso effettuata con successo");
          
                break;
      
                  }
              }
           return 0;
   case 3: /*Se l'utente vuole uscire dalla biblioteca*/

      printf("Grazie per aver scelto il servizio di gestione prenotazione voli, torna a trovarci!\n");

      return 0;

       break;

    default: /*Se l'utente sbaglia ad inserire il numero*/
    printf("Questo tasto non consente di effetuare scelte! Riprova!\n");

       break;

          } /*Fine switch*/
    } /*Fine do*/
  return 0;
} /*Fine main*/
 

Mursey

Super Moderatore
Staff Forum
Utente Èlite
4,407
2,401
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando

Discussioni Simili

Hot del momento