scusami è solo che nel frattempo che aspettavo una risposta ho cambiato il codice e poi ho fatto un casino nella copia...ecco l'ultima versione...qui non dovrebbero esserci errori di scrittura (scusami ancora!)
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> struct parola { char *word; int occorrenze; struct parola *next; }; struct parola *alloca_memoria() { printf("alloco memoria\n"); struct parola *p; p=malloc(sizeof(struct parola)); if(p==NULL) { fprintf(stderr, "Errore allocazione memoria\n"); exit(EXIT_FAILURE); } return p; } void inserisci(char *w, struct parola *punt) { printf("inserimento\n"); //devo allocare spazio per il nuovo elemento struct parola *nuova; nuova=alloca_memoria(); //alloco spazio per il campo char *word if((nuova->word=(char *)malloc((strlen(w)+1)*(sizeof(char))))==NULL) { fprintf(stderr, "Errore allocazione memoria\n"); exit(EXIT_FAILURE); } //copia della parola printf("copio\n"); nuova->word=strcpy(nuova->word,w); nuova->occorrenze=1; printf("occorrenza aggiornata\n"); //aggiorno puntatori nuova->next=NULL; punt=nuova; printf("puntatori aggiornati\n"); } void controlla(char *word, struct parola *head) { printf("controllo\n"); struct parola *p; //per appoggio int trovata=0; //flag p=head; //se la lista è vuota devo per forza inserirla if(p==NULL) { printf("lista vuota\n"); inserisci(word,head); } //se la lista non è vuota, la scorro e controllo se c'è la parola else { //scorri la lista for(p=head; p!=NULL || trovata==0 ;head=p->next, p=p->next) { //se trovo la parola if(strcmp(p->word,word)==0) { printf("gia in lista!!!!\n"); //aggiorno solo le occorrenze (p->occorrenze)++; trovata=1; } } //se alla fine non l'ho trovata, la inserisco IN CODA inserisci(word,p); } } void stampa(struct parola *cima) { printf("stampo\n"); struct parola *temp; if (cima==NULL) printf ("No elements to print!\n"); else { temp=cima; do { printf ("%s\n", temp->word); temp=temp->next; } while (temp!=NULL); } } void leggi_file(char *f,struct parola *head) { FILE *file; char s[10]; printf("apro file\n"); if((file=fopen(f, "r")) == NULL) { fprintf(stderr, "Errore nell'apertura del file\n"); exit(EXIT_FAILURE); } fseek(file,0,SEEK_SET); printf("leggo_file\n"); while(!feof(file)) { if(fgets(s, 10, file)) printf("ho letto:%s\n", s); controlla(s,head); } printf("fatto\n"); } int main(int argc, char *argv[]) { if(argc<2) { fprintf(stderr, "Usage: %s <file_input>", argv[0]); return EXIT_FAILURE; } struct parola *head= NULL; leggi_file(argv[1],head); stampa(head); return EXIT_SUCCESS; }

scusami è solo che nel frattempo che aspettavo una risposta ho cambiato il codice e poi ho fatto un casino nella copia...ecco l'ultima versione...qui non dovrebbero esserci errori di scrittura (scusami ancora!)
Rispondi quotando