PDA

Visualizza la versione completa : [C++] Problema assurdo ricerca in una lista


Poker1
17-02-2005, 12:26
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:


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:



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 ) :dh: :dh:

anx721
17-02-2005, 14:57
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:



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:



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

Poker1
17-02-2005, 15:49
mmmmm giusto :)

Il non programmare da 1 anno si fa sentire :confused:

Loading