PDA

Visualizza la versione completa : [C] Ordinamento stringa con doppi puntatori


volley.sil
30-09-2011, 12:41
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?



/*
* 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*/
}
}
}

Loading