PDA

Visualizza la versione completa : [C] Problema su liste e grafi


Omegaboost
12-01-2018, 23:08
Buonasera mi sono bloccato con un esercizio sui grafi. Mi viene dato un file da leggere del tipo

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


#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;


}

Scara95
13-01-2018, 04:34
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.

Loading