summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2020-10-04 11:18:04 +0100
committerPaul Buetow <paul@buetow.org>2020-10-04 11:18:04 +0100
commit2de042b741957f1e06fdfb6e3cf9c8219ce4c655 (patch)
treeed7ebaa14fa757fd1a4496fc9e3f8c9ad15e91bd
parent044a4e8b6b04646000076af2b62a4f40d30f56fd (diff)
Add elementary set ds
-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