Ricerca all'interno di liste

di Gallhager il
11 risposte
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

  • Inverti tra di loro le condizioni nello and

    Non puoi testare un valore puntato senza 'prima' verificare la validità del puntatore
  • No ancora lo stesso problema
  • Metti l'if dentro il while. Che senso ha metterlo dopo, quando l punta a NULL?
  • 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?
  • 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.
  • Si anche. Volevo riuscire a capire dove fosse l'errore in quel codice.
  • 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;
    }
    
  • L'errore nel tuo codice sta nel fatto che se esce dal while con l=NULL, non può controllare l->info nel successivo if.
  • 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.
  • 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;
    
  • Grazie mille!
Devi accedere o registrarti per scrivere nel forum
11 risposte