Puntatori e liste

di il
5 risposte

Puntatori e liste

struct elemento
{
    int inf;
    struct elemento *succ;
};
 struct elemento *creaLista();
 int quadPerfect (struct elemento *);

 int main(void)
 {
     struct elemento *puntLista;
     puntLista=creaLista();
     printf("\nCi sono %d quadrati perfetti", quadPerfect(puntLista));
 }
int quadPerfect(struct elemento *p)
{
    int c, i, trovato;
    c=0;
    while(p!=NULL)
    {
        trovato=0;
        for(i=0; i<=sqrt(p->inf)&&trovato==0; i++)
        {
            if(i*i==p->inf)
                trovato=1;
        }
        if(trovato==1)
            c=c+1;
    }
    return(c);
}

ciao ragazzi, scusate ogni volta che mi trovo davanti una funzione che deve restituire un intero non riesco a compilare l'esercizio. In questo caso dovrei contare quanti sono i quadrati perfetti in una lista, ma non riesco neanche a contare quanti numeri sono pari, quanti sono dispari ecc.. cedo di avere un errore nel main ma non capisco che devo mettere. grazie in anticipo (in C)

5 Risposte

  • Re: Puntatori e liste

    ciao ragazzi, scusate ogni volta che mi trovo davanti una funzione che deve restituire un intero non riesco a compilare l'esercizio.
    Parti con lo scrivere una funzione (IsQuadrato()) che riceve in input un int e restituisce 1 se è il quadrato di un numero intero, 0 altrimenti. La scrivi e poi la provi passandole diversi valori.
  • Re: Puntatori e liste

    Scusami non ho capito bene, io dico che se è un quadrato perfetto (ovvero quando trovato==1) il mio contatore c deve aumentare di uno.
  • Re: Puntatori e liste

    Ti sto dicendo di fare un passo indietro e fare SOLO una funzione che ti dice se il valore passato come parametro è il quadrato di un intero oppure no.
    Lascia stare il conteggio; costruisciti prima il "mattoncino".

    Dopo che avrai scritto una funzione che fa questo lavoro, per es.:
    IsQuadrato(4) => 1
    IsQuadrato(3) => 0
    IsQuadrato(49) => 1

    scriverai una funzione che scorre tutta la tua struttura semplicemente stampando a video il valore corrente
    while( p )
    {
      printf( "%d\n", p->inf );
       ...
    }
    
    Qui probabilmente ti accorgerai dell'errore che hai commesso...

    Poi stamperai anche se il valore è o no un quadrato
    while( p )
    {
      printf( "%d isquadrato=%d\n", p->inf, IsQuadrato(p->inf) );
       ...
    }
    
    e infine aggiungerai il conteggio che sarà a questo punto un gioco da ragazzi
  • Re: Puntatori e liste

    Ho trovato il mio errore, grazie lo stesso.. avevo dimenticato a far scorrere il puntatore.. p=p->succ;
  • Re: Puntatori e liste

    Bene, ora che hai risolto posso anche proporti una versione alternativa:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    struct elemento
    {
        int inf;
        struct elemento *succ;
    };
    
    struct elemento * creaLista();
    int quadPerfect (struct elemento *);
    struct elemento * ins_in_coda(struct elemento * lista, struct elemento * new_el);
    /* funzione che restituisce 1 se "num" e' un quadrato perfetto, 0 altrimenti */
    int isQuad(int num);
    
    int main(void)
    {
        struct elemento *puntLista;
        puntLista=creaLista();
        printf("CHECK\n");
        printf("\nCi sono %d quadrati perfetti", quadPerfect(puntLista));
    
        return 0;
    }
    
    int isQuad(int num)
    {
        double radice = sqrt(num);
        if(radice == (int) radice)
            return 1;
        return 0;
    }
    
    int quadPerfect(struct elemento *p)
    {
        if(p == NULL)
            return 0;
    
        int count=0;
        while(p != NULL)
        {
            if(isQuad(p->inf) == 1)
            {
                count++;
                printf("%d\n", p->inf);
            }
            p = p->succ;
        }
    
        return count;
    }
    
    struct elemento * ins_in_coda(struct elemento * lista, struct elemento * new_el)
    {
        if(lista == NULL)
            return new_el;
    
        struct elemento * aux = lista;
        while(aux->succ != NULL)
            aux = aux->succ;
    
        aux->succ = new_el;
        return lista;
    };
    
    struct elemento * creaLista()
    {
        struct elemento * lista = NULL;
        int i;
        for(i=0; i<100; i++)
        {
            struct elemento * new_el = (struct elemento *) malloc(sizeof(struct elemento));
            new_el->inf = i+1;
            new_el->succ = NULL;
            lista = ins_in_coda(lista, new_el);
        }
    
        return lista;
    };
    
Devi accedere o registrarti per scrivere nel forum
5 risposte