1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
;***************************************************************************
;基于数组实现的链表(测试程序)
;编译环境 masm32 + nmake windows xp sp3 TAB=8
;作者: Joen
;日期: 2011年5月30日12:07:11
;出处: http://JoenChen.com(Joen专栏)
;有问题可以在网页留言或者发Email:[email protected]
;***************************************************************************
Include masm32rt.inc
Include ArrayList.inc
DATANODE Struct
SzString byte 128 dup(?)
DATANODE Ends
.code
;***************************************************************************
;链表比较函数
;_lpDataNode1 < _lpDataNode2 返回-1
;_lpDataNode1 > _lpDataNode2 返回1
;_lpDataNode1 == _lpDataNode2 返回0
;***************************************************************************
_Compare Proc _lpDataNode1:dword, _lpDataNode2:dword
mov ebx, _lpDataNode1
mov esi,_lpDataNode2
assume ebx:ptr DATANODE, esi:ptr DATANODE
Invoke lstrcmp,ebx, esi
assume ebx:ptr nothing, esi:ptr nothing
ret
_Compare Endp
;***************************************************************************
;遍历函数原型范例ArrayList在需要比较的时候会调用此函数,
;_lpDataNode:目前遍历到的节点
;_dwSize :目前已经遍历了几个
;_dwIsOver :如果遍历结束时会调用此函数(用户函数应当首先判断此值)
_Iterator Proc _lpDataNode:dword, _dwSize:dword, _dwIsOver:dword
;===========================================================================
;最后的清理工作, 不应该再访问_lpDataNode和_dwSize
.if _dwIsOver
Invoke crt_printf, cfm$( "遍历结束\n" )
ret
.Endif
;===========================================================================
;这里可以对节点做一些操作(修改也是允许的)
mov ebx, _lpDataNode
;int 3
Invoke crt_printf, cfm$( "%s\t" ), addr [ebx+DATANODE.SzString]
mov eax, _dwSize
mov ecx, 4
cdq
div ecx
;===========================================================================
;如果需要目前遍历到什么位置(这里也是可以)
.if !edx
Invoke crt_printf, cfm$( "\n" ), [ebx+DATANODE.SzString]
.Endif
ret
_Iterator Endp
;***************************************************************************
;链表测试函数
;***************************************************************************
Jmain Proc
local _StData:DATANODE
local _lpArrayList:dword
;===========================================================================
;初始化链表
Invoke _ArrayListInit, addr _lpArrayList, offset _Compare,
offset _Iterator, 2, sizeof DATANODE, 1
.if !eax
Invoke crt_printf, cfm$( "初始化链表失败, %s\n" ), LastError$()
ret
.Endif
;===========================================================================
;插入数据到ArrayList
Invoke lstrcpy, addr _StData.SzString, cfm$( "hello" )
Invoke _ArrayListInsert,addr _lpArrayList,addr _StData
.if eax
Invoke crt_printf, cfm$( "插入元素到链表成功\x\n" )
.Else
Invoke crt_printf, cfm$( "插入元素到链表失败 %s\n" ), LastError$()
.Endif
Invoke _ArrayListIterator, addr _lpArrayList
;===========================================================================
;再插入一个元素
Invoke lstrcpy, addr _StData.SzString, cfm$( "nihao" )
Invoke _ArrayListInsert,addr _lpArrayList,addr _StData
.if eax
Invoke crt_printf, cfm$( "插入元素到链表成功\x\n" )
.Else
Invoke crt_printf, cfm$( "插入元素到链表失败 %s\n" ), LastError$()
.Endif
Invoke _ArrayListIterator, addr _lpArrayList
;===========================================================================
;删除加插入ArrayList数据
Invoke lstrcpy, addr _StData.SzString, cfm$( "hello" )
Invoke _ArrayListDel, addr _lpArrayList, addr _StData
.if eax
Invoke crt_printf, cfm$( "删除元素成功\x\n" )
.Else
Invoke crt_printf, cfm$( "删除元素失败 %s\n" ), LastError$()
.Endif
Invoke _ArrayListIterator, addr _lpArrayList
;===========================================================================
;查找某个数据元素
Invoke lstrcpy, addr _StData.SzString, cfm$( "nihao" )
Invoke _ArrayListFind, addr _lpArrayList, addr _StData
.if !eax
Invoke crt_printf, cfm$( "未能够找到数据\n" )
.Else
Invoke crt_printf, cfm$( "找到该数据指针是:%p 数据是:%d\n" ), eax, dword ptr [eax]
.Endif
;===========================================================================
;别忘记释放数组
Invoke _ArrayListClean, addr _lpArrayList
Invoke crt_system, cfm$( "pause" )
;===========================================================================
ret
Jmain Endp
End Jmain
|