vb 能不能实现链表结构?????

dream0810 2003-06-18 02:44:24
vb 能不能实现链表结构?????
...全文
49 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxhwq 2003-06-19
  • 打赏
  • 举报
回复
继续努力学习!
inshua 2003-06-19
  • 打赏
  • 举报
回复
再强大也是 COM 搭起来的,所以…………
lihonggen0 2003-06-18
  • 打赏
  • 举报
回复

用VB实现双向循环链表

作者: zgl 

  发现大多数人对VB中应用指针不太了解,作一些说明。
  VB的指针挺简单的,用着也很方便,其实对象变量就可以看成是指针,当你用Set A=Obj时,A就是指向Obj的地址。不用API就可以,当然用API可以实现更为高级的结构。
  给一个例子,一个用VB实现的双向循环链表。有链表的生成,删除和结点的插入。
  先定义一个结点类,类名为Node,代码为:

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++的代码?

链表有了,二叉树,由临接表构成的图等数据结构都很容易实现了吧,实际上用VB能构造很复杂的数据结构,上面的代码只是简单的示例,实际可以做的更完善。

  另外,VB6也能够生成真实的地址。三种未正式公布的VBA方法VarPtr,ObjPtr,和StrPtr(实际上是指向运行DLL同一入口的三个不同的类型库别名)就可以用来建立指针,使用address=ObjPtr(Obj)就可以获得对象的地址,Obj为需要地址的对象,而Address为一个long型变量,其中放置了对象的地址,使用VarPtr(产生变量的地址和UDT),StrPtr(产生字符串的地址)和ObjPtr(产生对象的地址)可以构造真实的,非常复杂的数据结构。
  上面三个方法并没有在Microsoft的正式文档资料中公布(包括MSDN),但查看VB6的基本动态运行库MSVBVM60.DLL可以发现这三个方法:

[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);

  类似这样的隐藏方法还有不少,实际上VB6的功能是相当强大的,但大家又真正了解VB6多少呢?



 


lihonggen0 2003-06-18
  • 打赏
  • 举报
回复
循环链表以及相关操作(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中调试通过。
inshua 2003-06-18
  • 打赏
  • 举报
回复
当然可以,抄链表的结构就可以啦。

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧