#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 1000


void bubblesort(char *parole[],int nparole)
{
	int i,j;
	for(i=0; i < nparole-1; i++)
		for(j=i+1; j < nparole; j++)
			if(strcmp(parole[i],parole[j]) >0 )
			{  // scambio i pointer e non le stringhe!!!!
				char *dep=parole[i];
				parole[i]=parole[j];
				parole[j]=dep;
			}
}

int main() {
    char *parole[MAX];
    FILE *file_in, *file_out;
    char buffer[256];
    int n_parole = 0;
    char nome_file[64];
    int i; 
    // Apri file di input
    printf("Nome file di parole (senza spazi)->");
    scanf("%s",nome_file);
    file_in = fopen(nome_file, "r");
    if (file_in == NULL) {
        printf("Errore: impossibile aprire file [%s]\n",nome_file);
        return 1;
    }
    
    // Leggi e alloca memoria per ogni parola
    while (fgets(buffer, sizeof(buffer), file_in) != NULL && n_parole < MAX) {
      
        
        if (strlen(buffer) > 0) {
        	buffer[strlen(buffer)-1] = '\0';   // Rimuovi newline
            parole[n_parole] = malloc(strlen(buffer) + 1); // alloco spazio
            if (parole[n_parole] == NULL) { // non c'e' piu' memoria nello heap
                printf("Errore di allocazione\n");
                fclose(file_in);
                return 1;
            }
            strcpy(parole[n_parole], buffer);
            n_parole++;
        }
    }
    fclose(file_in);
    
    printf("Lette dal file %s %d parole\n", nome_file,n_parole);
    
    // Ordina alfabeticamente con bubblesort
    
    // Salva in file di output
    file_out = fopen("ordinato.txt", "w");
    if (file_out == NULL) {
        printf("Errore: impossibile creare ordinato.txt\n");
        return 1;
    }
    
    bubblesort(parole,n_parole); // ordino il vettore di pointer a parole
    
    for (i = 0; i < n_parole; i++) {
        fprintf(file_out, "%s\n", parole[i]);
        printf("%3d: %s\n", i + 1, parole[i]);
    }
    fclose(file_out);
    
    // Libera memoria
    for (i = 0; i < n_parole; i++) {
        free(parole[i]);
    }
    
    printf("\nParole ordinate salvate in 'ordinato.txt'\n");
    
    return 0;
}
