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;

}