Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Esercizio su Liste
Forum - C/C++ - Esercizio su Liste - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Djot (Normal User)
Rookie


Messaggi: 28
Iscritto: 14/02/2017

Segnala al moderatore
Postato alle 17:42
Domenica, 02/04/2017
Cosa intendi per "vai avanti con la lista"?

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:44
Domenica, 02/04/2017
Testo quotato

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.

PM Quote
Avatar
Djot (Normal User)
Rookie


Messaggi: 28
Iscritto: 14/02/2017

Segnala al moderatore
Postato alle 18:03
Domenica, 02/04/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?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:17
Domenica, 02/04/2017
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.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 20:40
Domenica, 02/04/2017
Ti consiglio di fare come dicono Mikelius e TheDarkJuster, comunque il tuo codice è quasi corretto:
Codice sorgente - presumibilmente C/C++

  1. list* originale = p;
  2. while(p!=NULL){
  3.     if(!((p->val)%2==0 || (p->val)%3==0)){
  4.         p->next = (p->next)->next;
  5.     }
  6.     p = p->next;
  7. }
  8. 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
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 22:27
Domenica, 02/04/2017
C'è pure da dire che il main cosi scritto è logicamente errato
Codice sorgente - presumibilmente C/C++

  1. int main(){
  2.         lista* P;
  3.         P=creaLista1(5);
  4.         stampa(P);
  5.         cerca(P); // ed il return?
  6.         return 0;
  7. }



dovrebbe essere qualcosa tipo
Codice sorgente - presumibilmente C/C++

  1. int main(){
  2.         lista* P, S;
  3.         P=creaLista1(5);
  4.         stampa(P); // Per stampare la lista originale, se la vuoi
  5.         S=cerca(P); // meglio chiamarla creaListaNonPrimi() o qualcosa di più indicativo di quello che fa
  6.         stampa(S); // Per stampare la lista senza i numeri primi
  7.         return 0;
  8. }




Poi come consigliato sopra, spezzetta le funzioni
Ad esempio
Codice sorgente - presumibilmente C++

  1. int verificaPrimo( int val ) //Scegli l'algoritmo che più ti piace
  2. {
  3.     if( (val%2 == 0) || (val%3 == 0) )
  4.         return 0;
  5.  
  6.     else return 1;
  7. }
  8.  
  9.  
  10. void cerca( lista* p )
  11. {
  12.  
  13.     list* s = p;
  14.     while(p!=NULL){
  15.         if( !verificaPrimo(p->val) ){
  16.      
  17.                  // usa il metodo che preferisci
  18.  
  19.     }
  20.     return s;
  21.  
  22. }








PM Quote
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 8:39
Lunedì, 03/04/2017
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++

  1. int verificaPrimo( int val ) //Scegli l'algoritmo che più ti piace
  2. {
  3.     int i=2;
  4.    
  5.     for(i=2,i<=val-1;i++){
  6.  
  7.            if(val%i==0){
  8.  
  9.                 // ritorna zero se è divisibile cioè non primo
  10.                 return 0;
  11.           }
  12.  
  13.    }
  14.    
  15.  
  16.     return 1; // altrimenti è primo e ritorna 1
  17. }


Ultima modifica effettuata da torn24 il 03/04/2017 alle 8:47
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 8:51
Lunedì, 03/04/2017
Non vorrei finire O.T. ...
Comunque:

Testo quotato

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
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo