ايجاد ساختارهاي داده اي در ويژوال بيسيک
ايجاد ساختارهاي داده اي در ويژوال بيسيک
--------------------------------------------------------------------------------
بخش اول
مقدمه :
ساختارهاي داده اي از نظر تعداد اعضا به دو دسته استاتيک و ديناميک تقسيم مي شوند . ساختارهاي استاتيک مثل آرايه هاي يک بعدي و آرايه هاي دو بعدي ، تعداد اعضاي آنها در زمان طراحي برنامه مشخص مي شود و در طول اجراي برنامه ثابت است اما تعداد اعضاي ساختارهاي داده اي ديناميک در طول اجراي برنامه تغيير مي کند . ليست پيوندي ( LinkList ) ، پشته ( Stack ) ، صف ( Queue ) و درختهاي باينري ( Tree Binary) ، نمونه هايي از ساختارهاي داده اي ديناميک هستند .
ليست پيوندي شامل مجموعه اي از عناصر داده اي است که اضافه و حذف اعضا در هر جاي ليست ممکن است .
پشته يک ساختار داده اي مهم در کامپايلرها و سيستم هاي عامل است که عمل اضافه و حذف عناصر از ابتداي آن انجام مي شود .
صف يک ساختار داده اي است که عمل اضافه کردن از انتها و عمل حذف کردن از ابتداي آن انجام مي شود .
درختهاي دودويي براي جستجوي بسيار سريع ، ذخيره سازي داده ها و کامپايل عبارات استفاده مي شوند .
نوع داده Variant :
نوع داده variant براي متغيرهايي بکار مي رود که بطور صريح نوع آنها تعريف نشده است مثال :
Dim value As Variant
اين نوع داده مي تواند هر نوع داده اي را در خود ذخيره کند . همچنين براي ايجاد ساختارهاي داده اي مثل ليست هاي پيوندي ، صف ، پشته و درخت مناسب است .
نوع داده موجود در variant مي توان توسط توابع VarType و TypeName تعيين کرد . تابع VarType يک مقدار صحيح برمي گرداند که نشان دهنده نوع ذخيره شده در variant است .
مثال :
Dim value asVariant
value=”Hello”x
در اينصورت مقدار بازگشتي ( VarType( value برابر 4 خواهد بود .
تابع TypeName يک رشته برمي گرداند که نشان دهنده نام نوع داده ذخيره شده در variant است .
اخذ حافظه بطور ديناميک Dynamic MemoryAllocation :
براي ايجاد و نگهداري ساختارهاي داده اي ديناميک بايستي در هنگام اجراي برنامه بتوان فضاي بيشتري براي نگهداري داده هاي جديد بدست آورد . با استفاده از کلمه کليدي New مي توان در ويژوال بيسيک حاقظه ديناميک گرفت :
SetNewNode=New ListNode
که ListNode يک شي از ساختار داده اي مورد نظر ماست .
کلاسهاي خود ارجاعي :
کلاس خودارجاعي نوعي کلاس است که داراي يک اشاره گر ( Pointer ) به يک شي از همان نوع کلاس باشد . براي مثال اگر کلاس ما به اسم ClistNode باشد و متغير زير را در آن تعريف کنيم ، اين کلاس يک کلاس خود ارجاعي است :
Private mNextNode as ClistNode
از mNextNode براي لينک دادن اعضاي يک ساختار داده اي ديناميک بهم استفاده مي شود ( بعبارت ديگر گره زدن يک شي از کلاس ClistNode به يک شي ديگر از همان کلاس ) . شي هاي خودارجاعي مي توانند به همديگر لينک شوند و ساختارهاي داده اي مثل ليست پيوندي ، صف ، پشته و درخت را ايجاد کنند .
شکل زير دو شي خود ارجاعي را نشان مي دهد که بصورت يک ليست بهم لينک شده اند . عبارت NULL بدين معنا است که شي خودارجاعي به شي ديگري اشاره نمي کند ( Nothing ) و نشان دهنده انتهاي ساختار داده است .
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم
--------------------------------------------------------------------------------
ليست پيوندي
همانطور که گفته شد ليست پيوندي مجموعه اي از يکسري داده است که اين داده ها از نوع اشيا خودارجاعي هستند . ( هر شي خودارجاعي داراي يک متغير نوع variant براي نگهدار مقدار و يک اشاره گر به شي بعدي است ) . هر عضو ليست پيوندي را يک گره گويند . هر ليست پيوندي از طريق يک اشاره گر به اولين گره قابل دسترسي است . گره هاي بعدي از طريق قسمت لينک موجود در هر گره قابل دسترس هستند . همچنين لينک آخرين گره با Nothing تنظيم مي شود که انتهاي ليست را نشان مي دهد .
مزيت اصلي ليست هاي پيوندي نسبت به آرايه اينست که تعداد عناصر ليست پيوندي قابل تغيير است . بعبارت ديگر ليست هاي پيوندي بصورت ديناميک هستند و طول آنها قابل تغيير است اما سايز آرايه ثابت است . ( البته ويژوال بيسطک از آرايه هاي با سايز متغير نيز پشتيباني مي کند اما اين عمل تغيير سايز اتوماتيک نيست .)
عمل درج در ليست پيوندي ساده است و تنها بايستي دو اشاره گر تغيير يابد .
ليست هاي پيوندي را مي توان به سادگي با قراردادن هر عضو جديد در محل صحيح بصورت sortشده نگهداري کرد .
اعضاي ليست پيوندي در حافظه بصورت پيوسته ذخيره نمي شوند بنابراين نمي توان فوراً به هر عضو ليست دسترسي داشت ( بر خلاف آرايه ) .
براي ايجاد ليست پيوندي در ويژوال بيسيک نياز به سه کلاس است :
1 – کلاس ClistNode : کلاسي است که هر گره از ليست را توصيف مي کند :
private mNodeData as Variant
privatemNextNode as ClistNode
public Property Get Data() asVariant
Data=mNodeData
End Property
Public Property Let Dta(ByValvNewValue as Variant)x
MNodeData=vNewValue
End Property
Public PropertyGet NextNode() as ClistNode
Set NextNode=mNextNode
End Property
PublicProperty Let NextNode(Byval vNewValue as Variant)x
SetmNextNode=vNewValue
End Property
2 – کلاس Clist براي توصيف ليست پيوندي .mFirstNode براي اشاره به اولين ClistNode و mLastNode براي اشاره به آخرين ClistNode در يک شي clist بکار می رود . زمانيکه يک Clsit ايجاد مي شود اين دو متغير با Nothing تنظيم مي شوند . روال Property GetIterator يک شي ClistIterator برمي گرداند که مي توان از آن براي حرکت در بين اعضاي ليست استفاده کرد .
Private mFirstNode asClistNode
Private mLastNode as ClistNode
Public Function IsEmpty() asboolean
IsEmpty=IIf(mFirstNode Is Nothing,True,False)x
Endfunction
Public Sub InsertAtFront(insertItem as variant)x
Dim tempNode asClistNode
If IsEmpty() then
Set mFirstNode=New ClistNode
SetmLastNode=mFirstNode
Else
Set tempNode=mFirstNode
Set mFirstNode=NewClistNode
MFirstNode.NextNode=tempNode
Endif
MFirstNode.Data=insertItem
End sub
Public subInsertAtBack(insertItem as Variant)x
Dim tempNode as ClistNode
IfIsEmpty() then
Set mLastNode=New ClistNode
SetmFirstNode=mLastNode
Else
Set tempNode=mLastNode
Set mLastNode=NewClistNode
TempNode.NextNode=mLastNode
Endif
MLastNode.Data=insertItem
End sub
Public functionRemoveFromFront()x
Dim removeItem as Variant
If IsEmpty() then
Msgboxlist is empty
RemoveFromFront=Null
Exit function
Endif
RemoveItem=mFirstNode.Data
If mFirstNode Is mLastNode then
SetmFirstNode=Nothing
Set mLastNode=Nothing
Else
SetmFirstNode=mFirstNode.NextNode
End if
RemoveFromFront=removeItem
Endfunction
Public Function RemoveFromBack()x
Dim removeItem asVariant
Dim current as ClistNode
If IsEmpty() then
Msgboc list isempty
RemovefromBack=Null
Exit function
Endif
RemoveItem=mLastNode.Data
If mFirstNode Is mLastNode then
SetmFirstNode=nothing
Set mLastNode=Nothing
Else
Setcurrent=mFirstNode
While Not current.NextNode Is mLastNode
Setcurrent=current.NextNode
Wend
SetmLastNode=current
Current.NextNode=nothing
Endif
RemoveFromBack=removeItem
End function
Public property GetIterator() as variant
Dim iter as ClistIterator
Set iter=NewClistIterator
Iter.StartNode=mFirstNode
Set Iterator=iter
Endproperty
عملکرد روال InsertAtFront :
a – فراخواني IsEmpty براي تعيين خالي بودن ليست
b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به اولين گره ليست و سپس اشاره دادن mFirstNode به گره New ClsitNode و سپس اشاره دادن mFirstNode.NextNode به tempNode ساخته مي شود .
d – تنظيم mFirstNode.Data با مقدار مورد نظر
عملکرد روال InsertAtBack :
a – فراخواني IsEmpty براي تعيين خالي بودن ليست
b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به آخرين گره ليست و سپس اشاره دادن mLastNode به گره New ClsitNode و سپس اشاره دادن tempNode.NextNode به mLastNode ساخته مي شود .
d – تنظيم mLastNode.Data با مقدار مورد نظر
عملکرد روال RemoveFromFront :
a – اگر ليست خالي باشد Null برگشت داده مي شود .
b – اگر ليست خالي نباشد داده mFirstNode به removeItem اختصاص داده مي شود .
c – اگر ليست فقط يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
d – اگر گره بيش از يک عضو داشته باشد mFirstNode برابر mFirstNode.NextNode مي شود .
e – مقدار removeItem برگشت داده مي شود .
عملکرد روال RemoveFromBack :
a – اگر ليست خالي باشد Null برگشت داده مي شود .
b – اگر ليست خالي نباشد داده mLastNode به removeItem اختصاص داه مي شود .
c – اگر ليست يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
d – اگر ليست بيش از يک گره داشته باشد متغير current برابر mFirstNode مي شود . سپس با استفاده از current روي گره هاي ليست حرکت مي کنيم تا به گره اي برسيم که به آخرين گره اشاره مي کند . سپس mLastNode را به گره اي که current به آن اشاره مي کند قرار مي دهيم و مقدار current.NextNode را Nothing مي کنيم تا بعنوان آخرين گزه ليست معرفي شود .
e – مقدار removeItem برگشت داده مي شود .
3 – کلاس ClistIterator : اين کلاس براي حرکت روي گره هاي ليست و دستکاري هر گره بکار مي رود . از حرکت کننده ها براي چاپ ليست و يا انجام دادن عملي بر روي هر عضو Clist مي توان استفاده کرد . اين کلاس داراي دو متغير از نوع ClistNode به نامهاي mBookmark و mFirstNode است . متغير mFirstNode به اولين گره در Clist اشاره مي کند و متغير mBookmark موقعيت فعلي حرکت کننده بر روي Clist را نشان مي دهد . روال Property Let StartNode اين دو متغير را مقدار دهي اوليه مي کند . تابع NextItem اگر مقدار mBookmark برابر Null باشد ، Null برگشت مي دهد و در غيراينصورت مقدار tempData را برابر mBookmark.Data و مقدار mBookmark را برابر mBookmark.NextNode قرار مي دهد . تابع HasMoreItems اگر ليست داراي چندين عضو باشد True برمي گرداند . روال ResetBookmark حرکت کننده را به ابتداي ليست منتقل مي کند .
Private mBookmark asClistNode
Private mFirstNode as ClistNode
Public Property LetStartNode(Byval vNewValue as variant)x
Set mFirstNode=vNewValue
SetmBookmark=mFirstNode
End property
Public function NextItem()x
DimtempData as varaint
IfmBookmark Is nothingthen
NextItem=Null
Else
TempData=mBookmark.Data
SetmBookmark=mBookmark.NextNode
NextItem=tempData
End if
Endfunction
Public function HasMoreItems() as boolean
HasMoreItems=IIf(NotmBookmark Is nothing,True,False)x
End function
Public subResetmBookmark()x
MBookmark=mFirstNode
End sub
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم
--------------------------------------------------------------------------------
مثالی از استفاده از کلاسهای ليست پيوندی :
ابتدا کلاسهايي که در جلسه قبل معرفی شد را به پروژه تان اضافه کنيد . سپس در بخش کدنويسی فرمتان ، ابتدا يک شی از نوع کلاس Clist بصورت زير تعريف کنيد :
Dim list as NewClist
در فرمتان سه CommandButton با نامهای AddFirst ، AddLast و ShowList و نيز يک TextBox با نام ListMember قرار دهيد .
کد زير را برای رويداد کليک شدن دکمه AddFirst بنويسيد :
Calllist.InsertAtFront(ListMember.text)x
کد زير را برای رويداد کليک شدن دکمه AddLast بنويسيد :
Calllist.InsertAtBack(ListMember.text)x
کد زير را برای رويداد کليک شدن دکمه ShowList بنويسيد :
Dim elements as NewClistIterator
Set elements=list.Iterator
If elements.HasMoreItems=falsethen msgbox ("list is empty")x
Else
Whileelements.HasMoreItems
Msgbox(elements.NextItem)x
Wend
endif
پشته :
پشته نوعي ليست پيوندي است که گره هاي جديد ، فقط به انتهاي آن مي توانند اضافه شوند . بهمين دليل به پشته ، ساختمان داده LIFO مي گويند . قسمت لينک آخرين گره پشته با Nothing مقدار دهي مي شود که نشان دهنده پايين پشته است .
روالهاي اصلي پشته Push و Pop هستند .
Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم
--------------------------------------------------------------------------------
کلاس پشته :
همانطور که در بخش قبل گفته شد پشته نوعی ليست پيوندی است که گره هاي جديد فقط به انتهاي آن اضافه شوند . روالهاي اصلي پشته Push و Pop هستند .
Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .
يک کلاس پشته را با استفاده از کلاس Clist و بصورت زير پياده سازي مي کنيم :
Private list As New Clist
Public SubPush(value as Variant)x
List.InsertAtFront(value)x
End sub
PublicFunction Pop As Variant
Pop=list.RemoveFromFront()x
End Function
PublicFunction IsStackEmpty() As Boolean
IsStackEmpty=list.IsEmpty()x
Endfunction
Public Property Get Iterator() as variant
SetIterator=list.Iterator
End Property
در اين کلاس ابتدا يک شی از نوع کلاس Clist تعريف شده است . سپس متدهای Push توسط متد InsertAtFront و Pop توسط متد RemoveFromFront پياده سازی شده اند .
يک برنامه نمونه :
برای نوشتن يک برنامه برای کار با پشته ابتدا کلاس Stack را که کد آن را در بالا ديديد به پروژه تان اضافه کنيد . سپس در بخش کد مربوط به فرمتان ابتدا يک شی از نوع کلاس Stack بصورت زير تعريف کنيد :
Dim mStack as NewStack
سپس در فرمتان سه CommandButton با نامهای Push و Pop و ShowStack و نيز يک TextBox با نام StackMember قرار دهيد .
کد زير را برای کليک شدن دکمه Push بنويسيد :
mStack.push(StackMember.text)x
کد زير را برای کليک شدن دکمه Pop بنويسيد :
StackMember.text=mStack.Pop()x
کد زير را برای کليک شدن دکمه ShowStack بنويسيد :
Dim elements as NewClistIterator
Set elements=mStack.Iterator
If elements.HasMoreItems=falsethen msgbox "stack is empty"x
Else
While elemets.HasMoreItems
Msgboxelements.NextItem
Wend
__________________
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم
صف :
صف نوعي ساختار داده اي استکه گره ها از ابتداي صف ( سر صف head ) حذف مي شوند و از انتهاي صف ( ته صف tail ) اضافه مي شوند . بنابر اين ، صف يک ساختار داده اي FIFO است . صف دارای دو متد بهنامهای AddQueue و DelQueue است که اولین متد ، عنصری را به انتهای صف اضافه می کندو دومين متد ، عنصری را از ابتدای صف حذف می کند .
براي ايجاد کلاس Cqueue ازکلاس Clist استفاده مي کنيم :Private list as New Clist
Public Sub AddQueue(value as Variant)x
List.InsertAtBack(value)
End sub
Public Function DelQueue() as Variant
DelQueue=list.RemoveFromFront
End function
Public property Get Iterator() as Variant
Set Iterator=list.Iterator
End Property
درخت :
ليستهاي پيوندي ، پشته ها وصف ها جزو ساختارهاي داده اي خطي هستند در حاليکه يک درخت ، يک ساختار داده اي دوبعدي با خصوصيات ويژه اي است . گره هاي درخت داراي دو يا چند لينک هستند . در اينجادر مورد درختهاي دودويي يا باينري بحث مي کنيم که در آن همه گره ها داراي دو لينکهستند . گره ريشه اولين گره در درخت است . هر لينک گره ريشه ، به يک فرزند اشاره ميکند . به فرزندان يک گره Siblings مي گويند . به گره بدون فرزند ، برگ يا Leaf گفتهمي شود .
درختهاي جستجوي باينري درخت هايي هستند که در آنها مقدار فرزند چپ هرگره کمتر از گره پدر و مقدار فرزند سمت راست هر گره بيشتر از گره پدر مي باشد.
__________________
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم
--------------------------------------------------------------------------------
کلاس درختهای جستجوی باينری
برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم :
1 - کلاس CTreeNode که هر ند درخت دودويي را توصيف می کند . اين کلاس دارای يک متغير به نام mNodeData از نوع Variant برای نگهداری داده هر گره است . همچنين دارای دو متغير اشاره گر به نامهای mLeft و mRight می باشد که به ترتيب به فرزند چپ و فرزند راست درخت اشاره می کنند .
متد Get Data مقدار داده هر گره را بر می گرداند و متد Let Data مقدار داده هر گره را تنظيم می کند .
متد Get Left آدرس فرزند چپ هر گره را برمی گرداند و متد Let Left فرزند چپ هر گره را تنظيم می کند .
متد Get Right آدرس فرزند راست هر گره را برمی گرداند و متد LetRight فرزند راست هر گره را تنظيم می کند .
متد Insert برای اضافه کردن فرزند به يک گره به کار می رود . اگر مقدار گره ای که می خواهيم بعنوان فرزند به درخت اضافه کنيم کوچکتر از مقدار خود گره باشد بعنوان فرزند چپ و در غير اينصورت بعنوان فرزند راست به گره اضافه می شود . اضافه شدن نيز بدين صورت است که ابتدا بررسی می شود آیا گره قبلاً فرزندی داشته است يا نه ؟ اگر نداشته باشد ( mLeft و يا mRight برابر Nothing باشد ) اين گره جديد مستقيماً به گره متصل می شود اما اگر گره قبلاً فرزندی داشته باشد متد Insert برای آن فرزند اضافه می شود و اينکار تا جايی ادامه می يابد که به گره ای برسيم که فرزندی نداشته باشد :
Private mLeft as CtreeNode
PrivatemRight as CtreeNode
Private mNodeData as Variant
Public Property GetData() as variant
Data=mNodeData
End property
Public Property LetData(Byval vNewValue as Variant)x
MNodeData=vNewValue
Endproperty
Public Property Get Left() as variant
Set Left=mLeft
Endproperty
Public Property Let Left(Byval vNewValue as variant)x
SetmLeft=vNewValue
End property
Public Property Get Right() asvariant
Set Right=mRight
End Property
Public Property Let Right(ByvalvNewValue as variant)x
Set mRight=vNewValue
End Property
Public SubInsert(value as variant)x
If value
If mLeft Is NothingThen
Set mLeft=NewCtreeNode
MLeft.Data=value
Else
MLeft.Insert(value)x
Endif
Elseif value>mNodeData then
If mRight Is Nothing then
SetmRight=NewCtreeNode
MRight.Data=value
Else
MRight.Insert(value)x
End if
Endif
End sub
2 - کلاس CTree : اين کلاس برای ايجاد درخت بکار می رود . اين کلاس دارای متغيری بنام mRoot از نوع CTreeNode برای تعريف ريشه درخت است . همچنين يک متغير mOutputString برای نمايش دادن اعضای درخت دارد .
Private mRoot as CtreeNode
PrivatemOutputString as String
Public Sub InsertNode(value as Varaint)x
IfmRoot Is Nothing then
Set Mnode=NewCtreeNode
MRoot.Data=value
Else
MRoot.Insert(value)x
End if
Endsub
Public PreorderTraversal()x
MOutputString=””x
CallPreorderHelper(mRoot)x
End sub
Private Sub PreorderHelper(node AsCtreeNode)x
If node Is nothing Then
Exit sub
Endif
MOutputString=mOutputString & node.Data & “ “x
CallPreorderHelper(node.left)x
Call PreorderHelper(node.right)x
Endsub
Public Sub InorderTraversal()x
MOutputString=””x
CallInorderHelper(mRoot)x
End sub
Private Sub InorderHelper(node asCtreeNode)x
If node Is nothing then
Exit sub
End if
CallInorderHelper(node.Left)x
MOutputString=mOutputString & node.Data & “ “x
Call InorderHelper(node.Right)x
End sub
PublicPostorderTraversal()x
MOutputString=””x
CallPostorderHelper(mRoot)x
End sub
Private Sub PostorderHelper(node asCtreeNode)x
If node Is Nothing then
Exit sub
End if
CallPostorderHelper(node.Left)x
CallPostorderHelper(node.Right)x
MOutputString=mOutputString & node.Data & “ “x
End sub
Public Property Get Output() asVaraint
Output=mOutputString
End Property
__________________
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی
--------------------------------------------------------------------------------
انواع روشهای پيمايش عناصر درخت :
۱ - روش InOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس ريشه و در آخر عناصر نيمه سمت راست درخت نمايش داده می شوند .
۲ - روش PreOrder : در اين روش ابتدا ريشه درخت ، سپس عناصر نيمه سمت چپ و در پايان عناصر نيمه سمت راست درخت نمايش داده می شوند .
۳ - روش PostOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس عناصر نيمه سمت راست درخت و در پايان ريشه درخت نمايش داده می شوند .
بررسی متدهای کلاس CTree :
متد InsertNode : اگر گره ريشه برابر Null باشد value را برابر مقدار گره ريشه قرار می دهد . در غير اينصورت متد Insert مربوط به گره ريشه فراخوانی می شود .
متد PreorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Preorder را فراخوانی می کند .
متد InorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Inorder را فراخوانی می کند .
متد PostorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Postorder را فراخوانی می کند .
متد Get Output : عناصر پيمايش شده درخت را برمی گرداند .
يک برنامه نمونه :
ابتدا کلاسهای CTreeNode و CTree را به پروژه تان اضافه کنيد . سپس متغير زير را در قسمت کدنويسی فرمتان تعريف کنيد :
Dim mTree as NewCtree
سپس در فرمتان يک Textbox با نام Value و دو Command Button با نامهای Insert و Show قرار دهيد .
کد زير را برای وارد کردن عنصر به درخت برای دکمه Insert بنويسيد :
mTree.InsertNode(Value.Text)x
کد زير را برای پيمايش InOrder درخت برای دکمه Show بنويسيد :
CallmTree.InorderTraversal
شي Collection :
ويژوال بيسيک داراي شي پيش ساخته اي به نام Collection است که مي تواند مجموعه اي از مقادير با هر نوع داده اي را در خود ذخيره کند . در واقع عناصر موجود در يک Collection مي توانند داراي نوعهاي داده اي متفاوت باشند . شي Collection قابليت رشد ديناميک دارد .
شي Collection توسط کلمه کليدي New ايجاد مي شوند . توسط متد Add مي توان به Cllection عضو اضافه کرد و توسط متد Remove مي توان عضوي را از آن حذف کرد . هر عضو از Collection توسط متد Item قابل دستيابي است . با استفاده از خاصيت Count مي توان تعداد اعضاي موجود در Collection را تعيين نمود . بصورت پيش فرض اعضاي جديد به انتهاي Collection اضافه مي شوند ولي توسط آرگومانهاي اختياري متد Add مي توان محل اضافه شدن را تغيير داد .
متد Remove يک شماره مي گيرد که موقعيت عضوي را که مي خواهيم آنرا حذف کنيم مشخص مي کند .
توسط دستورات زير مي توان اعضاي يک Collection را نمايش داد :
Dim mCollection as NewCollection
Dim element as Variant
.
.
.
For Each element InmCollection
Msgbox element
element متغيري از نوع variant براي اشاره به هر عضو Collection مي باشد .
__________________