top
Loading...
基于VB編程的鏈式存儲技術淺析
天極IT資訊短信服務 電腦小技巧
資費:包月5元
手機:
介紹:細處著手,巧處用功。高手和菜鳥之間的差別就是:高手什么都知道,菜鳥知道一些。電腦小技巧收集最新奇招高招,讓你輕松踏上高手之路。


程序設計時應用動態存儲分配技術可以減少應用程序數據存儲的開銷。VB在編程中提供了動態數組功能,可以根據數據的多少隨時調整數組的大小,達到提高內存使用效率的目的。但是動態數組有一個缺陷,那就是當調整數組大小時數組中原有的所有數據都被清除,當使用關鍵字Preserve要求保留數組中原有的數據時,只能調整多維數組中最后一維下標的上界。另外,當用數組存儲大量數據時,在數組上的數據操作效率較低。那末,是否可以在VB中實現VC編程中的動態存儲功能呢?答案是肯定的,本文將討論如何在VB編程中實現鏈式存儲技術。

一、VB中的指針

VB中提供對象類型變量以及對象類型變量對于對象的引用功能。這種功能使得一個對象變量可以引用與之屬于同一類的對象。例如:

Dim fp As form
Set fp=form1

第一條語句聲明了一個窗體類型對象變量fp,第二條語句使窗體類型變量引用一個窗體實例form1。

語句:

Dim pointer As Object
Dim instance As New student
Set pointer=instance

上述語句的執行結果是使類型為Object的對象變量引用類型為student的對象實例instance。在VB中,類型為Object的對象變量可以引用任何類型對象實例。另外,在VB編程中多個對象變量可以引用一個對象實例。對象變量引用需要占用與引用相關的內存和系統資源。當程序不需要該引用時,應該及時釋放引用所占用的內存和系統資源。在VB中是通過把對象變量設置為Nothing來釋放資源的。當多個對象變量引用同一個對象實例時,只有在所有對象變量都設置為后,與變量所引用的對象相關聯的內存和系 Nothing統資源才被釋放。

實際上對象變量引用就是一種動態存儲方法,我們可以把對象變量視作指針變量,用New建立一個對象實例看作是申請獲得一塊存儲某種類型的對象實例所需的內存區域。

二、建立動態存儲鏈式線性表

所謂動態存儲鏈式線性表,就是動態分配多個內存空間。每個內存空間稱為一個節點,每個結點之間可以是不連續的(結點內是連續的),結點之間的聯系可以用指針實現。 即在結點結構中定義一個成員項用來存放下一結點的首地址,這個用于存放地址的成員,常把它稱為指針域。可在第一個結點的指針域內存入第二個結點的首地址, 在第二個結點的指針域內又存放第三個結點的首地址, 如此串連下去直到最后一個結點。最后一個結點因無后續結點連接,其指針域可賦為0。這樣一種連接方式,在數據結構中也稱為"鏈表"。動態存儲鏈式線性表中的節點結構如圖一所示:

數據
指針

圖一、動態鏈表中的節點結構圖

如果我們把節點看作一個對象類,則一個節點是一個節點類的對象實例。可以用VB來描述節點類。在名為node的類模塊中聲明如下:

Public mdata As Variant
Public pnext As node

用以上定義的node節點類構造一個單鏈表的程VB序段如下:

Dim phead As New node
Dim p As node
Dim nloop As Integer
Set p = New node
p.data = 1
Set phead = p
For nloop = 2 To 10
Set p.pnext = New node
p.pnext.data = nloop
Set p = p.pnext
Next nloop

注意,以上程序中的指針p可以用Object類加以聲明。同樣node類中的指針pnext也可以用類Object加以聲明。

三、實例

下面用線性表作為一個例子說明基本的應用方法。這個線性表用于存儲學生數據。在一個標準工程中添加名為student的類模塊,為了簡單起見,類中的成員均用public聲明。代碼如下:

Public name As String
Public id As Integer
Public pnext As student

在同一個標準工程中添加一個名為scollection的類模塊如下:

Private length As Integer
Private pfirst As student
Property Get first() As student '獲取線性表首指針
Set first = pfirst
End Property

Property Get l() As Integer '獲取線性表長度
l = length
End Property

Public Sub makeempty() '建立一個空的線性表
Dim s As New students.name = ""
s.id = 0
Set s.pnext = Nothing
Set pfirst = s
length = 0
End Sub

Public Sub addstudent(ByVal sn As String, ByVal id As Integer) '向線性表中添加一個數據
Dim p As student
Set p = pfirst
Do While Not p.pnext Is Nothing
Set p = p.pnext
Loop
Set p.pnext = New student
p.pnext.name = sn
p.pnext.id = id
Set p = p.pnext
Set p.pnext = Nothing
length = length + 1
End Sub

Public Function search(ByVal id As Integer) As student '在線性表中搜索一個學生數據
Dim p As student
Set p = pfirst
Do While p.id <> id And Not p.pnext Is Nothing
Set p = p.pnext
Loop
If Not p.pnext Is Nothing Then
Set search = p
Else Set search = Nothing
End If
End Function

Public Function delete(ByVal id As Integer) As Boolean '在線性表中刪除一個學生數據
Dim p As student
Dim cp As student
Set p = pfirst
Do While p.id <> id And Not p.pnext Is Nothing
Set cp = p
Set p = p.pnext
Loop
delete = True
If Not p.pnext Is Nothing Then
Set p = p.pnext
Set cp.pnext = Nothing
Set cp.pnext = p
length = length - 1
Else
delete = False
End If
End Function
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗