王朝网络
分享
 
 
 

用VB实现双向循环链表

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

作者:zgl

邮箱:yoshiro_gl@21cn.com

发现大多数人对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多少呢?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有