Differenze tra le versioni di "Emulare una 'Lista Lineare' mediante una Struttura di testa ed i Puntatori"
Da Gambas-it.org - Wikipedia.
(6 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | + | 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: | Mostriamo un semplice esempio: | ||
Riga 26: | Riga 16: | ||
<FONT Color=gray>' ''Crea il primo 'elemento-Struttura' della "Lista Lineare":''</font> | <FONT Color=gray>' ''Crea il primo 'elemento-Struttura' della "Lista Lineare":''</font> | ||
− | + | st = New STRUTTURA | |
<FONT Color=gray>' ''Va a creare i restanti elementi della "Lista Lineare":''</font> | <FONT Color=gray>' ''Va a creare i restanti elementi della "Lista Lineare":''</font> | ||
− | + | Crea_Lista(st) | |
− | + | Visualizza_Dati(st) | |
− | + | Free(st.p) | |
'''End''' | '''End''' | ||
− | |||
'''Private''' Function Crea_Lista(nw As STRUTTURA) <FONT Color=gray>' ''Passaggio della Struttura per "Indirizzo"''</font> | '''Private''' Function Crea_Lista(nw As STRUTTURA) <FONT Color=gray>' ''Passaggio della Struttura per "Indirizzo"''</font> | ||
Riga 44: | Riga 33: | ||
<FONT Color=gray>' ''Immette il dato del primo elemento-Struttura della lista:''</font> | <FONT Color=gray>' ''Immette il dato del primo elemento-Struttura della lista:''</font> | ||
− | + | nw.i = 100 | |
− | + | sr = nw | |
<FONT Color=gray>' ''Alloca un'area di memoria riservata per il secondo elemento della "Lista Lineare":''</font> | <FONT Color=gray>' ''Alloca un'area di memoria riservata per il secondo elemento della "Lista Lineare":''</font> | ||
− | + | sr.p = Alloc(Object.SizeOf(STRUTTURA), 1) | |
<FONT Color=gray>' ''Crea una catena di altri 9 elementi/Strutture, in modo tale che la "Lista Lineare" sarà formata in totale da 10 elementi/Strutture":''</font> | <FONT Color=gray>' ''Crea una catena di altri 9 elementi/Strutture, in modo tale che la "Lista Lineare" sarà formata in totale da 10 elementi/Strutture":''</font> | ||
− | + | For b = 2 To 10 | |
− | + | sr = sr.p | |
<FONT Color=gray>' ''Immette i dati dei successivi elementi-Struttura della lista:''</font> | <FONT Color=gray>' ''Immette i dati dei successivi elementi-Struttura della lista:''</font> | ||
− | + | sr.i = 100 * b | |
<FONT Color=gray>' ''Alloca un'area di memoria riservata per il nuovo-successivo elemento della "Lista Lineare":''</font> | <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) | |
− | + | Next | |
'''End''' | '''End''' | ||
− | + | ||
− | |||
'''Private''' Procedure Visualizza_Dati(tt As STRUTTURA) | '''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''' | '''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''' |
Versione delle 17:16, 10 nov 2021
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