mirror of
https://github.com/irmen/prog8.git
synced 2025-11-01 06:16:15 +00:00
93 lines
2.1 KiB
Lua
93 lines
2.1 KiB
Lua
; single linked list, that keeps the elements in ascending sorted order
|
|
|
|
%import math
|
|
%import textio
|
|
%zeropage basicsafe
|
|
|
|
main {
|
|
sub start() {
|
|
txt.print("empty list:\n")
|
|
printlist()
|
|
|
|
^^slist.Node new = arena.alloc(sizeof(slist.Node))
|
|
new.size = 500
|
|
new.letter = 'k'
|
|
slist.add(new)
|
|
txt.print("\nafter inserting 1 element:\n")
|
|
printlist()
|
|
|
|
repeat 10 {
|
|
new = arena.alloc(sizeof(slist.Node))
|
|
new.size = math.rndw() % 1000
|
|
new.letter = math.rnd() % 26 + 'a'
|
|
slist.add(new)
|
|
}
|
|
txt.print("\nafter inserting 10 more random elements:\n")
|
|
printlist()
|
|
}
|
|
|
|
sub printlist() {
|
|
ubyte count = 0
|
|
^^slist.Node n = slist.head
|
|
while n!=0 {
|
|
txt.print_uw(n.size)
|
|
txt.chrout(':')
|
|
txt.chrout(n.letter)
|
|
txt.print(", ")
|
|
count++
|
|
n = n.next
|
|
}
|
|
txt.print("\nlength=")
|
|
txt.print_ub(count)
|
|
txt.nl()
|
|
}
|
|
}
|
|
|
|
slist {
|
|
struct Node {
|
|
^^Node next
|
|
uword size
|
|
ubyte letter
|
|
}
|
|
|
|
^^Node head = 0
|
|
|
|
sub add(^^Node node) {
|
|
; insert at sorted position
|
|
node.next = 0
|
|
if head==0 {
|
|
head = node
|
|
} else {
|
|
uword size = node.size
|
|
^^Node predecessor = 0
|
|
^^Node current = head
|
|
while current!=0 {
|
|
if current.size >= size {
|
|
node.next = current
|
|
if predecessor!=0
|
|
break
|
|
else {
|
|
head = node
|
|
return
|
|
}
|
|
}
|
|
predecessor = current
|
|
current = current.next
|
|
}
|
|
predecessor.next = node
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
arena {
|
|
; extremely trivial arena allocator (that never frees)
|
|
uword buffer = memory("arena", 2000, 0)
|
|
uword next = buffer
|
|
|
|
sub alloc(ubyte size) -> uword {
|
|
defer next += size
|
|
return next
|
|
}
|
|
}
|