Dubbio su intersezione di due liste

di Anonimizzato28411 il
8 risposte
Salve, non capisco quale sia il giusto ragionamento per creare una lista contenente solamente gli elementi che sono presenti in entrambe le liste argomento della funzione.
Insert è una funzione che inserisce la stringa in ordine nella lista ma non ha importanza adesso l' ordine perchè vorrei capire il ragionamento che c'è dietro alla funzione che fa questa intersezione.

list intersect(list& l1, list& l2)
{
 lList i = nullptr;
 
 for (l1 == nullptr; l1 != nullptr; l1 = l1->next){
  while (l2 != nullptr){
   if (l1->str == l2->str) insert(i, l1->str);
   l2 = l2->next;
  }
 }
 return i;
}

8 Risposte

  • L'hai fatta tu questa funzione 'intersect'? Perché secondo me ha più di un baco: quando il while interno finisce (se mai ci arriva) nessuno fa ripartire l2 dalla 'testa', quindi la tua funzione al massimo confronta il primo elemento di l1 con l2 una volta, poi gira a vuoto fino al termine del for.
  • Al netto di alcuni errori, la funzione dovrebbe fare questo: per ogni elemento della prima lista (ciclo for), ne cerca uno uguale nella seconda (ciclo while) e quando li trova li inserisce nella terza (i).
  • Ok grazie ho provato a far ripartire l2 dalla testa ogni volta ma è uguale a prima, non capisco...
    
    ordList intersect(list& l1, list& l2)
    {
     ordList i = nullptr;
     
     for (l1 = nullptr; l1 != nullptr; l1 = l1->next){
      for (l2 = nullptr; l2 != nullptr; l2 = l2->next){
       if (l1->str == l2->str) insert(i, l1->str);
      }
     }
     return i;
    }
    
    
    
  • Ho risolto...
    
    ordList intersect(list& l1, list& l2)
    {
     ordList i = nullptr;
     list curr1 = l1;
     list curr2 = l2;
     for (curr1 = l1; curr1 != nullptr; curr1 = curr1->next){
      for (curr2 = l2; curr2 != nullptr; curr2 = curr2->next){
       if (curr1->str == curr2->str) insert(i, curr1->str);
      }
     }
     return i;
    }
    
    Grazie dei suggerimenti
  • Nelle altre due discussioni in cui ti ho recentemente risposto mi hai ignorato, ci riprovo:

    - puoi anche evitare di passare i parametri per riferimento;
    - l1 e l2 possono presentare elementi che si ripetono?
    - l1 e l2 sono liste ordinate?
  • Si le due liste possono anche essere ordinate ed avere elementi che si ripetono.
  • Nippolo ha scritto:


    Nelle altre due discussioni in cui ti ho recentemente risposto mi hai ignorato, ci riprovo:

    - puoi anche evitare di passare i parametri per riferimento;
    - l1 e l2 possono presentare elementi che si ripetono?
    - l1 e l2 sono liste ordinate?
    Grazie per avermelo fatto notare è che non sono espertissimo e non capisco velocemente quando va usato il passaggio per riferimento...
  • SuperManPC ha scritto:


    Si le due liste possono anche essere ordinate ed avere elementi che si ripetono.
    Se è solo una possibilità quella che l1 e l2 siano ordinate, va bene così, ma in caso contrario il processo di intersezione può essere velocizzato.

    Riguardo al fatto che l1 può avere elementi che si ripetono, dovresti tenerne conto se vuoi che lo stesso elemento non si ripeta anche nella lista intersezione.
Devi accedere o registrarti per scrivere nel forum
8 risposte