环环相扣谈链表(上)
软件世界
问:小博士,我在用顺序结构编程的时候,常常碰到要对大量数据进行删除或添加的情况。有时只为增加一个数据,就要挪动顺序结构中的大量数据,有没有什么数据结构能解决这个问题呢?
小博士:数据结构的种类非常多,除了前面介绍的数组外,还有线性表、栈和队列、树和图等,这些结构在解决特定问题时显得关键而有趣。你提出的问题,也有专门的数据结构能进行解决,那就是链表。
链表
大家都见过自行车,链表就好似日常生活中的自行车链条,环环相扣。要建立一个链表,必须首先确定组成链表的项目:节点和指针。节点用于存放数据,就好似自行车的链扣。指针用于指向节点,就好似自行车的链条。由于它的结构有上述特征,所以在删除或增加一个节点数据时,只用改变相应的指针,而不用移动大量的数据,为我们带来了方便。要想用好链表,先要构建好链表。很大的下面,我们来看看利用VB如何构建链表。
(一)链扣──节点的建立
我们可以通过“工程”菜单中的“添加类模块”来建立一个名称为Node的节点,它是一个类模块,它包含两部分内容:
1.节点的内容,就是一个数值信息。
Public X As Integer
2.后续节点信息,通过它可对整个表中的节点进行链接,也即指针。
Public NextNode As Node
(二)链条──指向节点的指针
有了上面的Node节点类,也就有了组成链表的基本单位,可以构造自己的链表了。将链表的信息封装起来,组成一个新的类模块,名称为List。
首先在窗体上加上一个文本框,用来放链表的内容,然后通过“工程”菜单中的“添加类模块”来建立一个名称为List类模块。因为链表数据结构的建立是为了方便我们使用的,为了保证它在操作过程中的完整性,我们需要做如下工作:
1.定义表头和表尾
Public ListHead As Node
Public ListTail As Node
2.链表信息初始化
Private Sub Class_Initialize()
Set ListHead = Nothing
Set ListTail = Nothing
End Sub
3.建立新节点
Sub MakeNewNode(n1 As Integer, n2 As Integer)
Dim n As Node
Set n = New Node
n.X = n1
If ListHead Is Nothing Then
Set ListHead = n
Else
Set ListTail.NextNode = n
End If
Set ListTail = n
Set ListTail.NextNode = Nothing
End Sub
4.显示链表信息,可通过下面的方法实现
通过头指针和节点建立联系,将指针信息不断修改后移,在实现节点遍历的同时显示其中的内容。
Sub DisplayList()
Dim n As Node
Set n = ListHead
While Not n Is Nothing
Form1.Text1.Text = Form1.Text1.Text + “X:” + Str(n.X) + vbCr + vbLf
Set n = n.NextNode
Wend
End Sub
5.清空链表内容,删除节点信息
Sub ClearList() '清空链表
Dim n As Node
While Not ListHead Is Nothing
Set n = ListHead
Set ListHead = ListHead.NextNode
Set n = Nothing
Wend
End Sub
6.获取当前链表第一个节点信息,并将该节点清空
Sub GetNode(column As Integer) '取节点
Dim n As Node
If Not ListHead Is Nothing Then
Set n = ListHead
column = n.X
Set ListHead = ListHead.NextNode
If ListHead Is Nothing Then Set ListTa
il = Nothing
Set n = Nothing
End If
End Sub
7.测试链表是空表还是非空表
Function HasNodes() As Boolean
HasNodes = Not ListHead Is Nothing
End Function
我们先设置上面的几个基本的属性,为后面应用链表做好准备工作。
小结
指针和节点,就像链扣和链条,组成了有趣的链表。但如何在应用中体现出它环环相扣的特点呢?我们将在下期利用链表编程中为大家做进一步的讲解。