编程小博士(25):环环相扣谈链表(下)
软件世界
问:小博士,通过上一讲的学习我了解了链表的结构,学会了构造链表。但我觉得它很抽象。如何找出链表中的某一数据这类问题,怎么解决呢?
小博士:链表的应用过程和上面我们对它进行的抽象密切相关,通过链表来解决问题,实际上就是对两层抽象的应用:Node节点和List指针。要根据问题的具体特点来完成。请看下面示例:
利用链表编程
如何利用两个抽象层编程比较好呢?实际上,利用Node节点进行编程,类的抽象的程度较浅,所以构造的程序相对来说比较麻烦,链条的构造过程在程序中必须体现出来。而利用上面建立的链表类List,可很简单地完成上面已经构造的操作,这些特点在编程中可以直接加以利用。
示例:
生成一个有10个数字的链表,并将它输出再找出其中含有8的个数。
程序中涉及三个问题,一是随机生成10个数字并放入链表,这个用链表中的输入数据功能完成: MakeNewNode Int(Rnd * 10);二是输出,这个链表也有相应的功能: DisplayList;第三个功能直接用链表中现成的功能无法完成,需通过节点来完成,显得麻烦一点。
程序代码:
在窗体上加上了一个命令按钮和一个文本框。下面是源程序及解释:
Private Sub CmdChain_Click()
Dim TestList As List '定义链表
Dim i As Integer
Set TestList = New List
Text1.Text = “”
For i = 1 To 10
TestList.MakeNewNode Int(Rnd * 10) '通过随机函数填入节点数据
Next i
TestList.DisplayList '直接利用链表的功能输出
'利用节点功能,算链表中含有8的个数
Dim n As Node
Set n = TestList.ListHead
While Not n Is Nothing
If n.X = 8 Then
i = i + 1
End If
Set n = n.NextNode
Wend
Form1.Text1.Text = Form1.Text1.Text + “有” + Str(i) + “个8” + vbCr + vbLf
End Sub
小结
通过链表,我们轻松将问题搞定!链表真像一条环环相扣的链子,只要将链条的向下接口动一下,其中的一个链扣就可删除掉。我们上面用到的只是单向链表指针指向节点的特性,链表本身还有双向链表、循环链表等结构。希望大家入门之后,能在学习其他复杂结构链表时事半功倍。
点评:一般对数据结构的介绍都用类 C或PASCAL语言,本文为了栏目的延续性(一直用VB语言给大家做实例),也尝试用不支持指针的VB为大家讲解。指针本身是个不好理解的概念,作者根据指针的特质,用一个类来替代它的功能,相信读者在学习中,反而能加深对指针的认识。