Originariamente inviato da dexter86
Un pochino più lungo dici VVoVe: ??? A parte gli scherzi ti ringrazio moltissimo per lo sforzo. Ora vedrò di studiarmelo.
Si, leggermente

questo è il codice modificato per il tuo problema:

codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#include <ctype.h>

typedef enum tagStati
{
	S_ERROR_OPEN_FILE = -2,
	S_ERROR = -1,
	S0 = 0,
	S1
} Stati;

Stati DFA(char *szFileName, const char *parola, int *occorrenze)
{
	Stati stato = S0;
	FILE *fp;
	char *buffer;
	char szTemp[256];
	char c;
	int numread = 0;
	int k = 0;
	int x = 0;
	int dimFile = 0;
	fpos_t pos;

	*occorrenze = 0;

	fp = fopen(szFileName, "rb");
	if ( fp == NULL )
		return S_ERROR_OPEN_FILE;

	if ( fseek(fp, 0, SEEK_END) )
		return -1;

	if( fgetpos(fp, &pos) != 0 )
		return -1;

	dimFile = (int)pos;

	if ( fseek(fp, 0, SEEK_SET) )
		return -1;

	buffer = (char*)malloc(sizeof(char)*dimFile + 1);
	if ( !buffer )
	{
		printf("Errore nell'allocazione della memoria.");
		fclose(fp);
		return -1;
	}

	numread = fread(buffer,
					sizeof(char),
					dimFile,
					fp);
	if ( numread != dimFile )
	{
		fclose(fp);
		return -1;
	}
	*(buffer + numread + 1) = '\0';

	while ( k < dimFile )
	{
		c = *(buffer + k++);

		switch (stato)
		{
		case S0:
			if ( isalnum(c) || c == 'è' || c == 'é' || c == 'ì' || c == 'à' || c == 'ù' || c == 'ò' )
			{
				*(szTemp + x++) = c;
				stato = S1;
			}
			else
			{
				stato = S0;
			}
			break;

		case S1:
			if ( isalnum(c) || c == 'è' || c == 'é' || c == 'ì' || c == 'à' || c == 'ù' || c == 'ò' )
			{
				*(szTemp + x++) = c;
				stato = S1;
			}
			else
			{
				*(szTemp + x) = '\0';
				x = 0;

				if ( strcmp(szTemp, parola) == 0 )
					(*occorrenze)++;

				stato = S0;
			}
			break;
		}
	}

	free(buffer);

	if ( fp )
		fclose(fp);

	return stato;
}

int main()
{
	Stati stato;

	clock_t c_start, c_end;

	//char *parola = "principessa";
	//char *parola = "primogenito";
	char *parola = "rivoluzione";
	int occorrenze;

	char *szNomeFile = "romanzo.txt";

	c_start = clock();

	stato = DFA(szNomeFile, parola, &occorrenze);

	if ( stato == S0 || stato == S1 )
	{
		if ( occorrenze > 0 )
			printf("\n\nSono state trovate %d occorrenze della parola %s\n\n", occorrenze, parola);
		else
			printf("\n\nNessuna occorrenza della parola %s\n\n", parola);
	}
	else
	{
		printf("\nL'automa ha restituito un errore.\n");
	}

	c_end = clock();

	printf("\n\nTempo impiegato -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);

	return 0;
}
È un pochino più corto rispetto al precedente in quanto non c'è bisogno di usare l'albero binario e le relative funzioni.
Sulla mia macchina(provando sempre sul file indicato nel post precedente) vola: 0,00000 secondi