Inserimento coppie elementi in lista semplice

di il
3 risposte

Inserimento coppie elementi in lista semplice

Ciao a tutti,
vorrei chiedere il vostro aiuto su un esercizio che mi crea moltissime difficoltà perché non so bene come lavorare con le liste (vorrei farlo con gli arrey ma non posso).
In pratica, il programma deve riconoscere se un numero è somma di quadrati e in quel caso calcolare tutte le possibili coppie a,b tali che
a^2+b^2=n (es. 25= 5^2+0^2= 3^2+4^2)
, se non è esprimibile come somma di quadrai deve restituire la lista vuota. Il problema non è calcolare le coppie, ma inserirle correttamente nella lista.
Abbiate pazienza e pietà per la mia ignoranza! Graie a chiunque vorrà rispondere
Ecco il testo, posso modificare unicamente la funzione listOfPairs allPairsOfSquares(int n) (Scusate ho modificato, mi sono accorta di un po' di orrori):

void allPairsOfSquares(int n)
{
    int a = 0;
    int b;
    while(a*a <= n)
    {
        b = 0;
        while(b <= a)
        {
            if(a * a + b * b == n)
            {
                printf("%d - %d\n", a, b);
            
                b++;
            
        }
        a++;
    }
}

3 Risposte

  • Re: Inserimento coppie elementi in lista semplice

    Ciao

    Alcune considerazioni:
    - da #include "listOfPairs.h" presumo che tu abbia diviso il programma in più file, ma una volta che metti tutto in un unico file allora le funzioni devono stare prima del main (a meno che tu non le dichiari prima utilizzando dei prototipi);
    - per quanto riguarda la funzione printLP non c'è bisogno di utilizzare un altro puntatore a nodo (mi riferisco a Lcurr), in quanto l'argomento della funzione è passato per copia e quindi ogni sua modifica non avrà alcun effetto sulla variabile L del main.

    Per quanto riguarda la ricerca delle coppie:
    - a cosa serve la variabile cont?
    - mettiamo da parte un momento l'argomento lista e semplifichiamo la funzione nel seguente modo:
    void allPairsOfSquares(int n)
    {
        int a = 0;
        int b;
        while(a <= n / 2)
        {
            b = 0;
            while(b <= a)
            {
                if(a * a + b * b == n)
                {
                    printf("%d - %d\n", a, b);
                }
                else
                {
                    b++;
                }
            }
            a++;
        }
    }
    prova a lanciarla per esempio per n=25 e guarda cosa succede. Capirai che quel b++ dovrebbe stare all'esterno dell'else;
    - per quanto riguarda la condizione del while più esterno dovrebbe essere a<=n*n. Per esempio per n=25 non ha senso provare fino ad a=n/2=12 visto che già 6*6>n. In teoria la ricerca delle coppie potrebbe essere ottimizzata ulteriormente, ma già così può andar bene.

    Veniamo adesso alla questione lista.
    Sai cos'è una lista e come funziona? Sai cosa significa aggiungere elementi in testa o in coda ad una lista?
    In ogni caso cito Wikipedia:
    In informatica, una lista concatenata (o linked list) è una struttura dati dinamica, tra quelle fondamentali usate nella programmazione. Consiste di una sequenza di nodi, ognuno contenente campi di dati arbitrari ed uno o due riferimenti ("link") che puntano al nodo successivo e/o precedente. Una lista concatenata è un tipo di dato auto-referente, in quanto contiene un puntatore ad un altro dato dello stesso tipo. Le liste concatenate permettono l'inserzione e la rimozione di nodi in ogni punto della lista in tempo costante, ma non permettono l'accesso casuale, solo quello sequenziale. Esistono diversi tipi di liste concatenate: liste concatenate semplici, liste concatenate doppie e liste circolari.
    Di seguito lo schema di una lista semplicemente concatenata:
    https://www.geeksforgeeks.org/wp-content/uploads/gq/2013/03/Linkedlist.png
    Una volta che avrai approfondito un po' l'argomento rifletti sulla seguente domanda:
    - nella funzione printLP, cosa significa precisamente while(Lcurr)?

    Se hai qualche dubbio chiedi pure.
  • Re: Inserimento coppie elementi in lista semplice

    Grazie mille per la tua risposta Nippolo, sei stato molto chiaro.
    Sistemato l'ordine delle funzioni (problema di copia incolla), eliminato l'else, migliorato il while esterno (credo intendessi a*a<=n ).
    per quanto riguarda il while (Lcurr) lo intendo come "esegui stampa e passaggio al successivo finché esiste Lcurr (in pratica un while (1). La funzione printLP è stata fatta dal professore,quando vuoi ne parliamo!!).
    Sperando che possa servire a qualcuno in futuro ho modificato il post iniziale con la funzione corretta.
    Grazie ancora per il prezioso aiuto.
    A presto!
  • Re: Inserimento coppie elementi in lista semplice

    Mi fa piacere esserti stato d'aiuto.

    Perchè hai sostituito il codice nel post iniziale con l'esempio da me postato per farti notare che b++ andasse fuori dall'else?!
    Senza il codice completo diventa difficile aiutarti!
    per quanto riguarda il while (Lcurr) lo intendo come "esegui stampa e passaggio al successivo finché esiste Lcurr (in pratica un while (1.)
    Il ciclo while(Lcurr) si fermerà quando la condizione sarà falsa e non quando Lcurr non esisterà più... la variabile puntatore Lcurr dichiarata nella funzione printLP() smetterà di esistere solo all'uscita della funzione.
    Quindi la domanda è: che valore deve assumere Lcurr affinché la sudetta condizione risulti falsa e quindi il ciclo si interrompa?
    (La risposta è nell'immagine che ti ho linkato nel post precedente).

    Ti ripeto alcune domande che ti avevo fatto nell'altro post:
    Sai cos'è una lista e come funziona? Sai cosa significa aggiungere elementi in testa o in coda ad una lista?
    Sapresti scrivere un semplice programmino che crei una lista con i numeri da 1 a n?
Devi accedere o registrarti per scrivere nel forum
3 risposte