Differenze tra le versioni di "Emulare una 'Lista Lineare' mediante una Struttura di testa ed i Puntatori"

Da Gambas-it.org - Wikipedia.
Riga 24: Riga 24:
 
   Dim st As STRUTTURA
 
   Dim st As STRUTTURA
 
   Dim i As Integer
 
   Dim i As Integer
 +
 
 +
<FONT Color=gray>' ''Crea il primo 'elemento-Struttura' della "Lista Lineare":''</font>
 +
  st = New STRUTTURA
 
    
 
    
   st = Crea_Lista()
+
<FONT Color=gray>' ''Va a creare i restanti elementi della "Lista Lineare":''</font>
 +
   Crea_Lista(st)
 
    
 
    
 
   Visualizza_Dati(st)
 
   Visualizza_Dati(st)
Riga 34: Riga 38:
 
   
 
   
 
   
 
   
  '''Private''' Function Crea_Lista() As STRUTTURA
+
  '''Private''' Function Crea_Lista(nw As STRUTTURA)  <FONT Color=gray>' ''Passaggio della Struttura per "Indirizzo"''</font>
 
    
 
    
   Dim nw, sr As STRUTTURA
+
   Dim sr As STRUTTURA
  Dim p As Pointer
 
 
   Dim b As Byte
 
   Dim b As Byte
 
      
 
      
  <FONT Color=gray>' ''Crea la prima 'Struttura' della "Lista Lineare":''</font>
+
  <FONT Color=gray>' ''Immette il dato del primo elemento-Struttura della lista:''</font>
  nw = New STRUTTURA
+
   nw.i = 100
 
 
<FONT Color=gray>' ''Viene impostato il valore del membro di tipo 'Intero' della prima 'Struttura' (ossia la primo elemento "Lista Lineare"):''</font>
 
  Print "Immettere dato del 1° elemento/Struttura della 'Lista Lineare':"
 
   nw = Immette_Valore(nw)
 
 
    
 
    
 
  <FONT Color=gray>' ''Alloca un'area di memoria riservata per il nuovo (il secondo) elemento della "Lista Lineare":''</font>
 
  <FONT Color=gray>' ''Alloca un'area di memoria riservata per il nuovo (il secondo) elemento della "Lista Lineare":''</font>
Riga 51: Riga 50:
 
   sr = nw
 
   sr = nw
 
    
 
    
  <FONT Color=gray>' ''Creiamo una catena di altri 3 elementi/Strutture, in modo tale che''
+
  <FONT Color=gray>' ''Creiamo una catena di altri 9 elementi/Strutture, in modo tale che la "Lista Lineare" sarà formata in totale da 10 elementi/Strutture":''</font>
' ''la "Lista Lineare" sarà formata in totale da 4 elementi/Strutture:''</font>
+
   For b = 2 To 10
   For b = 2 To 4
+
<FONT Color=gray>' ''Alloca un'area di memoria riservata per il nuovo-successivo elemento della "Lista Lineare":''</font>
 
     sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
 
     sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
 
     sr = sr.p
 
     sr = sr.p
    Print "Immettere il dato del "; b; "° elemento/Struttura:"
+
<FONT Color=gray>' ''Immette i dati dei successivi elementi-Struttura della lista:''</font>
     sr = Immette_Valore(sr)
+
     sr.i = 100 * b
 
   Next
 
   Next
 +
 
 
   sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
 
   sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
 
   sr = sr.p
 
   sr = sr.p
 
 
  Return nw
 
 
    
 
    
 
  '''End'''
 
  '''End'''
 
   
 
   
+
    
'''Private''' Function Immette_Valore(ra As STRUTTURA) As STRUTTURA
 
   
 
   Dim s As String
 
 
 
  Input s
 
  If IsDigit(s) = False Then Error.Raise("Il valore immesso non è un numero !")
 
  ra.i = Val(s)
 
   
 
  Return ra
 
   
 
'''End'''
 
 
 
 
  '''Private''' Procedure Visualizza_Dati(tt As STRUTTURA)
 
  '''Private''' Procedure Visualizza_Dati(tt As STRUTTURA)
 
    
 
    
 
   Dim po As Pointer
 
   Dim po As Pointer
 
    
 
    
   Print "\n\nValori inseriti nella 'Lista Lineare':\n"
+
   Print "\nValori inseriti nella 'Lista Lineare':\n"
 
    
 
    
 
   While tt.p > 0
 
   While tt.p > 0

Versione delle 13:17, 3 apr 2017

Nel linguaggio C una "Lista Lineare" (Linked List) è una serie ordinata e concatenata di Strutture omogenee che occupano posizioni di memoria non necessariamente consecutive.

L'ultimo membro di ciascuna Struttura, o elemento della Lista, è un Puntatore alla Struttura successiva. In questo senso la Lista concatenata è formata - appunto - da una concatenazione di Strutture, ove ciascuna Struttura fa riferimento ad un'altra Struttura. Se si è giunti all'ultimo elemento (Struttura) della Lista Lineare, il suo Puntatore è nullo (non punta ad alcunché).

Nella sostanza le Linked List sono particolari Strutture, che si collegano fra loro come una sorta di catena e che servono a memorizzare in modo dinamico una grande quantità non predefinita di dati.

Questo genere di Strutture si usa, quando non si conosce a priori quanti dati dovranno essere memorizzati; ed allora viene occupata memoria poco per volta, quando serve. Il primo dato viene "rintracciato" da un puntatore, che punta alla prima struttura. Dentro la prima struttura, oltre ai dati rilevanti, c'è - come ultimo suo membro - un Puntatore alla Struttura successiva, e così via a catena.


Va precisato che le "Liste Lineari" (Linked List) attualmente non sono esattamente riproducibili nel linguaggio Gambas. Possiamo, però, riprodurre in Gambas il loro comportamento e funzionamento 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 secondo 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
  
' Alloca un'area di memoria riservata per il nuovo (il secondo) elemento della "Lista Lineare":
  nw.p = Alloc(Object.SizeOf(STRUTTURA), 1)
  sr = nw
  
' Creiamo 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
' Alloca un'area di memoria riservata per il nuovo-successivo elemento della "Lista Lineare":
    sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
    sr = sr.p
' Immette i dati dei successivi elementi-Struttura della lista:
    sr.i = 100 * b
  Next
  
  sr.p = Alloc(Object.SizeOf(STRUTTURA), 1)
  sr = sr.p
  
End

 
Private Procedure Visualizza_Dati(tt As STRUTTURA)
 
 Dim po As Pointer
 
  Print "\nValori inseriti nella 'Lista Lineare':\n"
  
  While tt.p > 0
    Print tt.i
    po = tt.p
    tt = tt.p
    Free(po)
  Wend
  
End