[Algoritmi] Puntatore di una lista semplicemente collegata
Buonasera a tutti, ho il seguente dubbio relativo alle liste semplicemente collegate:
per aggiungere un elemento in fondo alla lista la tipica procedura è quella di creare un nodo y, copiare la testa della lista ad y ( y=l.head) e poi scorrere mano a mano y (y=y.next) finchè non troviamo che il campo next di un nodo è nullo. A quel punto faremo y.next=nuovoNodo. Ma mi chiedo, quando io faccio ad esempio y=l.head, essenzialmente y ed l.head hanno due locazioni di memoria differenti giusto?
Se io faccio ora y.next=nodo2, ora anche il campo next di l.head è cambiato? Se si, perchè? y e l.head non sono due oggetti diversi? Probabilmente mi sto confondendo con il discorso puntatori..
Grazie in anticipo
per aggiungere un elemento in fondo alla lista la tipica procedura è quella di creare un nodo y, copiare la testa della lista ad y ( y=l.head) e poi scorrere mano a mano y (y=y.next) finchè non troviamo che il campo next di un nodo è nullo. A quel punto faremo y.next=nuovoNodo. Ma mi chiedo, quando io faccio ad esempio y=l.head, essenzialmente y ed l.head hanno due locazioni di memoria differenti giusto?
Se io faccio ora y.next=nodo2, ora anche il campo next di l.head è cambiato? Se si, perchè? y e l.head non sono due oggetti diversi? Probabilmente mi sto confondendo con il discorso puntatori..
Grazie in anticipo
Risposte
Devi mostrare il codice. Mi sembra chiaro che quel y = l.head non sia una copia e che y e l.head facciano alla fine riferimento allo stesso oggetto. A seconda del linguaggio scelto (e dello pseudocodice usato) l'assegnamento può avere un significato diverso.

In questo caso quando faccio y=y.next.. y diventa una copia di y.next , ma se io modifico successivamente y, modifico anche quello che prima era y.next? Perché essenzialmente sono due nodi diversi ..questo mi chiedo
Quello è uno pseudocodice quindi va un po' interpretato. Affinché l'algoritmo funzioni y deve essere passato per riferimento/puntatore e non per valore.
Mi rendo conto che avendo visto solo il C (o C++), questo discorso potrebbe sembrarti alieno. Ma esistono diversi tipi di assegnamento che possono venire usati in un linguaggio di programmazione o uno pseudocodice. In C tutto viene passato per copia. I byte del valore alla destra dell'uguale vengono quindi copiati nella variabile alla sinistra. I puntatori sono la soluzione del linguaggio per poter fare riferimento ad una variabile in modo indiretto. Se insomma vuoi fare riferimento ad una variabile devi passare dal suo indirizzo in modo esplicito. In altri linguaggi non è così. In Java ad esempio l'assegnamento avviene per copia solo nel caso di tipi primitivi. Per le classi l'assegnamento avviene per riferimento. Lavori cioè sempre con una specie di puntatore. In python il comportamento è ancora diverso. Per poter capire un frammento di codice in un linguaggio o pseudolinguaggio è insomma importante comprendere la sua semantica.
In questo caso è tuttavia abbastanza evidente. Se osservi la prima riga del codice vedi che l.head viene confrontato con NIL (in C sarebbe NULL) per cui l.head è un "puntatore" (o qualcosa di simile). Anche y è quindi un "puntatore" nonostante venga usato il punto per accedere alla variabile membro. In C dovresti insomma usare y->next ma è solo una differenza stilistica.
P.S. Tecnicamente in C++ è possibile ridefinire in che modo l'assegnamento debba funzionare per uno specifico tipo ma in questo caso il discorso può farsi incredibilmente più complicato.
In questo caso è tuttavia abbastanza evidente. Se osservi la prima riga del codice vedi che l.head viene confrontato con NIL (in C sarebbe NULL) per cui l.head è un "puntatore" (o qualcosa di simile). Anche y è quindi un "puntatore" nonostante venga usato il punto per accedere alla variabile membro. In C dovresti insomma usare y->next ma è solo una differenza stilistica.
P.S. Tecnicamente in C++ è possibile ridefinire in che modo l'assegnamento debba funzionare per uno specifico tipo ma in questo caso il discorso può farsi incredibilmente più complicato.
Ringrazio a tutti per le risposte. Ciò che non tenevo in conto è che in java ogni variabile è un puntatore... ed in tal caso y puntava alla stessa locazione di memoria di y.next
Inviato dal mio ASUS_Z008D utilizzando Tapatalk
Inviato dal mio ASUS_Z008D utilizzando Tapatalk