ListNode:
Public Class ListNode Public NodeData As Integer Public NextNode As ListNode Public PrevNode As ListNode End Class
ListNodeLib:
' 鏈結程式庫 Public Class ListNodeLib ' 首節點 Private Head As ListNode ' 尾節點 Private Tail As ListNode ' 建構子 Public Sub New() Me.Head = Nothing Me.Tail = Nothing End Sub ' 類別屬性 Public ReadOnly Property ListHead As ListNode Get Return Me.Head End Get End Property ' 類別屬性 Public ReadOnly Property ListTail As ListNode Get Return Me.Tail End Get End Property ' 加入節點至佇列 Public Sub AddQueue(NewNode As ListNode) If Me.Head Is Nothing Then ' 鏈結無節點時 NewNode.NextNode = Nothing NewNode.PrevNode = Nothing ' 新節點 = 首節點 Me.Head = NewNode Else ' 鏈結有節點時 ' 新節點之前節點 = 目前尾節點 NewNode.PrevNode = Me.Tail NewNode.NextNode = Nothing ' 目前尾節點之後節點 = 新節點 Me.Tail.NextNode = NewNode End If ' 新節點 = 尾節點 Me.Tail = NewNode End Sub ' 加入節點至堆疊 Public Sub AddStack(NewNode As ListNode) NewNode.PrevNode = Nothing If Me.Head Is Nothing Then ' 鏈結無節點時 NewNode.NextNode = Nothing ' 新節點 = 首節點 ' 新節點 = 尾節點 Me.Tail = NewNode Else ' 鏈結有節點時 ' 新節點之後節點 = 目前首節點 NewNode.NextNode = Me.Head ' 目前首節點之前節點 = 新節點 Me.Head.PrevNode = NewNode End If ' 目前首節點 = 新節點 Me.Head = NewNode End Sub ' 列印所有節點-FIFO Public Sub PrintList() Dim CurrNode As ListNode = Me.Head Do While Not (CurrNode Is Nothing) Console.Write("{0},{1}", CurrNode.NodeData, vbTab) CurrNode = CurrNode.NextNode Loop Console.WriteLine() End Sub ' 列印所有節點-FILO Public Sub PrintRevList() Dim CurrNode As ListNode = Me.Tail Dim i As Integer = 0 Do While Not (CurrNode Is Nothing) Console.Write("{0},{1}", CurrNode.NodeData, vbTab) CurrNode = CurrNode.PrevNode Loop Console.WriteLine() End Sub ' 依搜尋方向,找出第一個含有特定值之節點 Public Function GetFirstMatchedNode(NodeData As Integer, Foreward As Boolean) As ListNode Dim myListNode As ListNode = Nothing Dim CurrNode As ListNode = IIf(Foreward, Me.Head, Me.Tail) Do While Not (CurrNode Is Nothing) If CurrNode.NodeData = NodeData Then myListNode = CurrNode Exit Do End If If Foreward Then CurrNode = CurrNode.NextNode Else CurrNode = CurrNode.PrevNode End If Loop Return myListNode End Function ' 自當前節點開始,依搜尋方向,找出下一個含有特定值之節點 Public Function GetNextMatchedNode(StartNode As ListNode, NodeData As Integer, Foreward As Boolean) As ListNode Dim myListNode As ListNode = Nothing Dim CurrNode As ListNode = StartNode Do While Not (CurrNode Is Nothing) If Foreward Then CurrNode = CurrNode.NextNode Else CurrNode = CurrNode.PrevNode End If If CurrNode Is Nothing Then Exit Do End If If CurrNode.NodeData = NodeData Then myListNode = CurrNode Exit Do End If Loop Return myListNode End Function End Class
主程式:
Module ModuleW10 Private MyListNodeLib As ListNodeLib = New ListNodeLib() Sub Init(IsQueue As Boolean) Dim NumArr() As Integer = {11, 21, 31, 1, 9, 8, 21, 7} Dim CurrListNode As ListNode = Nothing For i = 0 To UBound(NumArr) Console.Write("{0},{1}", NumArr(i), vbTab) CurrListNode = New ListNode CurrListNode.NodeData = NumArr(i) CurrListNode.NextNode = Nothing If IsQueue Then MyListNodeLib.AddQueue(CurrListNode) Else MyListNodeLib.AddStack(CurrListNode) End If Next Console.WriteLine() End Sub Sub Print(Kind As Integer) If Kind And 1 Then MyListNodeLib.PrintList() End If If Kind And 2 Then MyListNodeLib.PrintRevList() End If End Sub Sub FindNum(Num As Integer) Dim CurrNode As ListNode = MyListNodeLib.GetFirstMatchedNode(Num, True) Do While Not (CurrNode Is Nothing) Console.Write("{0},{1}", CurrNode.NodeData, vbTab) CurrNode = MyListNodeLib.GetNextMatchedNode(CurrNode, Num, True) Loop Console.WriteLine() End Sub Sub Main() Init(False) Print(1) FindNum(21) Console.ReadKey() End Sub End Module