Ciao a tutti,
ho un piccolo problema con questo programma.
Dovrei ordinare le 100 parole più frequenti prese in ingresso da un file.
ho pensato di utilizzare una lista a doppi puntatori
e ogni volta che scorro la lista cancellare l'elemento che ha il max numero di occorrenze.
Ma così come l'ho impostato mi stampo sola la parola con il max numero di occorrenze e le altre no.
come posso fare per stamparle tutte?
codice:
/*
* Nome funzione : ordina_stringa
* Tipi di dati in Input : FILE *file_orndina : puntatore al file contenente le parole più frequenti
*Tipo di dato ritornato : void
* Breve descrizione : Scorre la lista alla ricerca della parola con ripetizione massima, una volta individuata la stampa su file e cancella l'elemento dalla lista a doppi puntatori in modo da evitare
* di prenderlo in considerazione nella successiva iterazione. Questo procedimento termina al raggiungimento delle 100 parole più frequenti o alla terminazione degli elementi in lista
* (se la lista contiene meno di 100 elementi). Nel caso in cui esistano parole in lista aventi ripetizioni pari alla centesima parola anch'esse verranno stampate su file.
*/
void ordina_stringa( FILE *file_ordina )
{
/*Dichiarazione variabili locali*/
struct cella *appoggio; /*Puntatore d'appoggio per scorrere la lista*/
struct cella *parolamax; /*Puntatore che mantiene in memoria l'indice della posizione che contiene l'elemento massimo*/
struct cella *elimina=NULL; //
int max; /*Variabile contenente il massimo*/
int numoccorrenze = 0; /*Contatore delle parole stampate su file*/
printf("LA TESTA E': %s", testa->stringa);
printf("LA TESTA->NEXT E': %s", testa->next->stringa);
while( 1 ) /*Ciclo continuo*/
{
appoggio = testa; /*Setto il puntatore alla testa della lista*/
max = 0; /*Setto il massimo al valore zero*/
while(appoggio != NULL ) /*Finchè esistono elementi in lista*/
{
//max=0;
/*Ricerco il massimo, salvo il numero di ripetizioni e il puntatore all'elemento*/
if( appoggio->occorrenze > max )
{
max = appoggio->occorrenze;
parolamax = appoggio;
}
appoggio = appoggio -> next; /*Passo al prossimo elemento*/
}
if( max!=0) /*Se un massimo è stato trovato*/
{
fprintf( file_ordina, "%d %s\n",parolamax->occorrenze, parolamax->stringa); /*Stampo su file la parola e la sua ripetizione*/
/*cancello dalla lista l'elemento con il max numero di occorrenze trovate di volta in volta*/
appoggio = parolamax;
if(appoggio->prec==NULL) /*se l'elemento è in testa alla lista*/
testa= testa->next;
else
appoggio->prec->next=appoggio->next;
if(appoggio->next!=NULL)
appoggio->next->prec=appoggio->prec;
elimina=appoggio;
appoggio=appoggio->next;
free(elimina);
numoccorrenze++; /*Incremento il contatore delle parole stampate*/
break;
appoggio=appoggio->next;
}
else /*Se la lista è terminata*/
break; /*Esco dal ciclo*/
if( numoccorrenze == 100 ) /*Se ho raggiunto le 100 stampe*/
break; /*Esco dal ciclo*/
}
if( max != 0 ) /*Se il ciclo while è terminato a seguito delle 100 stampe provvedo a stampare tutti gli elementi che hanno ripetizione pari a quella della centesima parola*/
{
appoggio = testa; /*Scorro tutta la lista partendo dalla testa*/
while( appoggio != NULL )
{
if( appoggio -> occorrenze == max) /*Se la ripetizione dell'elemento soddisfa la condizione*/
fprintf( file_ordina, "%d %s\n", appoggio -> occorrenze, appoggio -> stringa ); /*Stampo la parola sul file*/
appoggio = appoggio -> next; /*Passo all'elemento successivo*/
}
}
}