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à