Hello folks. Well I’m attempting to start my own code and I thought I’d start with a tree node implementation. It’s very vaguely based on an old Delphi code base though obviously rewritten to take advantage of Go idioms. However, I have gotten myself in a bit of a mess with pointers. Could some kind soul take a quick look at the code below and offer some constructive criticism. The intent of the code should be obvious:
package main
import (
"fmt"
"strings"
)
const dbg = true
type node struct {
Next *node
Prev *node
Parent *node
FirstChild *node
Data interface{}
Level int32
}
func (n node) AddChild(data interface{}) *node {
newNode := node{Data: data}
newNode.Parent = &n
if dbg { fmt.Println(newNode.Parent.Data)}
if n.FirstChild == nil {
n.FirstChild = &newNode
}
newNode.Level = n.Level + 1
return &newNode
}
func (n node) AddSib(data interface{}) *node {
newNode := node{Data: data}
n.Next = &newNode
newNode.Prev = &n
newNode.Parent = n.Parent
newNode.Level = n.Level
return &newNode
}
func AddRoot(data interface{}) *node {
newNode := node{Data: data}
newNode.Level = 0
return &newNode
}
func (n node) GetNext() *node {
if n.FirstChild != nil {
return n.FirstChild
} else {
if n.Next != nil {
return n.Next
} else {
nn := n.Parent
for nn != nil && nn.Next == nil {
nn = nn.Parent
}
if nn != nil {
return nn.Next
} else {
return nil
}
}
}
}
func main () {
root := AddRoot("Root node")
root.AddChild("Child 1")
child2 := root.AddChild("Child 2")
child2.AddSib("Sib 1")
child2.AddSib("Sib 2")
nn := root
fmt.Println(nn.Data)
nn = nn.GetNext()
fmt.Println(nn.Data)
for nn != nil {
fmt.Print(strings.Repeat(" ", int(nn.Level)))
fmt.Println(nn.Data)
nn = nn.GetNext()
}
}
Thanks in advance,
Carl