PROBLEMA linguaggio c - liste con puntatori

Pubblicità

denzell00

Nuovo Utente
Messaggi
3
Reazioni
1
Punteggio
22
Salve a tutti, il problema è il seguente:
"Data una lista di interi in forma collegata con puntatori, scrivere una funzione che calcoli le occorrenze di CIASCUN elemento e le stampi a video".
Ora, io ho provato a risolvere il problema con il seguente programma, che si compone di due funzioni, più la chiamata dal main:
(il problema è che, se ad esempio la lista è 5-3-5-8-NULL, mi viene stampato;
"5 compare 2 volte
3 compare 1 volta
5 compare una volta
8 compare una volta
ma io, ovviamente, vorrei che il programma scrivesse una sola volta l'occorrenza dei numeri ripetuti, in questo caso 5... come posso risolvere?? grazie in anticipo!)

ecco come ho fatto...

Codice:
....

int main(){
...
visita(lista);//chiamata dal main:
...}

//definizione funzioni
void visita(struct list *ptr){
    while(ptr!=NULL){
        print_occur(ptr, ptr->value);
        ptr=ptr->next_ptr;}
}

void print_occur(struct list *ptr, int valore){
    int count=0;
    while (ptr !=NULL){{//(ptr!=NULL, ptr=ptr->next_ptr)
        if ((ptr->value)==valore){
            count++;
            }
            ptr=ptr->next_ptr;
        }
    }
    printf("Il valore %d compare %d volte", valore, count);
}
[code]
 
Ultima modifica da un moderatore:
potrebbe essere un modo giusto...volevo riuscire a farlo funzionare mantenendolo simile a quello che avevo scritto...comunque grazie per lo spunto!
 
O volendo potresti creare una nuova lista puntata, in cui la struct è composta dal valore, dal numero delle occorrenze e dal puntatore al prossimo nodo.
Pessimo come prestazioni ma è un modo per farlo :patpat:
 
Ciao, scriviamo i codici sempre con il tag code!
Detto ciò, domani ci dò uno sguardo che sono fuori, e vedo di proporti un fix magari senza implementare algoritmi di ordinamento se è quello che vuoi.

EDIT :
Un'idea può essere confrontare il primo numero con gli altri sfruttando i pointer, es : Prendi due puntatori, prec e current che puntano allo stesso numero, e curr diventa curr->next e inizi a contare.( Controlli se prec è uguale o meno a curr , se sì il contatore++ e poi come già detto curr->next continuando a confrontare ).
Poi metti il primo numero in un'altra lista o array (temp) e verifichi costantemente se quello è stato o meno già confrontato nel tuo algoritmo di prec e curr.
 
Ultima modifica:
Ciò che vuole dire Vidram, tendo a precisare dato che non credo si capisca cosa intenda, è quello di usare 2 puntatori (prec e curr) per effettuare il conto. Al primo giro posizioni prec e curr rispettivamente sul primo e sul secondo numero della lista. Poi apri un ciclo while che si chiuse se curr==NULL, in tale ciclo confronti se l'elemento di prec e di curr sono uguali: se lo sono incrementi di 1 un contatore(inizialmente a 1) altrimenti curr diventa il successivo di curr. Ad ogni numero contato ti conviene poi salvarlo in un array o in un'altra lista per non andare a contare più vole lo stesso numero: ogni nuovo numero controlli se è presente o meno nell'array, se affermativo curr diventa il successivo di curr, altrimenti effettui il conto.Ad ogni conto poi stampi il numero contato dal contatore e dovrebbe funzionare, dico dovrebbe dato che non ho effettuato alcuna verifica e probabilmente esisterà anche un metodo molto più efficiente. Ah cosa importante è che per fare il tutto serve un ciclo all'inizio che si fermi quando prec arriva a NULL, o almeno il successivo di prec sia NULL.
 
Ultima modifica:
Ok con i consigli son riuscito a risolvere: con due puntatori, di cui uno viene inizializzato sempre al primo elemento quando ripartono i cicli.
 
Pubblicità
Pubblicità
Indietro
Top