import LinkedLists.LinkedList
mutable struct Vertex{T}
value::T
end
mutable struct AdjList{T}
vertex::Vertex{T}
edge::LinkedList{Vertex{T}}
end
AdjList{T}(__vertex::T) where T = AdjList{T}(Vertex{T}(__vertex),LinkedList{Vertex{T}}())
mutable struct Graph{T}
__AdjList::LinkedList{AdjList{T}}
vertex_nums::Int
end
Graph{T}() where T = Graph{T}(LinkedList{AdjList{T}}(),0)
function Base.filter(Fn::F,list::LinkedList{T}) where F where T
res = LinkedList{T}()
for element in list
if Fn(element)
push!(res,element)
end
end
res
end
function push_vertex!(graph::Graph{T},value::T) where T
flag = true
res = filter(__AdjList->__AdjList.vertex.value==value,graph.__AdjList)
if isempty(res)
push!(graph.__AdjList,AdjList{T}(value))
flag = true
else
flag = false
end
flag
end
function push_edge!(graph::Graph{T},v1::T,v2::T) where T
flag = false
__adjlist1_iter = filter(__AdjList->__AdjList.vertex.value==v1,graph.__AdjList)
if ! isempty(__adjlist1_iter)
__adjlist2_iter = filter(__AdjList->__AdjList.vertex.value==v2,graph.__AdjList)
if ! isempty(__adjlist2_iter)
edge = first(__adjlist1_iter).edge
vertex = first(__adjlist2_iter).vertex
push!(edge,vertex)
graph.vertex_nums += 1
flag = true
end
end
flag
end
function Base.print(graph::Graph{T}) where T
for iter1 in graph.__AdjList
print(iter1.vertex.value,": ")
for vertex in iter1.edge
print(vertex.value,'\t')
end
println()
end
end
function test()
graph = Graph{Int}()
for i in 1:4
push_vertex!(graph,i)
end
for i in 2:4
push_edge!(graph,1,i)
end
print(graph)
end
test()
新做了一个轮子,力图简洁,慢慢把其他功能加上去吧