Oppure

Loading
01/04/17 17:16
Djot
Scusatemi , ho qualche problema su un piccolo esercizio riguardante le liste , vi elenco qui sotto il comando dell'esercizio e il mio codice sorgente :
"Letta in input una sequenza di numeri interi positivi memorizzarla in una ista. Costruire una seconda lista contenente soltanto gli elementi della prima lista che non siano numeri primi. Stampare la seconda lista."

#include <iostream>
using namespace std;
 
struct lista{
        int val;
        lista* next;
};
 
lista* creaLista1(int m){
        lista* aux ; lista* p=NULL;
        for(int i = m; i>0 ; i--){
                aux = new lista;
                aux->val= i;
                aux->next=p;
                p = aux;
        }
        return (p);
}
 
lista* cerca(lista* p){
        while(p!=NULL){
                if((p->val)%2==0 || (p->val)%3==0){
                        cout << p->val;
                    p = p->next;}
                else
                        if((p->val)%2!=0 || (p->val)%3!=0)
                                p->next = (p->next)->next;
        }
        return (p);
}
 
void stampa(lista* p){
        while(p!=NULL){
                cout << p->val;
                p = p->next;
        if(p!=NULL)
                cout << "->" ;
        }
        cout << endl;
}
int main(){
        lista* P;
        P=creaLista1(5);
        stampa(P);
        cerca(P);
        return 0;
}


Il codice crea e stampa la prima lista , ma tuttavia non stampa la seconda versione della lista (quella senza numeri primi) , potete elencarmi l'errore?
aaa
01/04/17 17:36
lumo
Il problema è che il tuo codice non toglie i primi, ci sarebbero più modi per farlo, sai cos'è un numero primo intanto?

Alla fine la funzione cerca non dovrebbe avere nessun "cout" all'interno, dovrebbe solo ritornare il nuovo puntatore e dopo useresti stampa su quello.
aaa
01/04/17 17:41
Innanzitutto, l'algoritmo per verificare se un numero è primo è sbagliato...
Ad esempio:
25 non è un numero primo, ma non è divisibile ne per 2 ne per 3.

Passiamo al codice
lista* cerca(lista* p){
        while(p!=NULL){
                if((p->val)%2==0 || (p->val)%3==0){
                        cout << p->val;
                    p = p->next;}
                else
                        if((p->val)%2!=0 || (p->val)%3!=0)
                                p->next = (p->next)->next;
        }
        return (p);
}

Tu hai scritto:
Se il numerò è divisibile per 2 o per 3
    stampa il numero
    vai avanti con la lista 
altrimenti
    se il numero non è divisibile per 2 o per 3
    ???????



Ultima modifica effettuata da 01/04/17 17:41
02/04/17 14:35
Djot
Potete fornirmi una versione corretta della funzione cerca? Tralasciando il fatto che cancelli solo numeri non divisibili per 2 e 3 , quale sarebbe la sua versione corretta?
aaa
02/04/17 15:02
AldoBaldo
Se val in struct lista è un int a 32 bit senza segno puoi includere nel programma la serie precalcolata dei numeri primi compresi tra 2 e 65535, quindi procedere confrontando direttamente con quei valori i valori nella tua lista. Se poi la tua lista è una lista ordinata puoi ottimizzare il confronto in modo che effettui il minor numero possibile di calcoli inutili.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
02/04/17 15:12
Postato originariamente da Djot:

Potete fornirmi una versione corretta della funzione cerca? Tralasciando il fatto che cancelli solo numeri non divisibili per 2 e 3 , quale sarebbe la sua versione corretta?


Con

p->next = (p->next)->next; 


Cosa volevi far fare al programma?
perchè non hai usato un semplice "vai avanti con la lista"?
02/04/17 15:29
Djot
Come avete notato non ho molta dimestichezza con il C++...
aaa
02/04/17 15:34
Postato originariamente da Djot:

Come avete notato non ho molta dimestichezza con il C++...

non vorrei sbagliarmi, ma questo è C , di c++ c'è solo il cout
(o per lo meno, a me sembra lo stesso tipo di gestione che ha il C delle liste, e quel
p->next = (p->next)->next
non l'ho mai visto in c.