编程小博士(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为大家讲解。指针本身是个不好理解的概念,作者根据指针的特质,用一个类来替代它的功能,相信读者在学习中,反而能加深对指针的认识。