Skip to content

Commit 53296a6

Browse files
author
Ubuntu
committed
Saving
1 parent 8db8960 commit 53296a6

1 file changed

Lines changed: 114 additions & 0 deletions

File tree

linkedlist.mojo

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
from memory import Pointer, UnsafePointer
2+
from os import abort
3+
4+
alias ElementType = CollectionElement
5+
6+
7+
fn main():
8+
node = Node(1)
9+
print(node.__str__())
10+
linkedlist = LinkedList(1, 2, 3)
11+
print(linkedlist.__str__())
12+
13+
14+
@value
15+
struct Node[
16+
T: ElementType,
17+
]:
18+
alias NextNode = UnsafePointer[Self]
19+
var value: T
20+
var next: Self.NextNode
21+
22+
fn __init__(
23+
out self,
24+
owned value: T,
25+
):
26+
self.value = value
27+
self.next = Self.NextNode()
28+
#print("I am getting called", self.next.__bool__())
29+
30+
fn __init__(
31+
out self,
32+
owned value: T,
33+
next: Optional[Self.NextNode],
34+
):
35+
self.value = value^
36+
self.next = next.value() if next else Self.NextNode()
37+
#print("No I am getting called")
38+
39+
fn __bool__(self) -> Bool:
40+
return True
41+
42+
fn __str__[
43+
ElementType: WritableCollectionElement
44+
](self: Node[ElementType]) -> String:
45+
return String.write(self.value)
46+
47+
48+
struct LinkedList[T: ElementType]:
49+
var head: Optional[Node[T]]
50+
var len: UInt
51+
52+
fn __init__(out self):
53+
self.head = None
54+
self.len = 0
55+
56+
fn __init__(out self, *elems: T):
57+
self = Self()
58+
self.append(elems)
59+
60+
fn append(mut self, elems: VariadicListMem[T]):
61+
if len(elems) == 0:
62+
return
63+
next = 0
64+
var current: Node[T]
65+
if self.head is None:
66+
self.head = Optional(Node(elems[0]))
67+
#self.head = Node(elems[0])
68+
current = self.head.value()
69+
next = 1
70+
self.len += 1
71+
print("ok1")
72+
73+
else:
74+
current = self.head.value()
75+
while current and current.next:
76+
current = current.next[]
77+
print("ok2")
78+
for i in range(next, len(elems)):
79+
node = Node(elems[i])
80+
#current.next = Node[T].NextNode.alloc(1)
81+
#current.next = UnsafePointer[Node[T]].alloc(1)
82+
current.next = UnsafePointer(to=node)
83+
#ptr_next = UnsafePointer(to=node)
84+
#if not current.next:
85+
#abort()
86+
#current.next.init_pointee_move(node)
87+
current = current.next[]
88+
self.len += 1
89+
print("ok3")
90+
91+
fn __str__[
92+
ElementType: WritableCollectionElement
93+
](self: LinkedList[ElementType]) -> String:
94+
if self.len == 0:
95+
return String("[]")
96+
else:
97+
print("ok4", self.len)
98+
s = String("[")
99+
var current = self.head.value()
100+
print("ok5")
101+
s.write(current.value)
102+
for i in range(1, self.len):
103+
print("ok6", s)
104+
curr = current.next[]
105+
print("ok66", s)
106+
if i < self.len-1 :
107+
s.write(", ")
108+
s.write(curr.value)
109+
print("ok7", s)
110+
print("ok8")
111+
current = curr
112+
# s = s.rstrip()
113+
s.write("]")
114+
return s

0 commit comments

Comments
 (0)