81 lines
1.4 KiB
Text
81 lines
1.4 KiB
Text
// Rosetta Code problem: http://rosettacode.org/wiki/Doubly-linked_list/Element_insertion & removal & traverse
|
|
// by Galileo, 02/2022
|
|
|
|
FIL = 1 : DATO = 2 : LPREV = 3 : LNEXT = 4
|
|
countNodes = 0 : Nodes = 10
|
|
|
|
dim list(Nodes, 4)
|
|
|
|
list(0, LNEXT) = 1
|
|
|
|
|
|
sub searchNode(node)
|
|
local i, Node
|
|
|
|
for i = 0 to node-1
|
|
Node = list(Node, LNEXT)
|
|
next
|
|
return Node
|
|
end sub
|
|
|
|
sub insertNode(node, newNode)
|
|
local Node, i
|
|
|
|
if not countNodes node = 2
|
|
|
|
for i = 1 to Nodes
|
|
if not list(i, FIL) break
|
|
next
|
|
list(i, FIL) = true
|
|
list(i, DATO) = newNode
|
|
|
|
Node = searchNode(node)
|
|
|
|
list(i, LPREV) = list(Node, LPREV) : list(list(i, LPREV), LNEXT) = i
|
|
if i <> Node list(i, LNEXT) = Node : list(Node, LPREV) = i
|
|
|
|
countNodes = countNodes + 1
|
|
if countNodes = Nodes then Nodes = Nodes + 10 : redim list(Nodes, 4) : end if
|
|
end sub
|
|
|
|
|
|
sub removeNode(n)
|
|
local Node
|
|
|
|
Node = searchNode(n)
|
|
list(list(Node, LPREV), LNEXT) = list(Node, LNEXT)
|
|
list(list(Node, LNEXT), LPREV) = list(Node, LPREV)
|
|
list(Node, LNEXT) = 0 : list(Node, LPREV) = 0
|
|
list(Node, FIL) = false
|
|
countNodes = countNodes - 1
|
|
end sub
|
|
|
|
|
|
sub printNode(node)
|
|
local Node
|
|
|
|
Node = searchNode(node)
|
|
print list(Node, DATO);
|
|
print
|
|
end sub
|
|
|
|
|
|
sub traverseList()
|
|
local i
|
|
|
|
for i = 1 to countNodes
|
|
printNode(i)
|
|
next
|
|
end sub
|
|
|
|
|
|
insertNode(1, 1000)
|
|
insertNode(2, 2000)
|
|
insertNode(2, 3000)
|
|
|
|
traverseList()
|
|
|
|
removeNode(2)
|
|
|
|
print
|
|
traverseList()
|