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