Visualizzazione dei risultati da 1 a 2 su 2

Hybrid View

  1. #1

    [C] Problema su liste e grafi

    Buonasera mi sono bloccato con un esercizio sui grafi. Mi viene dato un file da leggere del tipo
    Codice PHP:
    ATOM 1 O WAT 1 20.807 4.147 17.051
    ATOM 2 H WAT 1 21.623 3.888 16.622
    ATOM 3 H WAT 1 20.190 4.281 16.331
    ATOM 4 O WAT 2 20.382 0.571 16.989
    ATOM 5 H WAT 2 20.902 
    -0.232 16.955
    ATOM 6 H WAT 2 20.841 1.127 17.619
    ATOM 7 O WAT 3 21.115 2.271 19.201
    ATOM 8 H WAT 3 21.528 2.692 19.955
    ATOM 9 H WAT 3 21.095 2.951 18.528
    ATOM 10 O WAT 4 24.474 22.754 20.464
    ATOM 11 H WAT 4 25.093 22.226 19.962
    ATOM 12 H WAT 4 25.024 23.296 21.030
    ATOM 13 O WAT 5 23.357 21.041 22.507
    ATOM 14 H WAT 5 22.483 21.426 22.567
    ATOM 15 H WAT 5 23.741 21.441 21.726 

    dove:
    Ogni riga `e introdotta dalla parola chiave ATOM, seguita da :
    • l’indice numerico dell’atomo nel file;
    • il suo elemento chimico ;
    • una stringa di caratteri che identifica la sostanza chimica della molecola;
    • l’indice numerico della molecola nel file; (non è detto che siano per forza sempre 3 come in questo caso)
    • le coordinate rispetto agli assi x, y e z dell’atomo, in Angstrom3.

    L'obiettivo è di costruire un grafo non orientato G(V,E) con V, i vertici, composti dalle molecole (attenzione, non i singoli atomi) e gli archi, che sono i legami (che ho omesso perchè lo farò per conto mio in seguito). Il codice che ho scritto sotto serve per creare e leggere la lista di atomi ma a me oltre a questo serve la lista delle molecole (ovvero l'insieme di atomi con lo stesso coeff. nella quinta colonna) che sarebbe la lista dei nodi del grafo, non capisco come devo fare. Grazie per l'aiuto

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define ROW_LENGTH 256
    
    typedef struct atom {
    
        int num_atom;
        char el;                    
        char sostanza[ROW_LENGTH];
        int num_mol;
        double coord_x;
        double coord_y;
        double coord_z;
        struct atom *next;
    
    } atom;
    
    typedef struct mol {                           //di questo non sono tanto sicuro                
    
    
        atom *atomo;
        int numero;
    
    
        struct mol *next;
    
    
    } mol;
    
    void InterpretaLineaComando (int argc, char *argv[], char *filedati);
    
    void leggiatomo (char *riga);
    
    int numero_totale_molecole (atom *b);
    
    void stampa_elemento (atom *a);                                    
    
    
    void attraversa_atom (atom *b, void (*op)(atom *));
    
    
    atom *trova_atomo(atom *b, char n);
    
    
    atom *atomi=NULL;
    atom *atom_end=NULL;
    
    /* Programma principale */
    
    
    int main (int argc, char *argv[])                                                                               //INIZIO PROGRAMMA
    
    {
        char filedati[ROW_LENGTH];
        char riga[ROW_LENGTH];
        FILE* fp_filedati;
        int n,m,i,j;                                                
    
        InterpretaLineaComando(argc,argv,filedati);                                
        fp_filedati = fopen(filedati,"r");
    
        while(fgets(riga,ROW_LENGTH,fp_filedati)) {                                //LETTURA FILE
            leggiatomo(riga);
        }
        
        n = numero_totale_molecole (atomi);
    free(atomi);
    free(atom_end);
    return 0;
    }
         
    /* Definizione delle procedure secondarie */
    
    void InterpretaLineaComando (int argc, char *argv[], char *filedati)
    {
    
      if (argc != 2)
    
      {
    
        fprintf(stderr,"Errore nella linea di comando!\n");
        exit(EXIT_FAILURE);
      }
    
      strcpy(filedati,argv[1]);
    
    }
    
    
    int numero_totale_molecole (atom *b) {
        atom *a;
        int n;
        for(a = b; a; a = a->next) {                                    
            n=a->num_mol;    
            }
        return n;
    }
    void leggiatomo (char *riga)
    {
        atom *a = malloc(sizeof(atom));
        char pc[ROW_LENGTH];
        int na;
        char e;                    
        char sost[ROW_LENGTH];
        int nm;
        double cx;
        double cy;
        double cz;
        int n;
        if(!a) {
    
           fprintf(stderr,"Errore nell’allocazione del nuovo elemento\n");
            exit(-1);
    
        }
        n = sscanf(riga,"%s %d %c %s %d %f %f %f",pc,&na,&e,sost,&nm,&cx,&cy,&cz);
        if ( strcmp(pc,"ATOM") != 0 )
             {
    
               fprintf(stderr,"Errore nella parola chiave!\n");
               exit(-1);
    
             }
    
        if (n != 8)
    
             {
    
               fprintf(stderr,"Errore nei dati!\n");
               exit(-1);
    
             }
    
        a->num_atom = na;
        a->el = e;
        strcpy(a->sostanza,sost);
        a->num_mol = nm;
        a->coord_x = cx;
        a->coord_y = cy;
        a->coord_z = cz;
        if (!atomi) {
    
                   atomi = a;
    
                   atom_end = a;
    
            } else {
    
                atom_end->next = a;
    
                  atom_end = a;
    
           }
    } 
    
    void stampa_elemento(atom *a) {
    
    
        printf("elemento:%c\n",a->el);
    
    
    }
    
    
    void attraversa_atom(atom *b, void (*op)(atom *)) {
    
    
        atom *a;
    
    
        for(a = b; a; a = a->next)
    
    
            (*op)(a);
    
    
    }
    
    
    atom *trova_atomo(atom *b, char n) {
    
    
        atom *a;
    
    
        for(a=b; a; a=a->next) 
    
    
            if(a->num_mol == n)
    
    
                return a;
    
    
        }
    
    
        return NULL;
    
    
    }
    Ultima modifica di Omegaboost; 13-01-2018 a 00:11

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Un vettore di liste che indicizzi sul 5 campo.
    Reallochi il vettore se incontri un valore superiore della dimensione corrente. Supponendo che tutti gli indici < di tale indice siano utilizzati non hai neanche sprechi. Valgono le solite considerazioni di efficienza con preallocazione e crescita non lineare.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.