最近在复习数据结构图的部分,又在学习golang,因此我使用Golang将图的一些基本操作实现了一下。
包结构:
package mapTest
AdjacencyList.go
adjacencyMatrix.go
邻接表的创建:
package main
//以邻接表的方式创建图
import (
. "fmt"
)
const MAXVEX1 = 20
type ArcNode struct {
adjvex int
weight int
next *ArcNode
}
type VertexNode struct {
vexdata int
head *ArcNode
}
type AdjList struct {
vertex [MAXVEX1]VertexNode
vexnum int
arcnum int
}
func CreateAdjList(G *AdjList) {
var p *ArcNode
var vex1 int
var vex2 int
weight := 0
Println("请输入有向网中的顶点数和边数:")
_, _ = Scanf("%d %d", &G.vexnum,&G.arcnum)
Printf("请输入有向网中的%d个顶点\n",G.vexnum)
for i := 1; i <= G.vexnum; i++ {
G.vertex[i].head = nil
}
for i := 1; i <= G.vexnum; i++ {
Printf("第%d个顶点:\n",i)
Scanf("%d", &G.vertex[i].vexdata)
}
Printf("请输入有向网中的%d条边\n",G.arcnum)
for i := 0; i < G.arcnum; i++ {
Printf("第%d条边: 顶点V1\n",i+1)
Scanf("%d",&vex1)
Println("<——>顶点V2")
Scanf("%d",&vex2)
Println("权值:")
Scanf("%d",&weight)
I := LocateVexAdjList(G,vex1)
J := LocateVexAdjList(G,vex2)
Head1 := ArcNode{J,weight,nil}
hhead1 := &Head1
p = G.vertex[I].head
if p == nil {
G.vertex[I].head = hhead1
}else {
Aappend(G.vertex[I].head,hhead1)
}
}
}
func Aappend(g,m *ArcNode,) {
for g.next != nil {
g = g.next
}
g.next = m
}
func LocateVexAdjList(G *AdjList,vex int) int{
for i := 1; i <= G.vexnum; i++ {
if G.vertex[i].vexdata == vex {
return i
}
}
return 0
}
func VisitAdjList(G *AdjList) {
for i := 1; i <= G.vexnum; i++ {
Printf(string(rune(G.vertex[i].vexdata))+ " ")
}
Println()
for i := 1; i <= G.vexnum; i++ {
Println(string(rune(G.vertex[i].vexdata)))
var p *ArcNode
p = G.vertex[i].head
for p != nil {
Println("->",string(rune(G.vertex[p.adjvex].vexdata)),"(",p.weight,")")
p = p.next
}
}
}
func main() {
var g1 = AdjList{}
var G1 = &g1
CreateAdjList(G1)
VisitAdjList(G1)
}
邻接矩阵的创建及深度优先搜索、广度优先搜索:
package main
//邻接矩阵
import ."fmt"
const MAXVEX = 20
const INFINITY = 32767
type AdjMatrix struct {
ares[MAXVEX][MAXVEX] int //边的信息
vex[MAXVEX] int //顶点信息
vexnum int //顶点数目
arcnum int //边的数目
}
//邻接矩阵的建立
func Create(G *AdjMatrix) {
var vex1 int
var vex2 int
weight := 0
//输入无向网中的顶点数和边数
Println("请输入无向网中的顶点数和边数:")
_, _ = Scanf("%d %d", &G.vexnum,&G.arcnum)
//初始化图中边的信息
for i := 1; i <= G.vexnum; i++{
for j := 1; j <= G.vexnum; j++ {
G.ares[i][j] = INFINITY
}
}
Printf("请输入无向网中的%d个顶点\n",G.vexnum)
for i := 1; i <= G.vexnum; i++ {
Printf("第%d个顶点:\n",i)
Scanf("%d",&G.vex[i])
}
Printf("请输入无向网中的%d条边\n",G.arcnum)
for i := 0; i < G.arcnum; i++ {
Printf("第%d条边: 顶点V1\n",i+1)
Scanf("%d",&vex1)
Println("<——>顶点V2")
Scanf("%d",&vex2)
Println("权值:")
Scanf("%d",&weight)
I := LocateVex(G,vex1)
J := LocateVex(G,vex2)
G.ares[I][J] = weight
G.ares[J][I] = weight
}
}
//找到某顶点在矩阵中的下标
func LocateVex(G *AdjMatrix,vex int) int{
for i := 1; i <= G.vexnum; i++ {
if G.vex[i] == vex {
return i
}
}
return 0
}
//遍历打印整个邻接矩阵
func Visit(G *AdjMatrix) {
for i := 1; i <= G.vexnum; i++ {
Printf(string(rune(G.vex[i]))+ " ")
}
for i := 1; i <= G.vexnum; i++{
for j := 1; j <= G.vexnum; j++ {
Println(string(rune(G.vex[i])),"<-->",string(rune(G.vex[j])),G.ares[i][j] )
}
}
}
//打印单个节点
func visit(v0 int) {
Println(string(rune(v0)))
}
//寻找v0第一个邻接点
func FirstAdjVex(G *AdjMatrix,v0 int,visited []int) int{
I := LocateVex(G,v0)
for i := 1; i <= G.vexnum; i++ {
J := LocateVex(G,G.vex[i])
if G.ares[I][J] != INFINITY && visited[G.vex[i]] == 0{
return G.vex[i]
}
}
return 0
}
//递归深度优先搜索
func DFSByRecursion(G *AdjMatrix,v0 int,visited []int) {
visit(v0)
visited[v0] = 1
w := FirstAdjVex(G,v0,visited)
for w > 0 {
if visited[w] == 0 {
DFSByRecursion(G,w,visited)
}
w = FirstAdjVex(G,w,visited)
}
}
//广度优先搜索邻接矩阵
func BFSByRecursion(G *AdjMatrix,v0 int,visited []int) {
visit(v0)
visited[v0] = 1
var Queue []int
Queue = append(Queue, v0)
for len(Queue) != 0 {
Queue = Queue[1:len(Queue)]
w := FirstAdjVex(G,v0,visited)
for w > 0{
visit(w)
visited[w] = 1
Queue = append(Queue,w)
w = FirstAdjVex(G,w,visited)
}
}
}
func main() {
var g = AdjMatrix{}
var G = &g
visited1 := make([]int,MAXVEX * 10)
visited2 := make([]int,MAXVEX * 10)
Create(G)
Println("邻接矩阵的遍历打印:")
Visit(G)
Println("邻接矩阵的深度优先搜索打印:")
DFSByRecursion(G,102,visited1)
Println("邻接矩阵的广度优先搜索打印:")
BFSByRecursion(G,102,visited2)
}