Ordinamento lista ed eliminazione doppioni

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Ordinamento lista ed eliminazione doppioni

    Prova così , dovrebbe andare , però se non capisci qualche passaggio chiedimeli perchè tengo più che tu capisca l' algoritmo .
    
    void elimina ( L & l )
    {
    if ( l == 0 )
    	return;
    else
       doppioni(l->next,l->val);
    }
    
    void cancella ( L & l , L & prossimo ) {
    	L punt = l;
    	l = prossimo;
    	delete punt;
    }
    
    
    void doppioni( L & l , int valore ){
      if ( l != 0)
      {
    	 if ( l->val == valore )
    	 {
    		cancella ( l , l->next );
    		doppioni ( l, valore );
    	 }
    	 else
    		doppioni( l->next, l->val);
      }
    }
    
  • Re: Ordinamento lista ed eliminazione doppioni

    :S immagino che non intendevi proprio così . . .
    void erase(L & z,int val)
    {
         if(z->next->val==z->val)
                {
                pop(z);
                erase(z->next,z->val);
                }
         else
          erase( z->next , z->val );
          
            
    }
  • Re: Ordinamento lista ed eliminazione doppioni

    Cerco di correggere il tuo . Vedi se funziona:
    
    void pop(L&z)
    {
         L p=z->next;
         delete z;
         z=p;
    }
    
    void erase(L & z)
    {
         if((z->next)->val==z->val)
                {
                pop(z);
                erase(z);
                }
         else
          erase( z->next );
    
    
    }
    
    ho levato int val come parametro perchè ho visto che non lo utilizzi per niente xD . Il problema è solo quel z->next->val. Vedi se funziona ^^ Quello che ho corretto sono solo i parametri che gli passi alla funzione erase ( non ti imbrogliare con i puntatori, vabbè è semplice che accada xD ) .
  • Re: Ordinamento lista ed eliminazione doppioni

    No, non funziona, cmq scrivere z->next->val dovrebbe essere corretto
  • Re: Ordinamento lista ed eliminazione doppioni

    Ah ovvio mi sono dimenticato di fare una cosa XD . La funzione erase come fa a terminare? in questo modo è come se andasse in loop e cercherà di prendere locazioni di memoria non accessibili e quindi va in errore. Quindi la funzione erase continua finquando il puntatore punta a qualcosa
    
    void erase(L & z)
    {
       if ( ( z != 0) && ( z->next != 0 ) )
       {
         if((z->next)->val==z->val)
                {
                pop(z);
                erase(z);
                }
         else
          erase( z->next );
       }
    }
    
  • Re: Ordinamento lista ed eliminazione doppioni

    Grande ale !

    non ho capito perchè hai messo la doppia condizione nell 'if, voglio dire : non basetrebbe solamente
    if ( z->next != 0 ) 
    anche perchè a me pare funzionare
  • Re: Ordinamento lista ed eliminazione doppioni

    Beh si però devi mettere una condizione prima di chiamare la funzione erase: Se la lista è vuota non puoi chiamarla altrimenti potrebbe dare errore ^^

    Distinti Saluti,
    Alessandro
Devi accedere o registrarti per scrivere nel forum
21 risposte