Private Sub CommandSearch_Click()
    Dim iCurrename As Integer
    Dim iEndName As Integer
    Dim iStartName As Integer                     
    Dim sPathList As String
    
     '开始搜索
    If Me.ComboStart.ListIndex = 0 Or Me.ComboEnd.ListIndex = 0 Then
        MsgBox "请选择“起点站”或“终点站”!"
        Exit Sub
    End If
    iEndName = Me.ComboEnd.ListIndex          
    iCurrename = iEndName                     
    iStartName = Me.ComboStart.ListIndex      
    sPathList = ""                            
    
    Call SearchPath(Me.ComboStart.ListIndex, Me.ComboEnd.ListIndex)
        '显示结果
    Do While iCurrename <> iStartName    
        If (iPath(iCurrename) = 0) Then
            Me.TextResult.Text = "没有路: " & sAddList(iStartName) & " 到" & sAddList(iEndName)& "!" & vbCrLf 
            Exit Sub
        End If
        sPathList = sAddList(iCurrename) & sPathList
        GetResult (iCurrename)
        sPathList = " -> " & sPathList
        iCurrename = iPath(iCurrename)
    Loop
    sPathList = sAddList(iStartName) & sPathList
    GetResult (iStartName)
    ' /* 打印显示距离 */
    sPathList = "距离是: " & iPathLength(iEndName) & vbCrLf & sPathList
    
    Me.TextResult.Text = sPathList
End Sub

解决方案 »

  1.   

    SearchPath() <----这一段的代码呢???
      

  2.   

    sAddList() ,iPathLength(),GetResult () 还有这3段的代码呢?你给的代码看起来不怎么完整。
      

  3.   

    Option Explicit
    Private Sub CommandSearch_Click()
        Dim iCurrename As Integer
        Dim iEndName As Integer
        Dim iStartName As Integer
        Dim sPathList As String
        
        
        '开始搜索
        ''未选择起点或终点情况
        If Me.ComboStart.ListIndex = 0 Or Me.ComboEnd.ListIndex = 0 Then
            MsgBox "请选择“起点站”或“终点站”!"
            Exit Sub
        End If
        ''传入所设置的起点和终点。用index值来做点的名字。icurrename的作用:是用来标志某次所搜的???
        iEndName = Me.ComboEnd.ListIndex
        iCurrename = iEndName
        iStartName = Me.ComboStart.ListIndex
        sPathList = ""        '清空显示列表,以保存下次查到的内容
        '调用最短路径搜索函数。SearchPath具体实现???
        Call SearchPath(Me.ComboStart.ListIndex, Me.ComboEnd.ListIndex)
        
        
        '显示结果,ipath是路径集合
        Do While iCurrename <> iStartName    '不是查自己到自己的最短路径情况时。Me 在代码正在执行的地方提供引用具体实例的方法
            If (iPath(iCurrename) = 0) Then  'icurename是指谁,用来标记某次搜索???iPath(iCurrename) = 0是指ipath这个集合中参数为icurename的一项内容为空,即无路径
                Me.TextResult.Text = "没有路: " & sAddList(iStartName) & " 到" & sAddList(iEndName) & "!" & vbCrLf '&强制连接符 vbCrLf是VB中用于表示“回车换行”的字符串常数(长度为2字节)
                Exit Sub
            End If
            
        '什么意思???
            sPathList = sAddList(iCurrename) & sPathList
            GetResult (iCurrename)
            sPathList = " -> " & sPathList
            iCurrename = iPath(iCurrename)
        Loop
        
        '以起点为准得出最短路径
        sPathList = sAddList(iStartName) & sPathList
        GetResult (iStartName)
        
        ' 打印显示距离,sPathList是显示的内容,格式:距离是几 最短路径。sPathList在哪定义的,怎样定义的???
        sPathList = "距离是: " & iPathLength(iEndName) & vbCrLf & sPathList
        Me.TextResult.Text = sPathList
    End SubPrivate Sub Form_Load()
        Call LoadDate
    End Sub
    Private Sub LoadDate()
        '初始化程序界面,填充数据
        ''先调用创建地图函数,关联地图
        Call CreateMap     'creatmap的具体功能及实现???
        
        
        '初始化程序界面,填充起点和终点的名称
        Dim iLoop As Integer
        ''清除原有内容
        Me.ComboStart.Clear
        Me.ComboEnd.Clear
        
        
        '填充数据
        ''填充index=0
        Me.ComboStart.AddItem ("请选择起点")
        Me.ComboStart.ListIndex = 0
        Me.ComboEnd.AddItem ("请选择终点")
        Me.ComboEnd.ListIndex = 0
        ''填充index=1toiaddcount,sAddList(iLoop)是最短路径列表,里面存了要添加到Combo里的项目,
        ''iLoop就是下标,For iLoop= 1 To iAddCount就是把东西全部添加进ComboStart和ComboEnd里。
        For iLoop = 1 To iAddCount  'iaddcount可添加的点的数目的最大值
            Me.ComboStart.AddItem (sAddList(iLoop)) 'sAddList的具体功能及实现???
            Me.ComboEnd.AddItem (sAddList(iLoop))
        Next
        
    End Sub
    Option Explicit
    Public sAddList() As String   '最短路径列表'''string是OLE标准的BSTR即宽字符指针
    Public iAddCount As String  '点的数目的最大值
    Public iAddMap() As Long   '地址地图
    Public iAddSelect() As String '选择的点的集
    Public iPathLength() As Long '路径距离集
    Public iPath() As Integer '路径集合Const NoPath = 999999999
    Dim sResult() As String
    Dim iResultSize As Integer '结果数据Dim iLoop As Integer
    Dim jLoop As IntegerPublic Sub CreateMap()
        Dim conn As New ADODB.Connection     'ADODB是数据库访问组件,connection是其中的一个对象
        Dim rs As New ADODB.Recordset        '记录集
        Dim sConn As String
        '打开路径列表
        sConn = App.Path & "\db.mdb"
        sConn = "provider=microsoft.jet.oledb.4.0;data source= " & sConn & ";persist security info=false "    conn.ConnectionString = sConn
        conn.Open
        
        rs.Open "Select DISTINCT  StartName From tmpPath", conn, adOpenStatic
         
         '地点数量
        iAddCount = rs.RecordCount
        ReDim sAddList(1 To iAddCount)
        ReDim iAddMap(1 To iAddCount, 1 To iAddCount)
        ReDim iAddSelect(1 To iAddCount)
        ReDim iPathLength(1 To iAddCount)
        ReDim iPath(1 To iAddCount)
        ReDim sResult(1 To iAddCount)
        iLoop = 1
        While Not rs.EOF
            sAddList(iLoop) = rs.Fields(0).Value
            iLoop = iLoop + 1
            rs.MoveNext
        Wend
        '关掉
        rs.Close    Dim sStartName As String
        Dim sEndName As String
        Dim sPathLength As String
        Dim iEndIndex As Integer
        rs.Open "Select * From tmpPath ", conn, adOpenStatic
        While Not rs.EOF
            sStartName = rs.Fields("StartName").Value & ""
            sEndName = rs.Fields("EndName").Value & ""
            sPathLength = rs.Fields("PathLength").Value & ""
            iAddMap(GetNameIndex(sStartName), GetNameIndex(sEndName)) = sPathLength
            rs.MoveNext
        Wend
        
        rs.Close
        Set rs = Nothing
        '把没有数据的地方填充成0
        For iLoop = 1 To iAddCount
            For jLoop = 1 To iAddCount
                If iAddMap(iLoop, jLoop) = Null Then
                    iAddMap(iLoop, jLoop) = 0
                End If
            Next
        Next
        For iLoop = 1 To iAddCount
            iAddSelect(iLoop) = "False"
            iPathLength(iLoop) = NoPath
            iPath(iLoop) = 0
        Next
    End Sub
    '算法
    Public Function SearchPath(iStartName As Integer, iEndName As Integer)
        'iStartName  '开始点
        'iEndName  '结束点
        
        Dim iCurrename As Integer
        Dim iTotalLength As Integer    Dim bCanSearch As Boolean
        
        
        iCurrename = iStartName
        iTotalLength = 0             '设定开始距离
        bCanSearch = True
        
        Dim min As Long
            '//下面的代码初始化其他数组
        For iLoop = 1 To iAddCount
            '初始化选择点:1表示没有选中,0表示被选中
            iAddSelect(iLoop) = "False"
            iPathLength(iLoop) = NoPath
            iPath(iLoop) = 0
        Next
        
        '从图上显示当前第一个节点被搜索
        iAddSelect(iCurrename) = "True"
        iPathLength(iCurrename) = 0
        iResultSize = 0
         Do While bCanSearch
            '/* 更改数组中的距离 */
            For iLoop = 1 To iAddCount
                If ((iAddMap(iCurrename, iLoop) <> 0) And _
                     ((iPathLength(iLoop)) > (iAddMap(iCurrename, iLoop)) + iTotalLength)) Then
                    iPathLength(iLoop) = iAddMap(iCurrename, iLoop) + iTotalLength
                    iPath(iLoop) = iCurrename
                End If
            Next iLoop
            
            
            min = NoPath        For iLoop = 1 To iAddCount
                If ((iPathLength(iLoop) < min) And (iAddSelect(iLoop) = "False")) Then
                    min = iPathLength(iLoop)
                    iCurrename = iLoop
                    iTotalLength = iPathLength(iLoop)
                End If
            Next iLoop
            iAddSelect(iCurrename) = "True"
        
            '/* 处理完成所有的顶点之后停止 */
            If (min = NoPath) Then
                bCanSearch = False
            End If
            '测试代码
            DoEvents
        LoopEnd Function
    Private Function GetNameIndex(sName As String) As Integer
        '获得当前的地址在数组中的编号
        Dim iIndex As Integer
        For iLoop = 1 To iAddCount
            If sAddList(iLoop) = sName Then
               iIndex = iLoop
               GetNameIndex = iIndex
               Exit Function
            End If
        Next
        GetNameIndex = iIndex
    End Function
    Public Sub GetResult(index As Integer)
        iResultSize = iResultSize + 1
        sResult(iResultSize) = index
    End Sub
      

  4.   

    sPathList = sAddList(iCurrename) & sPathList 
    sAddList 就是从 数据库中提取出来的资料。
     ReDim sAddList(1 To iAddCount) 
       iLoop = 1 
        While Not rs.EOF 
            sAddList(iLoop) = rs.Fields(0).Value 
            iLoop = iLoop + 1 
            rs.MoveNext 
        Wend