Ordinamento lista ed eliminazione doppioni

di Anonimizzato9570 il
21 risposte
Devo inserire il contenuto di una lista in una seconda lista, in maniera ordinata, ma come potrei fare?
 
  void create3List(L l , L& z)
{
   while (l!=0)
        {
         if(z==0){  //quando la terza lista è vuota
         Push(z,l->val);//ineseisci l'elemento
         l=l->next;
         }
         
         if(l->val < z->val)
                   {
                   Push(z->next,l->val);
                   l=l->next;
                   }
                 
         create3List( l, z);
         }  
}
      
                 
                    
   
sto cercando di farla con una procedura ricorsiva

21 Risposte

  • Ciao ^^ , scusami io lo farei in un modo un pò più semplice. Quando crei l' algoritmo dell' inserimento in una lista, lo crei in modo tale che si venga a formare una lista ordinata ( quindi senza nessuna politica LIFO O FIFO ) . E poi per inserire una lista in un' altra basterà nel main chiamare la funzione inserimento nel quale gli passi i valori dell' altra lista.
    
    inserimentoLista( L & l , const int valore ) {
          if ( l == 0 ) 
           {
                 l = new Tipo; // ovviamente tipo sta per quello che ti serve 
                 l->val = valore;
                 l->next = 0 ;
            }
           else  if ( l->val <= valore ) 
                    inserimentoLista( l->next, valore );
           else
            {
                  L p = new Tipo;
                  p->next = l; 
                  l = p;
                  l->val = valore;
             }
    }
    
    Questo dovrebbe andare bene per l' inserimento di una lista ( l' ho fatto stesso nel forum non ti so dire xD )
    Nel main invece potresti fare in questo mod o
    
    L lista1,lista2;
    int valore;
    for ( int i= 0 ; i < 5 ; i++ ) 
    {
        cin >> valore;
        inserimentoLista( lista1, valore ) ;
    }
    L currentpunt = lista1;
    while ( currentpunt != 0 ) 
    {
          inserimentoLista( lista2, currentpunt->val ) ;
          currentpunt = currentpunt->next;
    }
    return 0 
    }
    
  • Prima metti a posto l'identazione. mi rifiuto di leggere il tuo codice da ora in poi. Devo sempre piazzarlo sul compilatore e fare le correzioni. non credi sia giusto nel confronto di chi cerca di aiutarti, di aiutarlo un pò anche tu?
  • Sono d' accordo con skynet , non immagini quanto uno debba perdere tempo per leggere un programma identato male , a volte si perde più tempo per identarlo che per vedere cosa è che non va. ^^
  • skynet ha scritto:


    Prima metti a posto l'identazione. mi rifiuto di leggere il tuo codice da ora in poi. Devo sempre piazzarlo sul compilatore e fare le correzioni. non credi sia giusto nel confronto di chi cerca di aiutarti, di aiutarlo un pò anche tu?
    hai perfettamente ragione, ho il vizio di indentare -a modo mio- e non va assolutamente bene, farò più attenzione per il futuro
  • Ora vorrei provare a svolgere questo esercizio :
    date due liste ordinate creare una terza lista ordinata dalle prime due

    ma in esecuzione mi da errore ed esce nell'ultimo passaggio( quando richiamo questa procedura)
    
    
    
    void unisci(L l,L p,L&z)
    {
      if(z==0) //se il terzo vettore è vuoto 
          {
             if (l->val < p->val)
               inserimento(z,l->val); // è la procedura per inserire di ale, ma non so se usarla anche qui 
             
             else 
               inserimento (z,p->val);
          }
         
         
      while(l!=0 || p!=0)
      {
            if (l->val < p->val)
            {
               inserimento(z,l->val);
               l=l->next;
            }
             
            else 
            {
               inserimento (z,p->val);
               p=p->next;
            }
      }
    }
    
    
    
  • Ciao ,

    Allora l' algoritmo dell' inserimento che ho fatto è un qualcosa che ti semplifica molto questo esercizio che vuoi fare. Perchè tu quando vuoi inserire nella lista un valore , qualsiasi esso sia , te lo inserisce in modo ordinato , cioè la lista risulta essere sempre ordinata . Quindi se vuoi inserire due liste ordinate in una terza è inutile utilizzare una specie di mergesort, basta che esempio prima inserisci i valori di una lista e poi i valori dell' altra , tanto la terza lista risulterà sempre ordinata. ( le due liste possono anche nn essere ordinate per intenderci ) Il punto è se non ho fatto errori nell' algoritmo dell' inserimento ( l' ho fatto stesso nel forum ). rimodifica il tuo programma e dimmi se ti da errori
  • È vero, che stupido !

    comunque l'algoritmo di inserimento funziona
  • Ecco perchè non si vuole creare programmi da zero , non capirebbe la potenzialità di quell' algoritmo. Comunque penso di averti fatto capire l' utilità dell' inserimento ^^.

    Distinti Saluti,
    Alessandro
  • A me non da questo errore . Ma hai inserito il sottoprogramma principale int main? Di norma quando c'è il linker error significa che non hai un sottoprogramma principale.
  • Ho cancellato il messaggio perchè avevo fatto una sciocchezza,m come faccio a fare in modo che mi elimini tutti i doppioni?
    nel main:
    
     while (z->next!=0){
            if (erase(z))
             z=z->next;
    }
           print (z);
    mi va in errore
  • Scusami ma da questo codice che hai incollato non riesco a capire
  • Ignoralo, ho fatto tutto nella procedura,

    ma mi elimina sempre e solo la prima ripetizione:
    bool erase(L & z)
    {
        while (z!=0){
             if   (z->val==z->next->val){
                  pop(z);
             return true;
             }
             else return(erase( z->next));
             return false;
             z=z->next;
             }
    }
    
    void pop(L&z)
    {
       
         L p=z->next;
         delete z;
         z=p;
    }
  • Ma adesso che mi rendo conto è sbagliatissimo
  • 
    z->next->val
    
    non so sinceramete se si può fare , alemno io non l' ho mai utilizzato in questo modo però ti consiglio di mettere una parentesi cioè:
    
    (z->next)->val
    
    Comunque si penso sia molto sbagliato , ho letto un pò e ci sono delle cose che non vanno , ti direi di rifarlo. Allora io l' ho fatto ( non compilato sempre teoricamente xD ) però non vorrei incollarlo , cioè te lo spiego sempre secondo un mio modo di fare. Allora:
    Attraverso una ricorsione senza while nè niente ( tu hai utilizzato ricorsione e while, un casino ), in cui gli passo il puntatore next e il valore del record ( l->next , l->val ) , se il valore del puntatore next è uguale al valore ( quindi se c'è un doppione ), elimino non il primo ma il secondo ( l' inverso tuo xD ) e il primo punterà al terzo elemento e richiamerà la stessa funzione passandogli il puntatore next del primo e il valore del primo ( l , valore ) . Se invece i valori sono diversi chiamo sempre la funzione passandogli ( l->next , l->val ) come all' inizio.
Devi accedere o registrarti per scrivere nel forum
21 risposte