Liste, ricerca elemento

di il
8 risposte

Liste, ricerca elemento

Non riesco a capire perché questo codice funziona con gli interi, ma non gli array di char non vuole proprio saperne
bool inList(L&l, stringa info){
	if(l->next==0) return false;
	 if(strcmp(info,l->parola)==0) return true;
		else return inList(l->next,info);

}
sembra non entrare proprio nel secondo if, infatti se il confronto è del tipo == o != riproduce sempre lo stesso risultato

8 Risposte

  • Re: Liste, ricerca elemento

    Per scrupolo fai un cout del info e vedi cosa ti da.
    
    bool inList(L&l, stringa info){
       cout << info;
       if(l->next==0) return false;
        if(strcmp(info,l->parola)==0) return true;
          else return inList(l->next,info);
    
    }
    
  • Re: Liste, ricerca elemento

    Fatto, e funziona, il parametro è passato correttamente,
    facendo anche un
    
    cout<<info;
    cout<<l->parola;
    
    mi ha mostrato l'ultima parola che avevo inserito e che non vedevo perchè avevo fatto la stampa così:
    
    while(l->next!=0)   //<-----
    cout<<l->parola;
    l=l->next;
    
    Ho corretto con
    while (l!=0)
    ma mi da errore di segmentazione
  • Re: Liste, ricerca elemento

    Ciao ^^,

    Non sono dello staff ma vorrei aiutarti.
    Il sottoprogramma sembra fatto bene , forse ci sarà qualche problema in qualche altro sottoprogramma ( esempio nell' inserimento nella lista ec.. ) Il primo while che hai scritto:
    
    while(l->next!=0)   //<-----
    cout<<l->parola;
    l=l->next;
    
    Ci vogliono due parentesi che racchiudano le due istruzioni e comunque è più corretto con while ( l != 0 ) scrivendo così:
    
    while ( l!= 0 )
    {
        cout <<l->parola;
        l = l->next;
    }
    

    Distinti Saluti,
    ALessandro
  • Re: Liste, ricerca elemento

    Ho risolto, il problema era che nella procedura di stampa avevo passato il puntatore al nodo successivo per riferimento e dunque mi modificava la struttura della lista stessa,
    grazie
  • Re: Liste, ricerca elemento

    Ma se volessi eliminare da una lista un elemento, devo avere due puntatori ?
    uno al nodo precedente ed uno al successivo?
    o si può fare con il mo puntatore così strutturato:
    
    struct Record;
    Typedef Record *L;
    struct Record {
    int num;
    L next;
    }
    
    ??
  • Re: Liste, ricerca elemento

    Trovato da solo, se a qualcuno servisse posto il codice
    
    nodo *q = L.primo;
    while ( q->prossimo != p )  // Cerca il nodo immediatamente precedente p
      q = q->prossimo;
    q->prossimo = p->prossimo;  // Salta il nodo p
    delete p;                   // Rilascia la memoria allocata per p.
  • Re: Liste, ricerca elemento

    Non riesco ad applicare questa cosa al mio programma, sto seguendo questo schema, ma non mi è chiarissimo:

    function removeAfter(Node node) { // rimuove il nodo dopo questo
    obsoleteNode := node.next
    node.next := node.next.next
    destroy obsoleteNode
    }

    però il mio programma è un po incasinato, carica ogni volta da file la lista e quindi dopo l'eliminazione dovrebbe anche riscrivere tutta la lista su file, vi posto il link del file:
  • Re: Liste, ricerca elemento

    Potresti usare una funzione tipo:
    
    void eliminaNodo(L& nodo){
        if (nodo==0) return;
        L p=nodo;
        nodo=nodo->next;
        delete p;
    }
    
    per eliminare il nodo. Inoltre potresti usare una funzione di ricerca per trovarti il nodo da eliminare in base ad un valore:
    
    L* ricercaNodo(L& p,int num){
        if (p==0)return 0;
        if (p->int!=num) return ricercaNodo(p->next,num);
        else return &p;
    }
    
    Questa funzione ha come parametro un nodo passato per riferimento e il valore da cercare. esso ritornerà un valore nullo se non esesistono nodi con il valore da cercare, oppure l'indirizzo di memoria del nodo da cancellare. In questo modo puoi cancellare un nodo dato un valore in questo modo:
    
    bool removeFromList(int num){
    L* p=ricercaNodo(testa,num);
    if (p==0)return false;
    eliminaNodo(*p);
    return true;
    }
    
    Con il valore di ritorno puoi così verificare se è stato davvero eliminato il nodo corrispondente al valore.
    Anche se sono un normale utente, spero che ti sia stato di aiuto.
Devi accedere o registrarti per scrivere nel forum
8 risposte