Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [C++] Problema assurdo ricerca in una lista

    Ciao a tutti. Sto svolgendo un esercizio del libro di Lippman Terza edizione ( pagina 241, esercizio 5.19 ) dove e' stata implementata una classe lista e bisogna creare una funzione che ricerchi il numero di elementi in essa. Bisogna sfruttare una funzione find() che prende due parametri, l'elemento da cercare ed un puntatore che dice da dove far partire la ricerca, ecco l'implementazione:
    codice:
    ilist_item* ilist::find( int value, ilist_item *start_at )
    {
        ilist_item *ptr = _at_front;
        if( start_at ) ptr = start_at;
           
        while( ptr )
        {
            if( ptr->value() == value)
            break;
            ptr = ptr->next();
        }
    
        return ptr;
    }
    Se l'elemento non viene trovato ritorna 0 ( puntatore nullo )

    Io ho implementato la funzione count di conseguenza:

    codice:
    int ilist::count(int value)
    {
        ilist_item *ptr = _at_front;
        int cnt = 0;
        while( ptr )
        {
            if( find( value, ptr ) ) ++cnt;
            ptr = find( value, ptr );
        }
        
        return cnt;
    }
    E non capisco come mai si blocchi, come se il ciclo while andasse all'infinito. Sicuramente c'e' un errore che non riesco a trovare, ma come mai se al posto ci cnt io sistituisco value funziona?( togliendo int cnt = 0 )
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Il problema sta nel fatto che quando hai trovato per la prima volta un elemento, ottenendo il relativo valore di ptr, te continui a chiamare sempre

    find( value, ptr);


    ma ptr già punta al primo elemento trovato, quindi la funzione find trova sempre quell'elemento, e te lo ritonra nuovamente senza avanzare.

    Quindi te devi modificare la tua funzione cosi:

    codice:
        while( ptr )
        {
            if( find( value, ptr ) ) ++cnt;
            ptr = find( value, ptr );
            ptr = ptr->next();
        }
    poi per evitare di chiamare due volte la funzione fined puoi fare cosi:

    codice:
        while( ptr )
        {
            ptr = find( value, ptr );
            //Se un elemento è stato trovato ptr non è nullo
            if(ptr) ++cnt;
            ptr = ptr->next();
        }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    mmmmm giusto

    Il non programmare da 1 anno si fa sentire
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

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.