<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用VB完成雙向循環鏈表

      [摘要]作者:zgl郵箱:yoshiro_gl@21cn.com  發現大多數人對VB中應用指針不太了解,作一些說明。  VB的指針挺簡單的,用著也很方便,其實對象變量就可以看成是指針,當你用Set A=Obj時,A就是指向Obj的地址。不用API就可以,當然用API可以實現更為高級的結構。  給一個例子...
      作者:zgl
      郵箱:yoshiro_gl@21cn.com

        發現大多數人對VB中應用指針不太了解,作一些說明。
        VB的指針挺簡單的,用著也很方便,其實對象變量就可以看成是指針,當你用Set A=Obj時,A就是指向Obj的地址。不用API就可以,當然用API可以實現更為高級的結構。
        給一個例子,一個用VB實現的雙向循環鏈表。有鏈表的生成,刪除和結點的插入。
        先定義一個結點類,類名為Node,代碼為:

      Option Explicit
      Public pNext As Node
      Public pPrev As Node
      Public data As Single

      Private Sub Class_Initialize()
        Set pNext = Nothing
        Set pPrev = Nothing
      End Sub

      Private Sub Class_Terminate()
        Set pNext = Nothing
        Set pPrev = Nothing
      End Sub

      再添加一個窗體,窗體上添加兩個列表框,list1和list2,窗體的代碼為:

      Option Explicit
      Private pHead As Object
      Private pV As Object

      Private Sub Form_Load()
      Dim i As Integer
        Set pHead = New Node
        Call CreateLinkList
        Call InsertNode(pHead, 503)
        Call InsertNode(pHead, 1.875)
        Call InsertNode(pHead, -3.675)
        For i = 1 To 100
          Call InsertNode(pHead, -1 * i)
        Next
        Call PrintList
        Call DeleteList
      End Sub

      Public Sub CreateLinkList()
      Dim p As Node
      Dim nLoop As Integer
      Static pLast As Node
      pHead.data = 0
      Set pLast = pHead
      For nLoop = 1 To 501
        Set p = New Node
        p.data = nLoop
        Set pLast.pNext = p
        Set p.pPrev = pLast
        Set pLast = p
      Next
      Set pLast = Nothing
      Set p.pNext = pHead
      Set pHead.pPrev = p
      Exit Sub
      End Sub

      Public Sub PrintList()
      List1.AddItem "Forwards"
      Set pV = pHead
      Do
        List1.AddItem pV.data
        Set pV = pV.pNext
      Loop While Not pV Is pHead

      List2.AddItem "Backwards"
      Set pV = pHead.pPrev
      Do
        List2.AddItem pV.data
        Set pV = pV.pPrev
      Loop While Not pV Is pHead.pPrev
      End Sub

      Public Sub DeleteList()
      Dim p As Node
      Set pV = pHead
      Do
        Set pV = pV.pNext
        Set p = pV.pPrev
        If Not p Is Nothing Then
          Set p.pNext = Nothing
          Set p.pPrev = Nothing
        End If
        Set p = Nothing
      Loop While Not pV.pNext Is Nothing
      Set pV = Nothing
      Set pHead = Nothing
      End Sub

      Public Sub InsertNode(head As Node, data As Single)
      Dim p As New Node, q As Node, prev As Node
      p.data = data
      Set q = head
      Set prev = head.pPrev
      While ((q.data < p.data) And Not q.pNext Is head)
        Set q = q.pNext
        Set prev = prev.pNext
      Wend
      If Not q.pNext Is head Then
        Set p.pNext = q
        Set p.pPrev = prev
        Set prev.pNext = p
        Set q.pPrev = p
        If q Is head Then
          Set head = p
        End If
      Else
        Set p.pNext = head
        Set p.pPrev = q
        Set head.pPrev = p
        Set q.pNext = p
      End If
      End Sub

        一個雙向循環鏈表就形成了,List1中是正向遍歷的結果,List2中是反向遍歷的結果。類的構造器Class_Initialize()過程,類的析構Class_Termainate()過程,結點內存的分配和回收都由類自身完成,還有多態,pHead As Object;Set pHead = New Node;Set pHead.pPrev = p;指向基類的指針指向了子類,并調用了子類的屬性,是不是挺像C++的代碼?

      鏈表有了,二叉樹,由臨接表構成的圖等數據結構都很容易實現了吧,實際上用VB能構造很復雜的數據結構,上面的代碼只是簡單的示例,實際可以做的更完善。

        另外,VB6也能夠生成真實的地址。三種未正式公布的VBA方法VarPtr,ObjPtr,和StrPtr(實際上是指向運行DLL同一入口的三個不同的類型庫別名)就可以用來建立指針,使用address=ObjPtr(Obj)就可以獲得對象的地址,Obj為需要地址的對象,而Address為一個long型變量,其中放置了對象的地址,使用VarPtr(產生變量的地址和UDT),StrPtr(產生字符串的地址)和ObjPtr(產生對象的地址)可以構造真實的,非常復雜的數據結構。
        上面三個方法并沒有在Microsoft的正式文檔資料中公布(包括MSDN),但查看VB6的基本動態運行庫MSVBVM60.DLL可以發現這三個方法:

      [entry(0x60000006),hidden]
      long __stdcall VarPtr([in]void* Ptr);
      [entry(0x60000007),hidden]
      long __stdcall StrPtr([in]BSTR Ptr);
      [entry(0x60000008),hidden]
      long __stdcall ObjPtr([in]IUnknown* Ptr);

        類似這樣的隱藏方法還有不少,實際上VB6的功能是相當強大的,但大家又真正了解VB6多少呢?


      日韩精品一区二区三区高清