Files
prog8/examples/pointers/sortedlist.p8
T
Irmen de Jong 9621552056 add 'arena' allocator library
6502 targets use uword sizes with no alignment overhead; m68k/virtual use
long sizes with even-address alignment. Updated the six pointer examples that used to have their own arena implementation.
2026-09-13 05:43:57 +02:00

85 lines
1.9 KiB
Lua

; single linked list, that keeps the elements in ascending sorted order
%import math
%import textio
%import arena
%zeropage basicsafe
main {
sub start() {
arena.init(memory("arena", 2000, 0), 2000)
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
}
}
}