Files
prog8/examples/pointers/sortedlist.p8
2025-08-18 23:36:35 +02:00

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
}
}