Dubbio sulle liste

di il
10 risposte

Dubbio sulle liste

Buon pomeriggio a tutti , ho un dubbio che riguarda le amatissime liste
Premetto che l'argomento finalmente mi è chiaro (ci ho sbattuto abbastanza haha).
Coomunque so che ogni funzione di tipo struct nodo restituisce sempre il puntatore alla lista (cioè il puntatore al primo nodo della stessa (?)).
Quando però eseguo una funzione di tipo void che stampa tutta la lista , per fare ciò è necessario far avanzare il puntatore al primo nodo fino a che non diventerà NULL. Un volta eseguita la funzione stampa , il puntatore sarà alla fine della lista, quindi come farò ad accedere alla stessa dall'inizio?
E' abbastanza contorta come spiegazione. Faccio un esempio:

list è il puntatore della lista.
Quando eseguo la funzione void stampa(list) faremo avanzare list (stampando nel frattempo i valori dei nodi) fino a quando list==NULL. A quel punto list sarà alla fine della lista? Quale sarà allora il puntatore all'inizio?

Grazie a chi ,una volta decodificato il messaggio, riuscirà a rispondere

10 Risposte

  • Re: Dubbio sulle liste

    Alla fine list NON SI TROVA alla fine della lista, MA VALE PROPRIO NULL.

    Immagina che ilist abbia, come valore, il numero civico di una casa di una via mooolto lunga (prova a STAMPARE il valore di ilist).
    Nella cassetta dela posta di ogni casa c'e' il numero civico della PROSSIMA casa da visitare.
    L'ultima casa, che DEVE indicarti quale e' il prossimo numero civico, che valore usa? Guardati la definizione di NULL!


    Come fare? BANALE!

    RAGIONA!

    Se list, che all'inizio PUNTA alla testa della lista, e TU lo modifichi, per mantenere il PUNTATORE alla testa della lista COME PUOI FARE?

    Praticamente OVVIO!
  • Re: Dubbio sulle liste

    migliorabile ha scritto:


    L'ultima casa, che DEVE indicarti quale e' il prossimo numero civico, che valore usa?
    NULL?

    migliorabile ha scritto:


    Se list, che all'inizio PUNTA alla testa della lista, e TU lo modifichi, per mantenere il PUNTATORE alla testa della lista COME PUOI FARE?
    Definisco un altro puntatore = list prima dell'avanzamento?
  • Re: Dubbio sulle liste

    Se un puntatore è uguale a NULL significa che sta puntando nulla?
    Nel caso in cui facessi avanzare il puntatore alla testa iniziale (list) alla fine quale sarà il nuovo puntatore alla testa?
  • Re: Dubbio sulle liste

    Dai, e' un COMPUTER, puo' un puntatore puntare al NULLA?
    Non siamo in un film di fantascienza!

    RAGIONA!

    1) Che cosa e', strutturalmente/alla fin fine, un puntatore? Questo LO DEVI aver capito, e comunque LO DEVI capire perche' se non ti e' chiaro questo punto, il resto e' anche peggio! In altri termini, non ne esci!
    2) Quando vale il puntatore che HA COME valore NULL?
    3) Se il puntatore e' quella cosa definita in 1), il valore NULL che cosa sarebbe?

    E poi, scusa, non e' che NULL sia una cosa miracolosa! E' una macro, definita in qualche file (scopri quale) che ha un ben specifico valore!
    Scoperto questo, dovresti aver capitol il 90% delle cose da capire sui puntatori!

    Nota: non ti do le risposte per il semplice motivo che sono banalissime ed e' meglio che ci arrivi da solo: e' robba da 5 minuti al massimo!
  • Re: Dubbio sulle liste

    migliorabile ha scritto:


    Dai, e' un COMPUTER, puo' un puntatore puntare al NULLA?
    Ho scritto una cavolata, chiedo venia!

    migliorabile ha scritto:


    1) Che cosa e', strutturalmente/alla fin fine, un puntatore?
    Un puntatore dovrebbe essere un indirizzo di memoria.

    migliorabile ha scritto:


    2) Quando vale il puntatore che HA COME valore NULL?
    Cioè?

    migliorabile ha scritto:


    3) Se il puntatore e' quella cosa definita in 1), il valore NULL che cosa sarebbe?
    0 (?)
  • Re: Dubbio sulle liste

    Sectioaurea3 ha scritto:


    Nel caso in cui facessi avanzare il puntatore alla testa iniziale (list) alla fine quale sarà il nuovo puntatore alla testa?
    Provo a rispondere alla mia domanda. L'avanzamento del puntatore list nella funzione stampa non è altro che il cambiamento della variabile puntatore del nodo successivo (cioè del nome del puntatore). Quindi alla fine il puntatore list corrisponderà a NULL. Mentre il puntatore alla testa della lista non si chiamerà più list e non avrà un "nome" fino a quando non lo definiremo noi. Ho sparato cavolate?
  • Re: Dubbio sulle liste

    Esatto, un puntatore e' un indirizzo di memoria, e 0 e' un plausibilmente valido indirizzo di memoria, ma POICHE' all'indirizzo 0 c'e' la rom, non ci puoi andare a scrivere, e quindi, per convenzione, viene usato come valore SPECIALE per indicare che il puntatore non punta a nulla.

    Nessunto ti impedisce di usare un'altro valore, ad esempio 0xFFFFFFFFFFFFFFFF, cioe' l'altro estremo della memoria accessibile da un processo (per i 64bit, 2^64-1, per i 32bit, 2^32-1).
    E poiche' il tuo pc di sicuro non ha installata tutta quella ram, sei certo che il tuo puntatore NON PUNTA ad una cella di memoria valida.

    Quindi, in definitiva, non e' vero che non punta a nulla! Punta alla cella di memoria con indirizzo 0!

    In certi software si sfrutta il fatto che non puoi andare a scrivere nei primi 65536 byte e quindi si utilizza il puntatore con questi valori per fare altro.

    Infine se tu usi il puntatore per scandire la lista, BANALMENTE ti tieni una copia del puntatore alla TESTA della lista
  • Re: Dubbio sulle liste

    migliorabile ha scritto:


    Esatto, un puntatore e' un indirizzo di memoria, e 0 e' un plausibilmente valido indirizzo di memoria, ma POICHE' all'indirizzo 0 c'e' la rom, non ci puoi andare a scrivere, e quindi, per convenzione, viene usato come valore SPECIALE per indicare che il puntatore non punta a nulla.è
    Grazie per la spiegazione!!

    migliorabile ha scritto:


    Infine se tu usi il puntatore per scandire la lista, BANALMENTE ti tieni una copia del puntatore alla TESTA della lista
    Ma se ad esempio non tenessi una copia del puntatore testa e avanzassi lungo tutta la lista il puntatore alla testa praticamente diventerebbe "senza nome"?

    Esempio:
    list è il puntatore alla testa della lista.
    Eseguo stampa(list) (di tipo void) dove list avanzerà lungo tutta la lista.
    Alla fine list==NULL. Una volta terminata l'esecuzione di stampa(list) richiamo, ad esempio, cancella(list,x) che cancella nella lista il valore x. Questa funzione però ha come input proprio list che in questo caso non punterà più la testa della lista. Come mai non da errore?
  • Re: Dubbio sulle liste

    Quest frase ... il puntatore alla testa praticamente diventerebbe "senza nome" non vuol dire nulla!

    1) un puntatore e' un indirizzo di memoria
    2) una variabile e' una scatolina che contiene un valore
    3) questo valore puo' essere un numero intero (chort, int, long), un numero con la virgola (float, double) OPPURE (a seconda del tipo della variabile) un indirizzo di memoria (void*, int*, float*, pincopallino*,...)

    Se tu modifichi il VALORE della variabile (quindi il CONTENUTO della scatolina), NON E' che il puntatore alla testa della lista PERDE il nome, perche' il nome e' assegnato alla scatolina, NON all'indirizzo di memoria della testa (o di qualunque nodo) della lista!
  • Re: Dubbio sulle liste

    migliorabile ha scritto:


    Se tu modifichi il VALORE della variabile (quindi il CONTENUTO della scatolina), NON E' che il puntatore alla testa della lista PERDE il nome, perche' il nome e' assegnato alla scatolina, NON all'indirizzo di memoria della testa (o di qualunque nodo) della lista!
    Ok,credo di aver capito..
    Hai visto il mio ultimo esempio? Perchè non dà errore se alla fine list?
Devi accedere o registrarti per scrivere nel forum
10 risposte