• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用VB實現雙向循環鏈表

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 10次 | 進入軟件測試論壇討論

    領測軟件測試網 作者: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多少呢?

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>