Elliminazione numeri dispari da una lista concatenata

di il
1 risposte

Elliminazione numeri dispari da una lista concatenata

Buongiorno a tutti e buone feste passate. Sono uno studente del 4° informatico. Il nostro professore l'ultimo giorno di scuola in un'ora ha spiegato le liste concatenate in C++ e ci ha dato un esercizio per le vacanze natalizie:

"Dopo aver creato una lista concatenata ordinata (in ordine crescente) di N numeri interi inseriti da tastiera, eliminare dalla lista tutti i numeri dispari e stampare poi il numero più piccolo e il numero più grande presenti nella lista."

Sono riuscito a fare la prima parte, ma nella seconda parte (quella di cancellare i numeri dispari) non capisco perchè me li cancella tutti.

Probabilmente sarò linciato per l'algoritmo di cancellazione che sto per mettere, per quanto è fatto male, però aihmé sto cercando di imparare

#include <iostream>
using namespace std;

 struct nodo
 {
   int numero;
   nodo* next;
 };

  // Prototipi
 void insOrdinato(nodo* &p, int x );
 void elimTesta(nodo* &p);
 void stampaLista(nodo *q );

 int menu();

//------------------------------- main ----------------------------------------
int main()
{
   // Puntatore di testa
   nodo* p = NULL;

   int scelta;
   int numero;
   int N;
   float resto;

   do
   {
     scelta = menu();
     switch( scelta )
     {
       case 1: cout<<"Quanti numeri vuoi inserire?"<<endl;
               cin>>N;
               for(int i=0; i<N; i++)
               {
                cout<<"Inserire n."<<i+1<<": ";
                cin>>numero;
                insOrdinato( p, numero );
               }
               break;
               
       case 2: cout<<"Sto elliminando i numeri dispari..."<<endl;
               elimTesta(p);
               break;

       case 3: stampaLista(p);
               break;


     }

   } while( scelta != 0 );

   return 0;
}

//--------------------------- menu ---------------------
int menu()
{
  int s;
  cout<<endl;
  cout<<"1) Inserimento numeri"<<endl;
  cout<<"2) Eliminazione numeri dispari"<<endl;
  cout<<"3) Stampa numero più piccolo e più grande"<<endl;
  cout<<"Scelta: ";
  cin>>s;
  return s;
}

//------------------------- insOrdinato ---------------------
void insOrdinato(nodo* &p, int x )
{
 // 1. Crea e inizializza il nuovo nodo
 nodo* q = new nodo;
 q->numero = x;
 q->next = NULL;

 // 2. Se la lista e' vuota oppure x e' minore del valore
 //    presente nel primo nodo, il nuovo nodo diventa il primo
 //    della lista
 if( p==NULL || (x < p->numero) )
 {
   q->next = p;
   p=q;

 }

 // 3. Altrimenti raggiungi il predecessore del nodo da inserire ...
 else
 {  nodo* r;

    // raggiungi il predecessore di q: nodo che ha come successore
    // un nodo che contiene un valore maggiore o uguale a x
    // oppure l'ultimo nodo della lista (se nessun nodo contiene
    // un valore maggiore o uguale a x)
    r=p;
    while( (r->next != NULL) && (x > r->next->numero) )
    {
       r=r->next ;
    }

    // aggancia il nuovo nodo
    q->next = r->next;
    r->next = q;
 }

}


//------------------------- elimTesta -------------------
void elimTesta(nodo* &p)
{
 float resto;
 for(int i=0;i<5;i++) {
  resto =  p->numero%2;
  if(resto != 0)
  {
   if(p != NULL)
   {
     nodo *q = p;
     p = p->next;
     delete q;
   }
  }
  else
  {
   p = p->next;
   }
                     }
 }

//------------------------- stampaLista -------------------
void stampaLista(nodo *q )
{

  // finche' q punta a un nodo (non siamo alla fine della lista)
  while( q != NULL )
  {
    // stampa l'numerormazione contenuta nel nodo
    cout << q->numero << endl;
    // sposta il puntatore q sul prossimo nodo.
    q = q->next;	
  }
}
Il ciclo for che è in elimina è perché inserisco sempre 5 numeri e faccio ripetere l'istruzione di eliminare per l'appunto 5 volte.

Vi prego non mi aggredite per come è scritto il codice, sono 2 ore che provo, non ce la faccio più .

Grazie a chiunque mi aiuterà

1 Risposte

  • Re: Elliminazione numeri dispari da una lista concatenata

    1) Hai passato p per riferimento e poi...
    2) Per ora può andare perché è fatta per una lista di esattamente 5 numeri, ma se il puntatore è nullo va controllato prima di accedere al valore puntato, non dopo.
    3) Resto meglio dichiararlo intero, si sta lavorando su una divisione tra interi.

    Questa funzione richiede un po' di attenzione in più.
Devi accedere o registrarti per scrivere nel forum
1 risposte