Funzione lista c++

di il
8 risposte

Funzione lista c++

Ciao! Ho questa lista:
struct nodo
{
   int valore;
   nodo *succ;
};

class lista
{
     nodo *l;
     ...
 public:
     ...
};
Devo implementare una funzione membro che elimina gli elementi comuni ad un'altra lista ricevuta come argomento. Ho scritto questo codice:
void lista::elimina(lista &l2) {
    bool trov=false;
    nodo* aux; // nodo da cancellare
    nodo* p = l; // nodo iniz al puntatore di testa della lista principale
    nodo* q = l2.l; // nodo iniz al pt di testa della lista passata per argomento
    while (p != 0) {
        while ((q != 0) || (trov==false)) {
            if (p->valore == q->valore) {
                aux = p;
                p = p->succ;
                delete aux;
                trov = true;
            } 
            else
                q = q->succ;
        }
        p=p->succ;
    }
}
Non da errori quando vado a compilare però in esecuzione non fa quello che mi serve! C'è qualcosa di sbagliato nel codice??

8 Risposte

  • Re: Funzione lista c++

    Il ciclo deve continuare se 'q!=0' E 'trov==false', quindi sostituisci la condizione || con &&.
  • Re: Funzione lista c++

    Ho cambiato la condizione e quando vado ad eseguire mi restituisce tutti gli elementi della lista (anche quelli comuni che dovrei eliminare). Forse sbaglio qualcosa nella chiamata nel main

    cout << "Inserisci l'altra lista di quanti elementi? ";
    cin >> n;
    for(int k=0;k<n;k++) {
    cout << "Elemento " <<k+1<< ": ";
    cin >> x;
    l2.push(x);
    }
    l1.elimina(l2);
    l1.stampa();
  • Re: Funzione lista c++

    Scusate ho sbagliato ad inviare il mess. Riporto qui il codice nel main:
    cout << "Inserisci l'altra lista di quanti elementi? ";
    cin >> n;
    for(int k=0;k<n;k++) {
           cout << "Elemento " <<k+1<< ": ";
           cin >> x;
           l2.push(x);
    }
    l1.elimina(l2);
    l1.stampa();
    dove l1 è lista su cui devo fare l'operazione (con i valori inseriti in precedenza).
  • Re: Funzione lista c++

    Qualcuno mi sa aiutare?? Vi prego è urgente! Sto provando con diverse soluzioni ma credo ci sia qualcosa di sbagliato nel codice della funzione
  • Re: Funzione lista c++

    Prendi questo blocco
    
    if (p->valore == q->valore) {
                    aux = p;
                    p = p->succ;
                    delete aux;
                    trov = true;
                } 
    
    carta e penna in mano e raggiona:
    tu assegni ad aux il nodo da cancellare. poi ti sposti al nodo successivo e cancelli aux. Cos'è successo al collegamento del nodo precedente ad aux con il nodo successivo? niente, non hai modificato il collegamento. Una volta eliminato aux, il nodo precedente non ha collegamenti con quello successivo perché l'hai eliminato. Quindi conclusione: il tuo codice è da rivedere.
  • Re: Funzione lista c++

    Una soluzione potrebbe essere quella di risalire al nodo precedente una volta trovato l'elemento da eliminare. Come si fa:
    
    if (p->valore == q->valore) {
    //qui inseriamo un loop che trova il nodo precedente
    nodo * tmp = l;
    while(tmp->succ != p) //finche non troviamo il nodo precedente
            tmp = tmp->succ;
    //nodo precedente trovato
    //eliminiamo il collegamento del nodo precedente con quello da eliminare
    // facciamo collegare il nodo precedente con quello successivo a quello da eliminare
    tmp->succ = p->succ;
    //poi il codice va bene così com'è
                    aux = p;
                    p = p->succ;
                    delete aux;
                    trov = true;
                } 
    
  • Re: Funzione lista c++

    Ok ok grazie. cmq sto provando anche in altri modi e avendo a disposizione la funzione cancella:
    bool lista::cancella(int x)
    {
       nodo *lc, *lp;
       lc=l;	// nodo inizializzato al puntatore di testa
       lp=0;	// nodo precedente a quello da eliminare
       while( (lc!=0) && (lc->valore < x) )
       {
          lp=lc;
          lc=lc->succ;
       }
       if ( (lc!=0) && (lc->valore == x) )
       {
          if (lp==0)
               l=lc->succ;		// cancellazione in testa
          else	
               lp->succ = lc->succ;	// cancellazione non in testa
          delete lc;
          return true;
       }
       else
          return false;		// lista vuota o elemento non trovato (lc=0)
    }
    credo che riutilizzando questa funzione la cosa sarebbe molto più semplice. Riporto qui una bozza di codice che è sbagliato perchè non so come richiamare la funzione...
    void lista::elimina_comuni(lista &l2) 
    {
        bool trov=false;
        nodo* aux;
        nodo* p = l;        
        nodo* q = l2.l;     
        while (p != 0) {
            while ((q != 0) && (trov==false)) {
                if (p->valore==q->valore) 
                    trov = ????? cancella(p->valore);
                else
                    q=q->succ;
            }
            p=p->succ;
        }
    }
    una soluzione potrebbe essere quella di riportare la lista 1 nei parametri della funzione in modo da poter scrivere:
    trov=l1.cancella(p->valore);
    oppure???
  • Re: Funzione lista c++

    Qualcuno sa aiutarmi???
Devi accedere o registrarti per scrivere nel forum
8 risposte