基于VB編程的鏈式存儲技術淺析
|
程序設計時應用動態存儲分配技術可以減少應用程序數據存儲的開銷。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 |