Scrivere una funzione che calcola occorrenze in una lista di interi

di il
7 risposte

Scrivere una funzione che calcola occorrenze in una lista di interi

Ciao a tutti.
Sono incappato in un problema dal quale non ne esco più fuori. Il comando è: 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. Allora io riesco a scrivere una funzione che mi calcoli le occorrenze si, ma per un solo elemento della lista (e non per tutti come è richiesto) che nel caso avrei in entrata alla funzione. Ciò che non riesco a fare è capire come creare un ciclo che mi permetta prima di scegliere un elemento della lista e poi di scorrere per vedere se ve ne sono altri uguali contandoli, e poi ripetere nuovamente la stessa cosa con l'elemento successivo e via via fino al ptr==NULL.
Qui sotto metto la funzione che calcole le occorrenze per un SOLO elemento dela lista, e non è quella richiesta , ma è per darvi un'idea di come avevo intuito il problema, facendo una visita fino a quando il puntatore non puntava al valore nullo e vedere se il suo valore era uguale a quello dato in entrata (il mio problema appunto è che non riesco a far scorrere diciamo il valore in entrata dato che ho a che fare con una lista).

void funzione (struct list*ptr, valore)
int count;
while (ptr!=NULL){
if(ptr->value==valore){
count++;
}
ptr=ptr->next_ptr;
}

Grazie in anticipo

7 Risposte

  • Re: Scrivere una funzione che calcola occorrenze in una lista di interi

    La funzione che conta il numero di elementi pari ad un certo valore passato come argomento ce l'hai già, invece di funzione() chiamala conta_occorrenze() così si capisce cosa fa, e falle ritornare il valore (attenzione che in quello che avevi scritto non inizializzavi a 0 il count!):
    int conta_occorrenze(struct list*ptr, valore)
    {
      int count=0;
      while (ptr!=NULL){
        if(ptr->value==valore){
          count++;
        }
        ptr=ptr->next_ptr;
      }
      return count;
    }
    Verificala bene che ti ritorni i conteggi attesi, es con un lista
    1 2 5 2 1 5 5
    verifica che
    conta_occorrenze(1) ritorni 2
    conta_occorrenze(2) ritorni 2
    conta_occorrenze(5) ritorni 3
    Bene.
    Sei in grado (suppongo di sì) di scrivere una funzione che stampa a video tutti i valori della lista?
    Se non ce l'hai (come hai fatto a provare il punto precedente?), scrivila e provala.
    Se invece ce l'hai già, e funziona, ti è sufficiente richiamare conta_occorrenze() per ciascun elemento che stampi, passando appunto il dato nel parametro valore della conta_occorrenze().
  • Re: Scrivere una funzione che calcola occorrenze in una lista di interi

    Ciao candaluar e grazie per la tua risposta. Ho seguito il tuo consiglio, ma ho comunque un'altra complicazione, riesco a calcolare le occorrenze della lista, ma una volta che arrivo ad un numero già conteggiato la mia funzione non considera più gli elementi passati e quindi mi rende nuovamente la sua occorrenza ma sbagliata. Come posso risolvere? Forse il problema è cosa dare in input alla funzione occorrenze quando la chiamo perchè se le do ad ex. il penultimo ptr della lista la funzione occorrenze scorre solo dal penultimo all'ultimo elemento della lista saltando tutti quelli precedenti.

    void visita(struct list*ptr1){
    int conta=0;
    while(ptr1!=NULL){
    conta=funzcompito2occor(ptr1,ptr1->value);
    printf("L'elemento %d viene fuori %d volte/a \n",ptr1->value,conta);
    ptr1=ptr1->next_ptr;
    }
    }

    int occorenze(struct list*ptr,int valore){
    int count=0;
    while(ptr!=NULL){
    if(ptr->value==valore){
    count++;
    }
    ptr=ptr->next_ptr;
    }
    return count;
    }
  • Re: Scrivere una funzione che calcola occorrenze in una lista di interi

    Alla funzione che conta le occorrenze puoi passare il puntatore all'elemento corrente, come stai facendo ora, e in questo modo visiterai gli elementi che seguono tale elemento, di qui il conteggio parziale; in alternativa puoi passare il puntatore del primo elemento, così visiterai ogni volta tutti gli elementi e avrai i conteggi completi.
  • Re: Scrivere una funzione che calcola occorrenze in una lista di interi

    Ok ma come faccio a indicargli contemporaneamente il primo puntatore (che sarebbe da dove partire a cercare) e il ptr->value via via successivo. Cioè come creo un ciclo che chiama la funzione occorrenze ponendo nell'argomento 1 sempre il primo puntatore e nel secondo via via quelli successivi?
  • Re: Scrivere una funzione che calcola occorrenze in una lista di interi

    Alla funzione visita() non passi il puntatore al primo elemento?
    Riflettici perchè in visita() usi proprio ptr1 per attraversare la lista?
  • Re: Scrivere una funzione che calcola occorrenze in una lista di interi

    F33 Mi sto perdendo.. alla funzione visita avevo messo ptr1 per non confondermi con l'altro ptr della funzione occorrenze
  • Re: Scrivere una funzione che calcola occorrenze in una lista di interi

    Se qualcuno ti da il puntatore al primo elemento, vuol dire che ce l'hai, devi solo salvartelo da qualche parte.
    Oppure se non vuoi salvartelo, puoi usare un altro puntatore per visitare la lista.
Devi accedere o registrarti per scrivere nel forum
7 risposte