Djot (Normal User)
Rookie
Messaggi: 28
Iscritto: 14/02/2017
|
Cosa intendi per "vai avanti con la lista"?
|
|
()
Newbie
Messaggi:
Iscritto:
|
Postato originariamente da Djot:
Cosa intendi per "vai avanti con la lista"? |
Quello che fai con
p=p->next;
cioè passare all'elemento successivo.
Ammetto che la frase non è il massimo della chiarezza. |
|
Djot (Normal User)
Rookie
Messaggi: 28
Iscritto: 14/02/2017
|
Potete fornirmi le giuste righe di codice per creare una funzione in grado di eliminare elementi non divisibili per 2 e 3 dalla lista da me creata?
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
E che senso avrebbe darti del codice? Non ne faresti buon uso.
Piusstosto cerca di spezzare quel programma in funzioni, di cui una è bool numeroPrimo(lista* elem);
La eliminazione di un elemento ha due step:
Prima si collega l'elemento precedente a quello da eliminare al successivo di quello da eliminare, poi di libera la memoria riservata a quell'elemento.
|
|
lumo (Member)
Expert
Messaggi: 449
Iscritto: 18/04/2010
|
Ti consiglio di fare come dicono Mikelius e TheDarkJuster, comunque il tuo codice è quasi corretto:
Codice sorgente - presumibilmente C/C++ |
list* originale = p;
while(p!=NULL){
if(!((p->val)%2==0 || (p->val)%3==0)){
p->next = (p->next)->next;
}
p = p->next;
}
return originale;
|
Non l'ho provato ma dovrebbe funzionare, due note su perché non funzionava prima
1) Scorrevi tutta la lista e il p che ritornavi era arrivato alla fine, quindi quando vai a stampare hai già consumato tutta la lista e non viene fuori niente.
Un modo per risolvere è quello di salvare il puntatore originale (di solito si chiama head). Un altro è quello di usare le doubly-linked list che hanno anche un puntatore "prev" per tornare indietro, ma in questo caso non avrebbe senso.
Nota che questa operazione modifica permanentemente la lista originale, quindi perdi il riferimento ai nodi eliminati. Siccomi questi sono stati allocati con new, hai un memory leak perché non hai nessun mezzo per liberarli.
Puoi aggiungere un delete quando li togli, altrimenti una cosa che si fa spesso è creare una nuova lista invece che modificare quella originale.
2) Per negare la condizione ho messo un ! davanti a tutto, come facevi tu era sbagliato.
Se hai una condizione del tipo (a || b) la negazione è !a && !b (ragionaci un attimo con un esempio, comunque si chiamano leggi di de morgan).
Infine questo è effettivamente C (perché a parte il cout e new, tutto compilerebbe con un compilatore C).
Il C++ però è quasi un superset del C, quindi si può chiamare C++ la maggior parte del codice in C.
Ultima modifica effettuata da lumo il 02/04/2017 alle 20:41 |
|
()
Newbie
Messaggi:
Iscritto:
|
C'è pure da dire che il main cosi scritto è logicamente errato
Codice sorgente - presumibilmente C/C++ |
int main(){
lista* P;
P=creaLista1(5);
stampa(P);
cerca(P); // ed il return?
return 0;
}
|
dovrebbe essere qualcosa tipo
Codice sorgente - presumibilmente C/C++ |
int main(){
lista* P, S;
P=creaLista1(5);
stampa(P); // Per stampare la lista originale, se la vuoi
S=cerca(P); // meglio chiamarla creaListaNonPrimi() o qualcosa di più indicativo di quello che fa
stampa(S); // Per stampare la lista senza i numeri primi
return 0;
}
|
Poi come consigliato sopra, spezzetta le funzioni
Ad esempio
Codice sorgente - presumibilmente C++ |
int verificaPrimo( int val ) //Scegli l'algoritmo che più ti piace { if( (val%2 == 0) || (val%3 == 0) ) return 0; else return 1; } void cerca( lista* p ) { list* s = p; while(p!=NULL){ if( !verificaPrimo(p->val) ){ // usa il metodo che preferisci } return s; }
|
|
|
torn24 (Normal User)
Pro
Messaggi: 156
Iscritto: 04/01/2008
|
Un numero è primo se divisibile solo per uno e per se stesso.
Un algoritmo un po, MOLTO dispendioso ma efficace per stabilire se un numero è primo, dividi il numero da 2 a numero-1, se è divisibile non è primo.
Esempio non compilato-provato
Codice sorgente - presumibilmente C++ |
int verificaPrimo( int val ) //Scegli l'algoritmo che più ti piace { int i=2; for(i=2,i<=val-1;i++){ if(val%i==0){ // ritorna zero se è divisibile cioè non primo return 0; } } return 1; // altrimenti è primo e ritorna 1 }
|
Ultima modifica effettuata da torn24 il 03/04/2017 alle 8:47 |
|
()
Newbie
Messaggi:
Iscritto:
|
Non vorrei finire O.T. ...
Comunque:
Postato originariamente da torn24:
Un numero è primo se divisibile solo per uno e per se stesso.
Un algoritmo un po dispendioso ma efficace per stabilire se un numero è primo, dividi il numero da 2 a numero-1, se è divisibile non è primo.
|
Da qualche parte c'è una dimostrazione che dice che, per ottimizzare il calcolo basta "provare" la divisibilità per i numeri da 2 fino alla sua radice quadrata sqrt(valore) e non fino a valore-1 , non che sia scoretto, ma questi valori sono sufficenti, infatti porto un esempio:
33
radice 5.74
basta provare da 2 a 5, infatti provare la divisibilità per 11 è superfluo,
perchè 33/11=3 , ma 3 come divisore lo si era già trovato
Ultima modifica effettuata da il 03/04/2017 alle 13:30 |
|