summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--set/elementary.go76
-rw-r--r--set/tree.go (renamed from tree/tree.go)0
2 files changed, 76 insertions, 0 deletions
diff --git a/set/elementary.go b/set/elementary.go
new file mode 100644
index 0000000..63a3fd8
--- /dev/null
+++ b/set/elementary.go
@@ -0,0 +1,76 @@
+package set
+
+type ElementaryElem struct {
+ key int
+ val interface{}
+ next *ElementaryElem
+}
+
+type Elementary struct {
+ root *ElementaryElem
+}
+
+func NewElementary() *Elementary {
+ return &Elementary{}
+}
+
+func (s Elementary) Empty() bool {
+ return s.root == nil
+}
+
+func (s Elementary) Set(key int, val interface{}) {
+ if s.Empty() {
+ s.root = &ElementaryElem{key, val, nil}
+ return
+ }
+
+ elem := s.root
+
+ for {
+ if elem.key == key {
+ elem.val = val
+ return
+ }
+ if elem.next == nil {
+ elem.next = &ElementaryElem{key, val, nil}
+ return
+ }
+ elem = elem.next
+ }
+}
+
+func (s Elementary) Get(key int) interface{} {
+ elem := s.root
+
+ for elem != nil {
+ if elem.key == key {
+ return elem.val
+ }
+ elem = elem.next
+ }
+
+ return nil
+}
+
+func (s Elementary) Del(key int) interface{} {
+ if s.Empty() {
+ return nil
+ }
+
+ if s.root.key == key {
+ defer func() { s.root = nil }()
+ return s.root.val
+ }
+
+ elem := s.root
+
+ for elem.next != nil {
+ if elem.next.key == key {
+ defer func() { elem.next = elem.next.next }()
+ return elem.next.val
+ }
+ elem = elem.next
+ }
+
+ return nil
+}
diff --git a/tree/tree.go b/set/tree.go
index 2f34cc8..2f34cc8 100644
--- a/tree/tree.go
+++ b/set/tree.go