Ordinamento lista ed eliminazione doppioni

di il
21 risposte

Ordinamento lista ed eliminazione doppioni

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

  • Re: Ordinamento lista ed eliminazione doppioni

    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 
    }
    
  • Re: Ordinamento lista ed eliminazione doppioni

    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?
  • Re: Ordinamento lista ed eliminazione doppioni

    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. ^^
  • Re: Ordinamento lista ed eliminazione doppioni

    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
  • Re: Ordinamento lista ed eliminazione doppioni

    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;
            }
      }
    }
    
    
    
  • Re: Ordinamento lista ed eliminazione doppioni

    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
  • Re: Ordinamento lista ed eliminazione doppioni

    È vero, che stupido !

    comunque l'algoritmo di inserimento funziona
  • Re: Ordinamento lista ed eliminazione doppioni

    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
  • Re: Ordinamento lista ed eliminazione doppioni

    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.
  • Re: Ordinamento lista ed eliminazione doppioni

    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
  • Re: Ordinamento lista ed eliminazione doppioni

    Scusami ma da questo codice che hai incollato non riesco a capire
  • Re: Ordinamento lista ed eliminazione doppioni

    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;
    }
  • Re: Ordinamento lista ed eliminazione doppioni

    Ma adesso che mi rendo conto è sbagliatissimo
  • Re: Ordinamento lista ed eliminazione doppioni

    
    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