package main
import "fmt"
type Graph struct {
vertices []*Vertex
}
type Vertex struct {
key int
ajecent []*Vertex
}
func (g *Graph) AddVertex(k int) {
if contains(g.vertices, k) {
err := fmt.Errorf("cannot add because vertex %v's already exist", k)
fmt.Println(err.Error())
}else {
g.vertices = append(g.vertices, &Vertex{key: k})
}
}
func (g *Graph) AddEdge(from, to int) {
fromVertex := g.GetVertex(from)
toVertex := g.GetVertex(to)
if fromVertex == nil || toVertex == nil {
err := fmt.Errorf("(%v ---> %v) is an invalid edge", from, to)
fmt.Println(err.Error())
}else if contains(fromVertex.ajecent, to){
err := fmt.Errorf("(%v ---> %v) edge already exist", from, to)
fmt.Println(err.Error())
}else {
fromVertex.ajecent = append(fromVertex.ajecent, toVertex)
}
}
func (g *Graph) GetVertex(k int) *Vertex {
for i, v := range g.vertices {
if v.key ==k {
return g.vertices[i]
}
}
return nil
}
func contains(s []*Vertex,k int) bool {
for _, v := range s {
if k == v.key {
return true
}
}
return false
}
func (g *Graph) Print() {
for _, v := range g.vertices {
fmt.Printf("\nVertex %v:", v.key)
for _, v := range v.ajecent {
fmt.Printf(" %v ", v.key)
}
}
fmt.Println()
}
func main() {
myGraph := &Graph{}
for i := 0; i < 10; i++ {
myGraph.AddVertex(i)
}
myGraph.AddVertex(10)
myGraph.AddEdge(5,7)
myGraph.AddEdge(15,5)
myGraph.AddEdge(7,5)
myGraph.AddEdge(7,5)
myGraph.Print()
}