Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [C] Liste - Ricerca punteggio più alto

    Salve a tutti, nuovo problema con le liste. Stavo cercando di implementare una funziona che scorresse tutta la mia lista alla ricerca del punteggio più alto. Ho una struttura dove inserisco semplicemente Nome, Cognome e Punteggio.
    Ho realizzato così la funzione:

    codice:
    TNode* Punteggio(TList lista){
        TNode* punt;
        TNode* score;
        int punteggio=0;
        punt=lista;
        score->info.punteggio=punteggio;
        while(punt!=NULL){
            punt=punt->next;
            if(punt->info.punteggio > punteggio){
                score->info.punteggio=punt->info.punteggio;
                score=punt;
            }
        }
        return score;
    }
    In teoria la funzione scorre tutta la lista. Inizialmente assegno al TNode score il punteggio. Poi inizio a scorrere la lista e se trovo un punteggio più alto, lo riassegno al TNode score. Alla fine mi restituisce il nodo.

    Nel main l'ho richiamata così:

    codice:
    case 5:
                    score=Punteggio(lista);
                    printf("Il punteggio piu' alto e' %d\n\n", score->info.punteggio);
    dichiarando score come

    codice:
    TNode* score;
    Non mi da errori, ma quando avvio il programma e premo 5 (funzione di ricerca del punteggio) mi crasha tutto

    Qualcuno sa aiutarmi?

  2. #2
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Ok no credo di aver scritto una boiata. In realtà dovrei confrontare i nodi, il primo con il secondo, e il più alto tra i due, con il terzo, e così via? Invece io ho scritto una funziona senza senso, mi sà..

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Ho riscritto velocemente la funzione, cercando di confrontare tutti i nodi della lista uno con l'altro e , quello con il punteggio maggiore, assegnandolo al nodo score che sarà il nodo restituito dalla funzione. Anche qui niente errori, però crasha.

    La funzione è questa:

    codice:
    TNode* Punteggio(TList lista){
        TNode *prec=NULL, *curr=lista, *score=NULL;
    	while(curr!=NULL){
    	    if(curr->info.punteggio > prec->info.punteggio){
                     score->info.punteggio=curr->info.punteggio;
    	    }
                curr=curr->next;
        }
    	return score;
    }

  4. #4
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    mmm.....dando uno sguardo veloce al codice senza provare nulla....direi che dovrebbe crashare per il puntatore:
    codice:
    *prec=NULL;
    tu prima lo dichiari a NULL con questa istruzione e subito dopo nell'if fai:
    codice:
    prec->info.punteggio
    ovviamente prec è NULL e non punta a nulla quindi va in crash....
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  5. #5
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Quindi come dovrei risolvere?

    Nel frattempo ho modificato la funzione aggiungendo:

    codice:
    TNode* Punteggio(TList lista){
        TNode *prec=NULL, *curr=lista, *score=NULL;
    	while(curr!=NULL){
    	    if(curr->info.punteggio > prec->info.punteggio){
                score->info.punteggio=curr->info.punteggio;
    	    }
    	    prec=curr;
    	    curr=curr->next;
        }
    	return score;
    }

  6. #6
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    a quanto ho capito devi fare una funzione che ricerca il massimo (punteggio nel tuo caso) in una lista...giusto??
    bhè inizia scorrendo la lista, e poi non serve utilizzare tutti quei puntatori!
    prova a vedere questo pezzo di codice:
    codice:
    TNode* Punteggio(TList lista){
    
        TNode *ptr_max_score=NULL; // puntatore dove salvo il nodo della lista contenente il massimo
        TNode *curr=lista; //puntatore usato per scorrere la lista
        int max= -1; //supponendo solo punteggi positivi all'interno della lista
    
    	while(curr!=NULL){
    	    if (curr->info.punteggio > max){
                  ptr_max_score = curr;
                  max = curr->info.punteggio;
    	    }
    	    curr=curr->next;
        }
        return ptr_max_score;
    }
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  7. #7
    I tuoi programmi vanno in crash perché continui a deferenziare puntatori inizializzati a null.
    Se non vuoi che questo si verifichi inizializza i puntatori in modo opportuno.

    codice:
    TNode* Punteggio(TList lista){
    
        /* inizializzo il punteggio con il primo della lista */
        TNode* score = lista;
    
        /* avanzo di un nodo per fare il primo confronto con il nodo successivo */
        lista = lista->next;
    
        /*posso usare direttamente lista, all'uscita della funzione lista tornerà a puntare al primo elemento */
        while(lista!=NULL){
            if(lista->info.punteggio > score->info.punteggio){
                score=lista;
            }
            
            /* l'avanzamento va fatto alla fine, altrimenti all'ultimo confronto lista varrà null */
            lista=lista->next;
        }
        return score;
    }
    ...

  8. #8
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Grazie a tutti per le risposte. Ora mi è tutto più chiaro!
    Chissà perchè vado sempre ad ingarbugliarmi con soluzioni improponibili

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 © 2024 vBulletin Solutions, Inc. All rights reserved.