Ricerca all'interno di liste

di il
11 risposte

Ricerca all'interno di liste

Ciao a tutti!
Ho scritto questa funzione per verificare la presenza o meno di un elemento all'interno di una lista
int Ricerca(PNodo l, int el){
    int r=1;
    while(l->info!=el && l!=NULL){
    l=l->next;
    r++;}
    if(l->info==el)
    return r;
    else return -1;
}
Quando l'elemento è presente il codice funziona e ritorna la posizione dell'elemento, se invece è assente non ritorna -1 come dovrebbe ma da errore di segmentazione.
Potreste aiutarmi?

La lista è stata così definita
struct nodo{
    int info;
    struct nodo *next;
};

typedef struct nodo Nodo;
typedef Nodo * PNodo;
Grazie!

11 Risposte

  • Re: Ricerca all'interno di liste

    Inverti tra di loro le condizioni nello and

    Non puoi testare un valore puntato senza 'prima' verificare la validità del puntatore
  • Re: Ricerca all'interno di liste

    No ancora lo stesso problema
  • Re: Ricerca all'interno di liste

    Metti l'if dentro il while. Che senso ha metterlo dopo, quando l punta a NULL?
  • Re: Ricerca all'interno di liste

    L'idea era scorrere la lista fino ad arrivare alla fine o fino a trovare l'elemento, e poi valutare il motivo per cui si è usciti dal while. Dà problemi solo quando dovrebbe ritornare -1. Con l'if dentro il while questo schema si perde, cosa intendi?
  • Re: Ricerca all'interno di liste

    Non avrebbe più senso implementare una funzione tipo
    PNodo Ricerca(PNodo l, int el)
    che ritorna il puntatore al primo nodo contenente el oppure NULL se l'elemento non viene trovato?
    In questo modo, una volta implementata anche una funzione finalizzata all'eliminazione di un generico nodo, la funzione Cancella() dell'altro topic (quella finalizzata a "cancellare dalla lista tutte le occorrenze di un certo dato") sarebbe pressoché fatta.
  • Re: Ricerca all'interno di liste

    Si anche. Volevo riuscire a capire dove fosse l'errore in quel codice.
  • Re: Ricerca all'interno di liste

    Gallhager ha scritto:


    L'idea era scorrere la lista fino ad arrivare alla fine o fino a trovare l'elemento, e poi valutare il motivo per cui si è usciti dal while. Dà problemi solo quando dovrebbe ritornare -1. Con l'if dentro il while questo schema si perde, cosa intendi?
    Ah, ho capito. Però devi comunque controllare che non sia NULL anche nell'if, così:
    
    int Ricerca(PNodo l, int el){
        while(l != NULL && l->info != el){
        l=l->next;
        }
        if(l != NULL) // se l non è NULL, vuol dire che ha trovato l'elemento
        return 1;
        else return -1;
    }
    
    Io, invece, intendevo una cosa di questo genere
    
    int Ricerca(PNodo l, int el){
        int r=1;
        while(l !=NULL ){
        if (l->info == el) return 1;
        l=l->next;
        }
        return -1;
    }
    
  • Re: Ricerca all'interno di liste

    L'errore nel tuo codice sta nel fatto che se esce dal while con l=NULL, non può controllare l->info nel successivo if.
  • Re: Ricerca all'interno di liste

    In realtà una volta usciti dal while basta controllare se l è uguale a NULL per trarre le dovute conclusioni...

    Gallhager ha scritto:


    Si anche.
    Forse non ti rendi conto delle potenzialità di un approccio più generico come quello che ti ho suggerito!

    EDIT:
    @Alexv vedo che hai modificato il post precedente, cmq è proprio quello che intendevo.
  • Re: Ricerca all'interno di liste

    Nippolo ha scritto:



    @Alexv vedo che hai modificato il post precedente, cmq è proprio quello che intendevo.
    Sì, me ne sono accorto dopo.
    Giusto per completezza, la versione "ridondante" era questa:
    
    if(l != NULL && l->info == el)
        return 1;
        else return -1;
    
  • Re: Ricerca all'interno di liste

    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
11 risposte