Emulare una 'Lista Lineare' mediante una Struttura di testa ed i Puntatori

Da Gambas-it.org - Wikipedia.

In Gambas è possibile riprodurre il comportamento e il funzionamento di una "Lista Lineare" mediante una variabile del tipo della Struttura modello, posta alla testa della Lista concatenata, della quale ci si servirà in modo particolare del suo ultimo membro di tipo Puntatore, che punta all'area di memoria, opportunamente ed preventivamente riservata, che ospiterà la Struttura/elemento successiva, appartenente alla Lista Lineare.

Mostriamo un semplice esempio:

' Impostiamo la "Struttura" modello, molto semplice, che rappresenterà il primo elemento della "Lista Lineare" concatenata, ed ove...
Public Struct STRUTTURA
  i As Integer
' ...l'ultimo membro è un "Puntatore" che servirà a creare e connettere questa Struttura al successivo elemento della "Lista Lineare":
  p As Pointer
End Struct


Public Sub Main()
 
 Dim st As STRUTTURA
 Dim i As Integer
 
' Crea il primo 'elemento-Struttura' della "Lista Lineare":
 st = New STRUTTURA
  
' Va a creare i restanti elementi della "Lista Lineare":
 Crea_Lista(st)
  
 Visualizza_Dati(st)
  
 Free(st.p)
  
End

Private Function Crea_Lista(nw As STRUTTURA)   ' Passaggio della Struttura per "Indirizzo"
 
 Dim sr As STRUTTURA
 Dim b As Byte
   
' Immette il dato del primo elemento-Struttura della lista:
 nw.i = 100
     
 sr = nw
  
' Alloca un'area di memoria riservata per il secondo elemento della "Lista Lineare":
 sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
  
' Crea una catena di altri 9 elementi/Strutture, in modo tale che la "Lista Lineare" sarà formata in totale da 10 elementi/Strutture":
 For b = 2 To 10
   sr = sr.p
' Immette i dati dei successivi elementi-Struttura della lista:
   sr.i = 100 * b
' Alloca un'area di memoria riservata per il nuovo-successivo elemento della "Lista Lineare":
   sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
 Next
     
End
  
Private Procedure Visualizza_Dati(tt As STRUTTURA)
  
 Print "\nValori inseriti nella 'Lista Lineare':\n"
  
 While tt.p > 0
   Print tt.i
   tt = tt.p
   Free(tt.p)
 Wend
  
End


Altra modalità:

Public Struct LISTA
  sh As Short
  i As Integer
  succ As Pointer
End Struct


Public Sub Main()
 
 Dim lst, lst2 As New LISTA
 
 CreaStruttura(lst, 4)
 
 lst2 = lst
 
 While lst.succ > 0
   Print lst.sh, lst.i
   lst = lst.succ
 Wend
 
 Dealloca(lst2)
 
End

Private Function CreaStruttura(sl As LISTA, c As Short)
 
 Dim n As Short
 
 For n = 1 To c
   sl.sh = n * c
   sl.i = n * c * 1000
   If n <= c Then
     sl.succ = Alloc(Object.SizeOf(sl), 1)
     sl = sl.succ
   Endif
   sl.succ = 0
 Next
 
End

Private Procedure Dealloca(sl As ListA)
 
 While sl.succ > 0
   Free(sl.succ)
   sl = sl.succ
 Wend
 
End