Added further functionality to check for connected nodes and disconnect
This commit is contained in:
parent
5553cc5389
commit
78cf24be0c
|
@ -1 +0,0 @@
|
||||||
Subproject commit 65b8cf069318223b1e722b4b36e729e5e9bb9eab
|
|
|
@ -6,15 +6,18 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
n := &graph.Node{Value: "1"}
|
n := new(graph.Node)
|
||||||
n2 := &graph.Node{Value: "2"}
|
n.Value = "1"
|
||||||
n3 := &graph.Node{Value: "3"}
|
n2 := new(graph.Node)
|
||||||
|
n2.Value = "2"
|
||||||
|
n3 := new(graph.Node)
|
||||||
|
n3.Value = "3"
|
||||||
|
|
||||||
n.Connect(n2)
|
n.Connect(n2)
|
||||||
n.Connect(n3)
|
n.Connect(n3)
|
||||||
n3.Connect(n.GetConnections()[0])
|
n2.Connect(n3)
|
||||||
//n.Disconnect(&n2) test
|
n.DisconnectAll()
|
||||||
//fmt.Println(n.RemovePointerTo(n3))
|
fmt.Println(n.IsConnectedTo(n3))
|
||||||
fmt.Println("n -> n2: ", n2.IsConnectedTo(n), " n <- n2: ", n.IsConnectedTo(n2))
|
fmt.Println("n -> n2: ", n2.IsConnectedTo(n), " n <- n2: ", n.IsConnectedTo(n2))
|
||||||
fmt.Println("n -> n3: ", n.IsConnectedTo(n3), " n <- n3: ", n3.IsConnectedTo(n))
|
fmt.Println("n -> n3: ", n.IsConnectedTo(n3), " n <- n3: ", n3.IsConnectedTo(n))
|
||||||
fmt.Println("n2 -> n3: ", n2.IsConnectedTo(n3), " n2 <- n3: ", n3.IsConnectedTo(n2))
|
fmt.Println("n2 -> n3: ", n2.IsConnectedTo(n3), " n2 <- n3: ", n3.IsConnectedTo(n2))
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
// Package collection implements a generic stack.
|
|
||||||
package collection
|
|
||||||
|
|
||||||
// The zero value for Stack is an empty stack ready to use.
|
|
||||||
type Stack struct {
|
|
||||||
data []interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push adds x to the top of the stack.
|
|
||||||
func (s *Stack) Push(x interface{}) {
|
|
||||||
s.data = append(s.data, x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pop removes and returns the top element of the stack.
|
|
||||||
// It’s a run-time error to call Pop on an empty stack.
|
|
||||||
func (s *Stack) Pop() interface{} {
|
|
||||||
i := len(s.data) - 1
|
|
||||||
res := s.data[i]
|
|
||||||
s.data[i] = nil // to avoid memory leak
|
|
||||||
s.data = s.data[:i]
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
// Size returns the number of elements in the stack.
|
|
||||||
func (s *Stack) Size() int {
|
|
||||||
return len(s.data)
|
|
||||||
}
|
|
|
@ -11,6 +11,14 @@ type Node struct {
|
||||||
messages []string
|
messages []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//GetConnection returns the i'th connected node if it exists
|
||||||
|
func (n *Node) GetConnection(i int) (*Node, error) {
|
||||||
|
if n.NrOfConnectedNodes() > i {
|
||||||
|
return n.connections[i], nil
|
||||||
|
}
|
||||||
|
return n, fmt.Errorf("slice out of bounds")
|
||||||
|
}
|
||||||
|
|
||||||
//GetConnections returns all connections
|
//GetConnections returns all connections
|
||||||
func (n *Node) GetConnections() []*Node {
|
func (n *Node) GetConnections() []*Node {
|
||||||
return n.connections
|
return n.connections
|
||||||
|
@ -29,7 +37,9 @@ func (n *Node) Connect(otherNode *Node) {
|
||||||
|
|
||||||
//SetPointTo sets this Node to point towards the given Node
|
//SetPointTo sets this Node to point towards the given Node
|
||||||
func (n *Node) SetPointTo(otherNode *Node) {
|
func (n *Node) SetPointTo(otherNode *Node) {
|
||||||
n.connections = append(n.connections, otherNode)
|
if n.IsConnectedTo(otherNode) == false {
|
||||||
|
n.connections = append(n.connections, otherNode)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//RemovePointerTo removes pointer to a node (a "child")
|
//RemovePointerTo removes pointer to a node (a "child")
|
||||||
|
@ -56,20 +66,28 @@ func (n *Node) Disconnect(otherNode *Node) int {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//DisconnectAll disconnects all Nodes
|
||||||
|
func (n *Node) DisconnectAll() {
|
||||||
|
for _, v := range n.connections {
|
||||||
|
n.Disconnect(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//IsConnectedTo checks if this node is connected (has a pointer) to the given node
|
//IsConnectedTo checks if this node is connected (has a pointer) to the given node
|
||||||
func (n *Node) IsConnectedTo(otherNode *Node) bool {
|
func (n *Node) IsConnectedTo(otherNode *Node) bool {
|
||||||
if n.GetIndexOf(otherNode) != -1 {
|
nPointsToOther := n.GetIndexOf(otherNode)
|
||||||
|
otherPointsToN := otherNode.GetIndexOf(n)
|
||||||
|
if nPointsToOther != -1 && otherPointsToN != -1 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
//GetIndexOf gets the index of the specified node
|
//GetIndexOf gets the index of the specified node.
|
||||||
|
//May alternatively be used to check if n is pointing to otherNode
|
||||||
func (n *Node) GetIndexOf(otherNode *Node) int {
|
func (n *Node) GetIndexOf(otherNode *Node) int {
|
||||||
for i := range n.connections {
|
for i, v := range n.connections {
|
||||||
//fmt.Printf("%p and %p \n", n.connections[i], otherNode)
|
if v == otherNode { //addresses are compared
|
||||||
|
|
||||||
if n.connections[i] == otherNode { //addresses are compared
|
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user