重做轮子:Graph

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()

新做了一个轮子,力图简洁,慢慢把其他功能加上去吧