Salve a tutti!
Ho un problema..
In questo codice io devo leggere un file contenente parole delimitate da un numero variabile di spazi e devo creare un file contenente le parole e la loro relativa frequenza, in modo decrescente. La lettura da file dovrebbe avvenire in modo corretto, il problema sorge nell'ordinamento della lista e nella conseguente stampa su file.
Spero che ci sia qualche buon anima che mi possa rispondere e aiutare!
Grazie in anticipo..


codice:
#include <stdio.h>		//Direttive al pre processore che ci permettono di includere
#include <string.h>		//gli haeder file,relativi a librerie standar.
#include <stdlib.h>
#include <limits.h>
#include <assert.h>


// definizione della funzione ASSERT()  con stampa di un messaggio di errore 
#define ASSERT( condizionedaverificare, cosafare )	{ if ( !(condizionedaverificare) ) { printf cosafare; printf("\n"); assert( condizionedaverificare ); } }

			

struct lista{							//Dichiarazione della lista usata dalla funzione aggiuntiva
	char parola[257];					//Dichiarazione di un array di lunghezza massima 1024 adibito a contenere la parola
	int frequenza;						//Dichiarazione di una varibile adibita a contenere la frequenza della parola
	struct lista *next;					//Dichiarazione di un puntatore per lo spostamento all'interno della lista 
	};


						
int main(int argc, char *argv[])
{
		char *nomeDelFile=NULL;						//puntatore al nome del file da comprimere o decomprimere
		char *centoParole=NULL;	
		
		char *pra=NULL;
		FILE *fileTesto=NULL;
		FILE *fpw=NULL ;
		int contaLettere=0;
		int numero_parole=0;
		int massimo=0;
		char bufferLettura[256];
		struct lista *nuovo=NULL;
		struct lista *testa=NULL;
		struct lista *temp=NULL;
		struct lista *prev=NULL;
		struct lista *canc=NULL;
		
		
		
		if(argc!=2)								//controllo sul numero di parametri per far partire il programma che devono essere: <nome programma> <nome file>
		{							
			printf("\nErrore!Indicare il nome del file da comprimere o da decomprimere\n");
			exit(1);
		}	
		
		nomeDelFile=argv[1];					//copio il contenuto di argv[1] che contiene il nome del file da comprimere/decomprimere
		
		
	centoParole = (char*)malloc(sizeof(char)*(strlen(nomeDelFile)+7));	
	strncpy(centoParole,nomeDelFile,strlen(nomeDelFile));										
	strncat(centoParole,".world\0",7);		
	
	

	
	fileTesto=fopen(nomeDelFile,"r");							//apertura del file di testo in modalità lettura
		
	fpw=fopen(centoParole,"w");									//apertura del file di testa in cui devo andare a scrivere
	assert(fpw != NULL);	
	

	while(!feof(fileTesto))
	{
		//trovato=0;
		contaLettere=0;								//Indicizzazione a 0 della variabile i
		
		
			pra = (char*)malloc( 256 * sizeof(char));
			memset(pra,0,256 * sizeof(char));

			fscanf(fileTesto,"%s", pra);
			strcpy(bufferLettura,pra);
			//printf("\n Parola: %s",bufferLettura);
			contaLettere=strlen(bufferLettura);
			free(pra);
			if(contaLettere<256)
			{
				bufferLettura[contaLettere]='\0';
			}
			else
			{
				bufferLettura[0]='\0';
			}
			

	
		if(bufferLettura[0]!='\0')	//guardare soluzioni alternative per  parole maggiori di 256 caratteri
		 {	//printf("\n 10 \n");
			
			prev = NULL;
			temp=testa;		
			while((temp != NULL) && (strcmp(bufferLettura,temp->parola) != 0)){
					
					prev = temp;
					temp = temp->next;									//Incremento il puntatore per avanzare nella scansione della lista						
					
			}
			
			
			if (temp == NULL)
			{
				// printf("\n 17 dentro\n");
				nuovo=(struct lista*)malloc(sizeof(struct lista));	//Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
				strncpy(nuovo->parola,bufferLettura,contaLettere);
				// printf("\n 18 dentro\n");
				nuovo->frequenza=1;									//Impostazione della frequenza della parola a 1
				nuovo->next = NULL;
				if (testa != NULL)
					prev->next = nuovo;
				else testa = nuovo;
				// printf("\n 18 dentro\n");
				// printf("\nPrima Parola in lista:%s \n",nuovo->parola);
				// printf("\n 18 dentro\n");
				// printf("\nFrequenza in lista:%d \n",nuovo->frequenza);
			}
			else temp->frequenza++;
		}
	}	

	
	temp=testa;					
	
	if(testa==NULL)
	{	
		fclose(fpw);		
		exit(0);			
	}
	else
		{
			while(temp != NULL && numero_parole <= 100 )
			{
				massimo=0;									
				while(temp != NULL)	//ciclo per trovare il massimo
				{				
					if(temp->frequenza > massimo)
					{			
						massimo=temp->frequenza;
					}			
					temp=temp->next;						
				}
				
				temp=testa;									
													
				while(temp != NULL)
				{						
					if(temp->frequenza == massimo)
					{				
						fprintf(fpw,"%d %s \r\n",temp->frequenza,temp->parola);	
						numero_parole++;
						prev->next=temp->next;
						canc=temp;
						temp=temp->next;
						free(canc);
						
					}
					else
						{
							prev=temp;
							temp=temp->next;
						}
						
						

				}

			}
		}

fclose(fileTesto);
fclose(fpw);

		return 0;
}