基于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