Sto sviluppando un progetto che deve leggere un testo e scrivere per ogni parola quante volte è presente nel testo e in quali righe.
Non riesco a ordinare le parole da visualizzare.
Prendendo come testo:

Che fai tu, luna,in ciel? Dimmi, che fai,
silenziosa luna

dovrebbe visualizzare


invece testando l'output non le riordina. Ho fatto un tentativo con la funziona ordina ma è come se non esistesse.
Come posso ordinare le parole e tenere in corrispondenza i numeri di riga?

Questo è il codice che ho scritto:
codice:
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <ctype.h>

# define DIM 200
# define MAX_CODE 100

#define IS_FULL(ptr) (!(ptr))
#define IS_EMPY(ptr) (!(ptr))

typedef struct // struttura per memorizzare le parole e il numero di occorrenze
					{
					char t [20];
					int occ;
					} parola ;

typedef struct ele {
						  int key;
                    struct ele*link;
						 }Ele;
Ele *davanti[MAX_CODE];

Ele *crea_coda( Ele *davanti, int riga );
//void crea_coda ( Ele *davanti, int riga );
void stampa_lista( Ele *inizio);


//coda_pointer davanti[MAX_CODE],dietro[MAX_CODE];

void inserimento( char s[], parola A[], int *n, int righe);


void ordina ( parola A[], int n )
{
int i,j,pos,min;
char parola;

int occorrenze;
char buffer[30];

for (i = 0 ; i < n - 1 ; i++)
{
	for (j = i + 1 ; j < n ; j++)
   {
   	if (A[i].t > A[j].t)
      {
	      strcpy(buffer,A[j].t);
			strcpy(A[j].t,A[i].t);
         strcpy(A[i].t,buffer);
         occorrenze = A[j].occ;
         A[j].occ = A[i].occ;
         A[i].occ = occorrenze;
       }
	}
}

}


void stampa ( parola A[], int n )
{
	int i;
  	for (i=0;i<n;i++)
   	{
   	printf ("parola : %s occorrenze: %d ",A[i].t,A[i].occ);
      stampa_lista(davanti[i+1]); // i+1 perchè mettendo solo 1 sbagliava!
//      printf("\n\n");
      }
}

void stampa_lista( Ele *inizio)
{
	while(inizio)
	{
   	printf(" riga:  ");
		printf("%d",inizio->key);
	   inizio = inizio->link;
 	}
   printf("\n\n");
/*
	for (;inizio;inizio = inizio->link)
	{
		printf("riga:  ");
		printf("%d",inizio->key);
   }
   printf("\n\n");
*/
}

int ricerca( char s[], parola A[], int n)
{
	int i,pos= -1;

   int dim=strlen(s);
   for(i=0;i<dim; i++)
    	s[i]=tolower(s[i]); // converte in minuscolo ogni lettera

  if( (s[dim-1]=='!') || (s[dim-1]=='?') || (s[dim-1]=='.') || (s[dim-1]==':')
  || ( s[dim-1]==',') || (s[dim-1]==';'))   //l'ultimo carattere è punteggiatura
   {
      s[dim-1]='\0';
   }

	for (i=0;(i<n) && (pos <0);i++)
	{
		if ( strcmp (s,A[i].t )==0)
			pos = i;
	}
	return pos;
}

Ele *crea_coda( Ele *davanti, int riga )
//void crea_coda ( Ele *davanti, int riga )
{
Ele *p;
Ele *aux = NULL;
p = (Ele*) malloc (sizeof(Ele) );
p->key = riga;
p->link = NULL;

//if (!davanti)
  //	return(p);
//else
	{
   aux = davanti;
   while ( aux->link && aux->link->key != riga) // per vedere se ho già inserito quel numero di riga aggiungere && aux->key != riga
   	aux = aux->link;
   aux->link = p;
//   printf("  ------- riga crea_coda  P:  %d  AUX: %d  riga: %d\n",p->key,aux->link->key,riga);
   return (davanti);
   }
}


void inserimento( char s[], parola A[], int *n, int righe)
{
	int pos;

	pos = ricerca(s,A ,*n);

	if (pos <0) // la parola non esiste ancora perciò la creo
	{
		A[*n]. occ =1;
      strcpy (A[*n].t,s);
	pos=(*n);  // da togliere serve alla printf
		(*n)++;
	}
	else     // aggiorno il contatore esistente
		A[pos].occ++;

//   printf("--- ho messo [  %s  ]  in A[  %d  ]  ho passato la riga [  %d  ]\n", s,pos,righe);

// creo la coda con i numeri di riga
  crea_coda(&davanti[pos],righe);
	//davanti[pos] = crea_coda( &davanti[pos], righe );  da cancellare
//
}

int main()
{
	parola A[DIM];
	FILE *fp;
	char s [20];
	int n =0; // posizione nel vettore dell'ultima parola inserita
   char c;
   int righe = 1;

int i;

for ( i = 0 ; i < 10 ; i++ )
	davanti[i] = NULL;

 	fp= fopen("testo.txt","rt");

	if (fp== NULL)
	{
		printf (" file non trovato\n");
		exit ( -1);
	}
	while (! feof(fp ))
	{

//		fscanf (fp ,"%s[^ \f\n\r\t\v]%c",s,&c);     // con s al posto di 255 non riesce a contare le righe!
		fscanf (fp ,"%255[^ \f\n\r\t\v]%c",s,&c);
//
//	printf("riga: %d parola:%s  carattere: %c \n",righe,s,c);
   inserimento(s, A, &n, righe); // passa la parola,l'array e 0 (la prima volta)

	if (c == '\n')
		righe++;
	}
	fclose (fp);
   printf("\n\n\n");
//ordinamento della lista
ordina(A,n);
	stampa (A,n);
	printf ("\n\nfine premi invio per uscire");
	fflush(stdin);
	getchar();
}