Emulare una Lista Lineare mediante i soli Puntatori

Da Gambas-it.org - Wikipedia.

E' possibile emulare in Gambas il loro comportamento e funzionamento delle "Liste Lineari" (Linked List) anche mediante le sole variabili di tipo Puntatore.

Mostriamo un esempio commentato:

' Impostiamo la "Struttura" modello: ci servirà soltanto per definire la dimensione delle aree di memoria da allocare, ciascuna delle quali rappresenterà un elemento della "Lista Lineare" concatenata:
Public Struct STRUTTURA
  b As Byte
  s As Short
  i As Integer
' L'ultimo membro della Struttura modello nelle "Linked List" è rappresentato da un "Puntatore",
' il quale serve - come si sa - a creare e connettere un elemento della "Lista Lineare" a quello successivo:
  p As Pointer
End Struct


Public Sub Main()
 
 Dim p, prm As Pointer
 Dim i As Integer
 Dim st As Stream
    
' Alloca un'area di memoria riservata per il primo elemento della "Lista Lineare":
  p = Alloc(Object.SizeOf(STRUTTURA))
  prm = p
          
  For i = 1 To 4
     
    st = Memory p For Write
' Scrive nell'area riservata, puntata dal Puntatore, il primo valore (in questo caso è di tipo Byte):
    Write #st, 11 * i As Byte
' Nel rispetto delle norme dell'allineamento effettua uno spostamento in avanti dell'indice nell'area riservata puntata dal Puntatore:
    Seek #st, 2
' Scrive nell'area riservata, puntata dal Puntatore, il secondo valore (in questo caso è di tipo Short):
    Write #st, 1111 * i As Short
' Scrive nell'area riservata, puntata dal Puntatore, il terzo valore (in questo caso è di tipo Integer):
    Write #st, 111111 * i As Integer
    If i < 4 Then
' Alloca un'area di memoria riservata per il nuovo elemento della "Lista Lineare":
      p = Alloc(Object.SizeOf(STRUTTURA))
' Se non si è giunti all'ultimo elemento dela Lista, scrive nell'area riservata, puntata dal Puntatore, il quarto valore 
' (in questo caso è l'indirizzo di memoria della successiva area di memoria riservata per il nuovo elemento della Lista:
      Write #st, p As Pointer
    Endif
    st.Close
   
  Next
   
  VisualizzaLista(prm)
   
End


Private Procedure VisualizzaLista(po As Pointer)
 
 Dim b As Byte
 Dim pu As Pointer
   
  For b = 1 To 4
    Print Byte@(po)
    Print Short@(po + 2)
    Print Int@(po + 4)
    pu = po
    po = Pointer@(po + 8)
' Libera la memoria precedentemente allocata:
    Free(pu)
  Next
  
End