vba中沒有指標,但依舊可以模擬出鍊錶,而且和c語言中的鍊錶功能完全相同,使用方法也類似。可以實現節點的插入、刪除。
以下是vba的**。不過**正確性沒有經過測試,只是乙個可行的構想。
'定義雙向鍊錶的節點
public type node
lastptrnode as
long
'上乙個節點的指標。實際上是陣列memory的索引
objectnmae as
string
'此處寫入節點存放的資料
nextptrnode as
long
'下乙個節點的指標。實際上是陣列memory的索引
end type
'在記憶體中儲存節點的方式。實際上是陣列memory中每個元素的型別
public type memorynode
used as
boolean
'該記憶體位置是否使用。實際上是陣列memory的該元素,是否使用(預設false)
thisnode as node '節點
end type
'開闢一片記憶體,存放節點。實際上是定義乙個陣列,來儲存所有節點
public memory(100) as memorynode
'獲取指標指向的節點的資料。實際上是獲取陣列memory中指定元素的中的節點
public
function getnode(byval ptrnode as
long) as node
getnode = memory(ptrnode).thisnode
endfunction
'建立乙個新節點,並返回其指標。實際上是返回陣列memory中的乙個「未使用」的元素的節點,並將該元素設為「使用中」
public
function newnode() as
long
dim i as
long
dim j as
long
j = ubound(memory)
for i = 0
to j step
1if memory(i).used = false
then
memory(i).used = true
memory(i).thisnode.lastptrnode = -1
'初始化鍊錶。用-1代表指標的值為null
memory(i).thisnode.nextptrnode = -1
'初始化鍊錶。用-1代表指標的值為null
newnode = memory(i).thisnode
exit
function
endif
next i
redim
preserve memory(j + 100) '擴大陣列的儲存空間
memory(j + 1).used = true
memory(i).thisnode.lastptrnode = -1
'初始化鍊錶。用-1代表指標的值為null
memory(i).thisnode.nextptrnode = -1
'初始化鍊錶。用-1代表指標的值為null
newnode = memory(j + 1).thisnode
endfunction
'釋放節點的儲存空間。實際上是將陣列memory的指定元素設為「未使用」
public
sub freeptr(byval ptrnode as
long)
memory(ptrnode).used = false
endsub
'刪除ptrnode指向的節點,並釋放儲存空間
public
sub delectnode(byval ptrnode as
long)
dim lastptrnode as
long
dim nextptrnode as
long
lastptrnode = memory(ptrnode).thisnode.lastptrnode
nextptrnode = memory(ptrnode).thisnode.nextptrnode
if lastptrnode <> -1
then
memory(lastptrnode).thisnode.nextptrnode = nextptrnode
endifif nextptrnode <> -1
then
memory(nextptrnode).thisnode.lastptrnode = lastptrnode
endif memory(ptrnode).used = false
endsub
'更新ptrnode指向的節點的資料
public
sub updatenode(byval ptrnode as
long, byval updatanode as node)
memory(ptrnode).thisnode = updatanode
endsub
'建立新節點,並插入到ptrnode指向的節點的後面
public
sub insertnodetonext(byval ptrnode as
long, byval insertnode as node)
dim thisptrnode as
long
thisptrnode = newnode()
memory(thisptrnode).thisnode = insertnode
dim nextptrnode as
long
nextptrnode = memory(ptrnode).thisnode.nextptrnode
if nextptrnode = -1
then
'後面無節點
memory(ptrnode).thisnode.nextptrnode = thisptrnode
memory(thisptrnode).thisnode.lastptrnod = ptrnode
memory(thisptrnode).thisnode.nextptrnod = -1
else
memory(thisptrnode).thisnode.lastptrnod = ptrnode
memory(thisptrnode).thisnode.nextptrnod = memory(ptrnode).thisnode.nextptrnode
memory(ptrnode).thisnode.nextptrnode = thisptrnode
memory(memory(ptrnode).thisnode.nextptrnode).thisnode.lastptrnode = thisptrnode
endifend
sub'建立新節點,並插入到ptrnode指向的節點的前面
public
sub insertnodetonext(byval ptrnode as
long, byval insertnode as node)
dim thisptrnode as
long
thisptrnode = newnode()
memory(thisptrnode).thisnode = insertnode
if memory(ptrnode).thisnode.lastptrnode = -1
then
'前面無節點
memory(ptrnode).thisnode.lastptrnode = thisptrnode
memory(thisptrnode).thisnode.lastptrnod = -1
memory(thisptrnode).thisnode.nextptrnod = ptrnode
else
memory(thisptrnode).thisnode.lastptrnod = memory(ptrnode).thisnode.lastptrnode
memory(thisptrnode).thisnode.nextptrnod = ptrnode
memory(ptrnode).thisnode.lastptrnod = thisptrnode
memory(memory(ptrnode).thisnode.lastptrnod).thisnode.nextptrnod = thisptrnode
endifend
sub
70 兩兩交換鍊錶中的節點
題目描述 給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 給定 1 2 3 4,你應該返回 2 1 4 3.如果可以只是交換值的話 如下 class solution listnode tem head while tem...
VBA之用模板建立表
有這樣乙個模板,想在此模板的基礎上,新建很多sheet,每個sheet對應乙個日期,並且表裡的報表日期和工作表名字一樣,如何去實現呢 sheets sheets.count name 5月 i 日 sheets sheets.count range e5 2016 5 i next end sub ...
VBA建立資料透視表
sub 透視表 dim ptc as pivotcache dim pvt as pivottable dim rng as range set rng sheet1.range a1 d45 資料來源 set ptc activeworkbook.pivotcaches.create source...