VB中的資料結構使用

2021-04-17 08:40:39 字數 2793 閱讀 7160

最近因為在使用vb的過程中,發現要使用一些資料結構,雖然不像c裡面那樣方便,但總結一下,還是可以做的,雖然不是很習慣。以饗各位。

為便於理解陣列的作用,我們引入資料項和指標項的概念,在資料項中存放陣列中各元素的值,指標項中存放該值在陣列中的位置,兩者一一對應。指標的上限指向陣列第乙個元素的位置,下限指向最末乙個元素的位置。陣列中的元素在記憶體中是連續的線性的節點序列,這種線性的資料結構是應用最廣泛,最簡單的一種資料結構。

自定義資料型別(type statement)可以包含多個互相關聯的不同資料型別的元素,vb限定宣告乙個自定義資料型別必須在模組層(module level)進行。宣告了乙個自定義資料型別後便可以定義乙個那種型別的變數。

1.用名為queue的自定義資料型別宣告乙個固定大小的陣列:

type queue

data as integer 』用作資料項

next as integer 』用作指標項

end type

const  max=10

dim a(10) as queue

設a( i )為陣列中的乙個元素,該元素的指標指向陣列a(10)第i+1個元素,其下標為i ,指標的值為i 。需要指出的是資料結構不同於資料型別,也不同於資料型別宣告的物件(變數)。資料結構不僅描述資料型別的資料物件,而且要描述資料物件各元素之間的各種運算。為了弄清自定義資料型別的作用,我們規定變數data存放元素的值(作資料場用),變數next存放緊接本元素後的元素的指標。通過用自定義資料型別queue宣告陣列a(10)和對變數next作專門規定,可以發現,我們能將一片連續的線性分布的資料存放在記憶體中非線性的不連續的位址空間裡,卻不影響我們對其進行線性的運算操作。

像這種利用指標把各個元素鏈結起來的結構被稱為鍊錶,類似例1定義的陣列均可作為鍊錶使用。

例 用queue將a(10)初始化為乙個單向鏈結表:

for i = 0 to 9

a( i ).next = i + 1 』 i + 1為下乙個元素的指標

a( i ).data=10*rnd

next i

2.棧和佇列

棧是常用的資料結構。在visual basic程式設計中,棧可以用來實現遞迴作用;或者是將陣列和鍊錶中因刪除而空閒的資源**利用,避免出現一邊是資源空閒,一邊陣列或鍊錶長度不斷增長的尷尬局面。棧可以用一維陣列或鍊錶作儲存結構。用陣列來實現既容易又方便,此時用指標變數top1指向陣列結點,每次有元素進棧棧頂指標top1=top1+1,a(top1).data= 10*rnd,每次有元素出棧top1=top1-1,b= a(top1).data 。當top1=0棧空,top1等於陣列上限時棧滿。

與棧的在一頭進出方式不同,佇列是先進先出的資料結構,佇列也可以用一維陣列或鍊錶作儲存結構。隊運算中要使用兩個指向隊頭和隊尾的指標變數top1、bottom,最後進隊元素的指標等於隊頭指標top1,隊中最先進隊元素的指標等於隊尾指標bottom,當top1=bottom時隊空,初始條件為top1=bottom=0,當top1+1=bottom(陣列)或a(top1).next=bottom(鍊錶)時隊滿。有元素進隊時top1=top1+1(陣列)或top1=a(top1).next(鍊錶);有元素出隊時bottom=bottom+1(陣列)或bottom = a(bottom).next(鍊錶)。

使用固定大小的陣列總會遇到棧滿或隊滿的情形,我們可以使用動態陣列來避免,動態陣列是visual basic靈活性、便捷性的重要特徵,它可以有效地管理記憶體。在例3中還通過引入變數linshi實現了當隊滿時在鍊錶中插入乙個節點的操作。在鍊錶中刪除乙個節點的操作與此類似。

例:佇列的進隊及出隊操作,利用上例定義的迴圈鍊錶並假設已按例2進行了初始化。

dim top1 as integer』定義指向隊頭的指標變數

dim bottom as integer』定義指向隊尾的指標變數

dim linshi          』變數

public function removequeue(a1 as integer)  '出隊函式

if bottom = top1 then    'bottom = top1隊空

debug.print "隊空"

top1 = 0: bottom = 0

else

bottom = a(bottom).next   'bottom指標後移,為元素出隊作準備

j = a(bottom).data        '元素a1出隊

debug.print "出隊,b, j", bottom, j

end if

end function

public function insertqueue(byval a1 as integer)   '進隊函式

if a(top1).next = bottom then   'a(top1).next = bottom隊滿

max=max+1

redim preserve a(max) as queue

linshi = a(top1).next   '隊滿,準備插入新節點

a(top1).next = max    '插入新節點的指標

top1 = max    'top1指標指向新位置,為新元素a1進隊作準備

a(top1).next = linshi  '新節點插入結束

a(top1).data = a1     '新元素a1進隊

else

top1 = a(top1).next '隊不滿,top1指標後移,新元素a1準備進隊

a(top1).data = a1   '新元素a1進隊

debug.print "進隊,t,i", top1, a(top1).data

end if

end function

資料結構中雙指標的使用

我們在學習資料結構中的線性表,或者棧佇列的時候都遇到了初始化需要傳雙指標,初學者很不好理解為什麼要傳遞雙指標。我根據我個人學習的經驗寫了這個文章,希望對初學者有一些幫助。同時有不對的地方希望大神們補充。我們先簡單介紹函式呼叫時的三種引數傳遞的方法吧 1.簡單的值傳遞 這是函式引數傳遞中最簡單的一種,...

C 資料結構中演算法的使用

時間複雜度其實就是乙個函式進行運算時執行的基本操作的次數 運算分類的分析 1.最壞的情況 任意輸入規模的最大次數 2.平均情況 任意輸入規模等與平均次數 3.最好的情況 任意輸入規模的最少次數 當然在實際情況下我們通常考量的最大執行次數,也就是任意輸入規模,演算法執行的最長時間,例如 1.乙個程式執...

資料結構 佇列的使用

toj 4368描述 請你定義乙個佇列,可以對佇列進行 入隊 出隊 佇列輸出 等操作。鍵盤輸入一些命令,可以執行上述操作。本題中,佇列中元素均為整數。佇列的最大元素個數為1000。輸入 輸入各個命令,它們對應的格式如下 入隊 enq x,x代表入隊的元素,這裡enq和元素之間用空格分隔。佇列輸出 p...