VBA7 0鍊錶

2021-08-14 16:16:54 字數 4269 閱讀 1670

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...