Option Explicit
Public pNext As Node
Public pPrev As Node
Public data As Single
Private Sub Class_Initialize()
Set pNext = Nothing
Set pPrev = Nothing
End Sub
Private Sub Class_Terminate()
Set pNext = Nothing
Set pPrev = Nothing
End Sub
再添加一个窗体,窗体上添加两个列表框,list1和list2,窗体的代码为:
Option Explicit
Private pHead As Object
Private pV As Object
Private Sub Form_Load()
Dim i As Integer
Set pHead = New Node
Call CreateLinkList
Call InsertNode(pHead, 503)
Call InsertNode(pHead, 1.875)
Call InsertNode(pHead, -3.675)
For i = 1 To 100
Call InsertNode(pHead, -1 * i)
Next
Call PrintList
Call DeleteList
End Sub
Public Sub CreateLinkList()
Dim p As Node
Dim nLoop As Integer
Static pLast As Node
pHead.data = 0
Set pLast = pHead
For nLoop = 1 To 501
Set p = New Node
p.data = nLoop
Set pLast.pNext = p
Set p.pPrev = pLast
Set pLast = p
Next
Set pLast = Nothing
Set p.pNext = pHead
Set pHead.pPrev = p
Exit Sub
End Sub
Public Sub PrintList()
List1.AddItem "Forwards"
Set pV = pHead
Do
List1.AddItem pV.data
Set pV = pV.pNext
Loop While Not pV Is pHead
List2.AddItem "Backwards"
Set pV = pHead.pPrev
Do
List2.AddItem pV.data
Set pV = pV.pPrev
Loop While Not pV Is pHead.pPrev
End Sub
Public Sub DeleteList()
Dim p As Node
Set pV = pHead
Do
Set pV = pV.pNext
Set p = pV.pPrev
If Not p Is Nothing Then
Set p.pNext = Nothing
Set p.pPrev = Nothing
End If
Set p = Nothing
Loop While Not pV.pNext Is Nothing
Set pV = Nothing
Set pHead = Nothing
End Sub
Public Sub InsertNode(head As Node, data As Single)
Dim p As New Node, q As Node, prev As Node
p.data = data
Set q = head
Set prev = head.pPrev
While ((q.data < p.data) And Not q.pNext Is head)
Set q = q.pNext
Set prev = prev.pNext
Wend
If Not q.pNext Is head Then
Set p.pNext = q
Set p.pPrev = prev
Set prev.pNext = p
Set q.pPrev = p
If q Is head Then
Set head = p
End If
Else
Set p.pNext = head
Set p.pPrev = q
Set head.pPrev = p
Set q.pNext = p
End If
End Sub
一个双向循环链表就形成了,List1中是正向遍历的结果,List2中是反向遍历的结果。类的构造器Class_Initialize()过程,类的析构Class_Termainate()过程,结点内存的分配和回收都由类自身完成,还有多态,pHead As Object;Set pHead = New Node;Set pHead.pPrev = p;指向基类的指针指向了子类,并调用了子类的属性,是不是挺像C++的代码?
[entry(0x60000006),hidden]
long __stdcall VarPtr([in]void* Ptr);
[entry(0x60000007),hidden]
long __stdcall StrPtr([in]BSTR Ptr);
[entry(0x60000008),hidden]
long __stdcall ObjPtr([in]IUnknown* Ptr);
循环链表以及相关操作(VB实现)
首先建立一个工程,然后增加一个类并且命名为(node,cls),
在node.cls中加入以下代码.
Option Explicit
Public x As Long
Public count As Long
Public nextnode As node
在Form1.frm中加入以下代码。
Option Explicit
Dim head As node
Dim pointer As node
Dim newnode As node
Dim n As node
Dim counts As Long
Dim temp As node
Private Sub createlist_Click()
Dim n As node
Dim i As Long
counts = 0
Set head = New node '可选的。通常在声明时使用 New,以便可以隐式创建对象。如果 New 与 Set 一起使用,则将创建该类的一个新实例。如果 objectvar 包含了一个对象引用,则在赋新值时释放该引用
head.x = 8
Set head.nextnode = Nothing
counts = counts + 1
head.count = counts
Set pointer = head
For i = 1 To 15
Set newnode = New node
newnode.x = i
counts = counts + 1
newnode.count = counts
Set newnode.nextnode = Nothing
Set pointer.nextnode = newnode
Set pointer = newnode
Next i
Set pointer.nextnode = head
Set pointer = head
Do
Print pointer.x
Set pointer = pointer.nextnode
If ObjPtr(pointer) = ObjPtr(head) Then 'objptr返回对象的地址
Exit Sub 'strptr返回变长字符串的字符串数据地址
End If 'varptr返回变量的地址
DoEvents '用与获取变量地址,是函数。
Loop While Not pointer Is Nothing
End Sub
Private Sub delete_Click()
Dim a As Long
Dim b As Long
a = CLng(InputBox("输入要删除的一个数据", "输入数据"))
b = CLng(InputBox("输入该数据的位置", "位置"))
Set pointer = head
If b = 1 Then
Do
Set pointer = pointer.nextnode
If ObjPtr(pointer.nextnode) = ObjPtr(head) Then
Set pointer.nextnode = head.nextnode
Set head = Nothing
Set head = pointer.nextnode
Exit Do
End If
DoEvents
Loop While Not pointer Is Nothing
counts = 1
Set pointer = head
pointer.count = counts
Do
counts = counts + 1
Set pointer = pointer.nextnode
pointer.count = counts
If ObjPtr(pointer.nextnode) = ObjPtr(head) Then
Exit Do
End If
DoEvents
Loop While Not pointer Is Nothing
Else
While pointer.count <> b
Set n = New node
Set n = pointer
Set pointer = pointer.nextnode
DoEvents
Wend
Set n.nextnode = pointer.nextnode
Set pointer = Nothing
Set pointer = n
End If
counts = 0
Set pointer = head
counts = counts + 1
pointer.count = counts
Do
counts = counts + 1
Set pointer = pointer.nextnode
pointer.count = counts
If ObjPtr(pointer.nextnode) = ObjPtr(head) Then
Exit Do
End If
DoEvents
Loop While Not pointer Is Nothing
End Sub
Private Sub insert_Click()
Dim a As Long
Dim b As Long
a = CLng(InputBox("输入要插入的一个数据", "输入数据"))
b = CLng(InputBox("输入该数据的位置", "位置"))
Set pointer = head
If b = 1 Then
head.x = a
Else
While pointer.count <> b
Set pointer = pointer.nextnode
DoEvents
Wend
pointer.x = a
End If
End Sub
Private Sub insert2_Click()
Dim a As Long
Dim b As Long
a = CLng(InputBox("输入要删除的一个数据", "输入数据"))
b = CLng(InputBox("输入该数据的位置", "位置"))
Set pointer = head
If b = 1 Then
Set n = New node
n.x = a
Set n.nextnode = Nothing
Do
Set pointer = pointer.nextnode
If ObjPtr(pointer.nextnode) = ObjPtr(head) Then
Set pointer.nextnode = n
Set n.nextnode = head
Set head = n
Exit Do
End If
Loop While Not pointer Is Nothing
Set pointer = head
counts = 1
pointer.count = 1
Do
counts = counts + 1
Set pointer = pointer.nextnode
pointer.count = counts
If ObjPtr(pointer.nextnode) = ObjPtr(head) Then
Exit Do
End If
Loop While Not pointer Is Nothing
Else
Set n = New node
n.x = a
Set n.nextnode = Nothing
While pointer.count <> b
Set temp = New node
Set temp = pointer
Set pointer = pointer.nextnode
DoEvents
Wend
Set n.nextnode = pointer
Set temp.nextnode = n
Set pointer = n
Set pointer = head
counts = 1
pointer.count = counts
Do
counts = counts + 1
Set pointer = pointer.nextnode
pointer.count = counts
If ObjPtr(pointer.nextnode) = ObjPtr(head) Then
Exit Do
End If
Loop While Not pointer Is Nothing
End If
End Sub
Private Sub konglianbiao_Click()
Set pointer = head
Do
Set pointer = pointer.nextnode
If ObjPtr(pointer.nextnode) = ObjPtr(head) Then
Set pointer.nextnode = Nothing
Set n = New node
Set n = pointer
End If
DoEvents
Loop While Not pointer.nextnode Is Nothing
Do
Set pointer = head
Set head = head.nextnode
Set pointer = Nothing
If ObjPtr(head) = ObjPtr(n) Then
Set head = Nothing
Set n = Nothing
End If
DoEvents
Loop While Not head Is Nothing
Form1.Cls
End Sub
Private Sub leave_Click()
End
End Sub
Private Sub print_Click()
Set pointer = head
If head Is Nothing Then
MsgBox "链表为空"
Else
While Not pointer Is Nothing
Print pointer.x
Set pointer = pointer.nextnode
If ObjPtr(pointer) = ObjPtr(head) Then 'objptr返回对象的地址
Exit Sub 'strptr返回变长字符串的字符串数据地址
End If 'varptr返回变量的地址
DoEvents '用与获取变量地址,是函数。
Wend
End If
End Sub
该代码在VB6.0+WINME中调试通过。