Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C] ordinamento e stampa di una lista

    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 lista è già creata e riempita;il problema sorge nella stampa delle 100 parole più frequenti.
    Non riesco a capire come mai mi stampi solo la prima parola più frequente e nessun'altra!
    Questo è il codice:

    codice:
    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++;
    
    						if(temp == testa)
    						{
    							if(temp->next != NULL)		
    							{
    								testa = testa->next;										
    							}								
    							else
    							{	//lista finita
    								break;								
    							}
    						}		
    						canc=temp;
    						temp=temp->next;
    						prev->next=temp;
    						free(canc);					
    						
    					
    												
    					}
    					else
    						{
    							prev=temp;
    							temp=temp->next;
    						}
    						
    
    				}
    
    			}
    		}
    Spero che ci sia qualche buon anima che mi possa rispondere e aiutare!
    Grazie in anticipo..

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Ma il si blocca o altro?

  3. #3
    Non capisco una cosa: "prev" a cosa ti serve?
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  4. #4
    per jobv: non si blocca.. stampa solo la parola più frequente, mentre dovrei stampare tutte le 100 parole più frequenti, stampando anche la relativa frequenza..

    per Laikius91: prev mi serve per non perdere il riferimento alla cella precedente a quella contenente la parola da stampare, per poterla poi eliminare e permettere di collegare tra loro la cella precedente e successiva a quella visitata..

    spero di essere stato chiaro..

  5. #5
    Ok ok ho capito... Dunque dunque, numero_parole è inizializzato a 0 vero?
    Non riesci magari con qualche printf a capire se e quante volte fa il ciclo?
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  6. #6
    numero_parole è inizializzato a zero..

    il primo ciclo
    codice:
    while(temp != NULL && numero_parole <= 100 )
    lo fa una sola volta ( e non capisco il motivo)

    e il secondo ciclo

    codice:
    while(temp != NULL)
    {
           if(temp->frequenza == massimo){
           ...
           }
    ..
    }
    dovrebbe farlo in modo esatto!

  7. #7
    Originariamente inviato da giova87
    numero_parole è inizializzato a zero..

    il primo ciclo
    codice:
    while(temp != NULL && numero_parole <= 100 )
    lo fa una sola volta ( e non capisco il motivo)
    Bè ma quindi non deve essere rispettata una delle due condizioni... Che numero_parole sia <= 100 è evidente, quindi non resta che controllare che temp sia diverso da NULL...
    Quando fai:

    codice:
    while(temp != NULL)
    				{						
    					if(temp->frequenza == massimo)
    					{				
    										
    						fprintf(fpw,"%d %s \r\n",temp->frequenza,temp->parola);	
    						numero_parole++;
    
    						if(temp == testa)
    						{
    							if(temp->next != NULL)		
    							{
    								testa = testa->next;										
    							}								
    							else
    							{	//lista finita
    								break;								
    							}
    						}		
    						canc=temp;
    						temp=temp->next;
    						prev->next=temp;
    						free(canc);					
    						
    					
    												
    					}
    					else
    						{
    							prev=temp;
    							temp=temp->next;
    						}
    						
    
    				}
    spulci tutto "temp" fino alla fine giusto?
    Quindi prima di uscire dal ciclo, come ultima cosa, non dovresti fare di nuovo:

    codice:
    temp = testa;
    ??
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  8. #8
    no, in questo modo entra in un loop infinito..

  9. #9
    Originariamente inviato da giova87
    no, in questo modo entra in un loop infinito..
    Sisi scusami errore di distrazione...
    Quello che intendevo dire era di salvarti ciò a cui puntava temp prima del sottociclo in modo da riportare temp a quell'elemento dopo questo sottociclo, per far continuare il ciclo esterno! Capisci?
    Facendo tipo:

    codice:
    temp2 = temp;
    
    /* istruzioni e sottociclo */
    
    temp = temp2; /* prima di terminare il ciclo, in modo che poi questo prosegua! */
    Potrebbe essere?
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  10. #10
    non funziona neanche così.. non so proprio cosa potrebbe essere..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.