六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

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

用VB完成雙向循環鏈表

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

  發現大多數人對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多少呢?


主站蜘蛛池模板: 影音先锋亚洲资源 | 中文在线最新版天堂bt | 青青青青青在线视频播放 | 五月天天堂 | 亚洲人成在线播放网站岛国 | 色婷婷久久合月综 | 日韩黄页| 欧美一级录像 | 一区二区三区在线免费视频 | 午夜久| 四虎最新永久在线精品免费 | 日韩成人免费aa在线看 | 天天看片天天a免费观看 | 香蕉草莓榴莲向日葵 | 无间电视剧在线 | 日韩中文字幕一区二区不卡 | 一级黄色网 | 婷婷久久综合九色综合九七 | 人人鲁免费播放视频人人香蕉 | 青青草免费在线视频 | 青草娱乐极品免费视频 | 日本v片免费一区二区三区 日本vs欧美一区二区三区 | 日本大片在线播放在线 | 日韩欧美伊人久久大香线蕉 | 中文国产成人精品久久96 | 亚洲国产www | 日本一本视频 | 天天狠狠色综合图片区 | 一区小说二区另类小说三区图 | 午夜免费在线观看 | 亚洲天堂资源网 | 亚洲成人激情片 | 亚洲网站在线免费观看 | 亚洲专区区免费 | 亚洲视频国产视频 | 四虎影视最新 | 一级十八以 下岁女子毛片 一级人做人爰a全过程免费视频 | 日本视频免费看 | 天天做天天爽爽快快 | 色婷婷综合激情视频免费看 | 午夜精品久久久久久毛片 |