diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-11 21:13:29 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-11 21:13:50 +0000 |
| commit | 36938b584ea2d096d97a124b70da51f685850ff7 (patch) | |
| tree | 768c132d8a661c74f36683005548cf6afb163714 /examples/data_structures | |
| parent | ff32e7b6b99dd9b17b4c581e6c48308128f46c52 (diff) | |
A few examples, some more will be added soon.
Diffstat (limited to 'examples/data_structures')
| -rw-r--r-- | examples/data_structures/binary_tree.zc | 91 | ||||
| -rw-r--r-- | examples/data_structures/linked_list.zc | 85 | ||||
| -rw-r--r-- | examples/data_structures/stack.zc | 81 |
3 files changed, 257 insertions, 0 deletions
diff --git a/examples/data_structures/binary_tree.zc b/examples/data_structures/binary_tree.zc new file mode 100644 index 0000000..14e7b3d --- /dev/null +++ b/examples/data_structures/binary_tree.zc @@ -0,0 +1,91 @@ +import "std.zc" + +struct Node { + value: int; + left: Node*; + right: Node*; +} + +impl Node { + fn new(v: int) -> Self* { + var n = alloc<Self>(); + n.value = v; + n.left = NULL; + n.right = NULL; + return n; + } +} + +struct BST { + root: Node*; +} + +impl BST { + fn new() -> Self { + return Self { root: NULL }; + } + + fn _insert(node: Node*, v: int) -> Node* { + guard node != NULL else { + return Node::new(v); + } + + if v < node.value { + node.left = BST::_insert(node.left, v); + } else if v > node.value { + node.right = BST::_insert(node.right, v); + } + + return node; + } + + fn insert(self, v: int) { + self.root = BST::_insert(self.root, v); + } + + fn _print_in_order(node: Node*) { + if node != NULL { + BST::_print_in_order(node.left); + "{node.value} "..; + BST::_print_in_order(node.right); + } + } + + fn print_all(self) { + BST::_print_in_order(self.root); + ""; + } + + fn _free(node: Node*) { + if node != NULL { + BST::_free(node.left); + BST::_free(node.right); + free(node); + } + } + + fn free(self) { + BST::_free(self.root); + self.root = NULL; + } +} + +fn main() { + var tree = BST::new(); + defer tree.free(); + + "Inserting: 50, 30, 20, 40, 70, 60, 80"; + tree.insert(50); + tree.insert(30); + tree.insert(20); + tree.insert(40); + tree.insert(70); + tree.insert(60); + tree.insert(80); + + "In-Order Traversal: "..; + tree.print_all(); + + "Expected: 20 30 40 50 60 70 80"; + +} diff --git a/examples/data_structures/linked_list.zc b/examples/data_structures/linked_list.zc new file mode 100644 index 0000000..cb85554 --- /dev/null +++ b/examples/data_structures/linked_list.zc @@ -0,0 +1,85 @@ + +import "std/mem.zc" + +struct Node { + value: int; + next: Node*; +} + +impl Node { + fn new(v: int) -> Self* { + var n = alloc<Node>(); + guard n != NULL else { + "Out of memory!"; + return NULL; + } + n.value = v; + n.next = NULL; + return n; + } +} + +struct LinkedList { + head: Node*; +} + +impl LinkedList { + fn new() -> Self { + return Self { head: NULL }; + } + + fn push(self, v: int) { + var new_node = Node::new(v); + guard new_node != NULL else { return; } + + new_node.next = self.head; + self.head = new_node; + } + + fn print_list(self) { + var current: Node* = self.head; + "["..; + while current != NULL { + "{current.value}"..; + current = current.next; + if current != NULL { + " -> "..; + } + } + "]"; + } + + fn free(self) { + var current: Node* = self.head; + while current != NULL { + autofree var temp = current; + current = current.next; + } + self.head = NULL; + } + + fn len(self) -> int { + var count = 0; + var current: Node* = self.head; + while current != NULL { + count++; + current = current.next; + } + return count; + } +} + +fn main() { + var list = LinkedList::new(); + defer list.free(); + + "Pushing: 10, 20, 30..."; + list.push(10); + list.push(20); + list.push(30); + + "List length: {list.len()}"; + + "Current List: "..; + list.print_list(); +} diff --git a/examples/data_structures/stack.zc b/examples/data_structures/stack.zc new file mode 100644 index 0000000..8f1fea5 --- /dev/null +++ b/examples/data_structures/stack.zc @@ -0,0 +1,81 @@ + +import "std.zc" + +struct Stack<T> { + data: Vec<T>; +} + +impl Stack<T> { + fn new() -> Self { + return Self { data: Vec<T>::new() }; + } + + fn push(self, item: T) { + self.data.push(item); + } + + fn pop(self) -> Option<T> { + if self.data.length() == 0 { + return Option<T>::None(); + } + return Option<T>::Some(self.data.pop()); + } + + fn peek(self) -> Option<T> { + if self.data.length() == 0 { + return Option<T>::None(); + } + return Option<T>::Some(self.data.last()); + } + + fn is_empty(self) -> bool { + return self.data.length() == 0; + } + + fn size(self) -> usize { + return self.data.length(); + } + + fn free(self) { + self.data.free(); + } +} + +fn main() { + "[Integer Stack]"; + var int_stack = Stack<int>::new(); + defer int_stack.free(); + + "Pushing: 10, 20, 30"; + int_stack.push(10); + int_stack.push(20); + int_stack.push(30); + + "Size: {int_stack.size()}"; + var p = int_stack.peek(); + "Peek: {p.unwrap()}"; + + "Popping: "..; + while !int_stack.is_empty() { + var opt = int_stack.pop(); + "{opt.unwrap()} "..; + } + ""; + + ""; + "[String Stack]"; + var str_stack = Stack<String>::new(); + defer str_stack.free(); + + str_stack.push(String::new("First")); + str_stack.push(String::new("Second")); + str_stack.push(String::new("Third")); + + "Popping: "..; + while !str_stack.is_empty() { + var opt_s = str_stack.pop(); + var s: String = opt_s.unwrap(); + "{s.c_str()} "..; + } + ""; +} |
