ورود / ثبت نام
0
0

ایجاد ساختارهای داده ای در ویژوال بیسیک – بخش دوم

141 بازدید
لیست پیوندی

همانطور که گفته شد لیست پیوندی مجموعه ای از یکسری داده است که این داده ها از نوع اشیا خودارجاعی هستند . ( هر شی خودارجاعی دارای یک متغیر نوع variant برای نگهدار مقدار و یک اشاره گر به شی بعدی است ) . هر عضو لیست پیوندی را یک گره گویند . هر لیست پیوندی از طریق یک اشاره گر به اولین گره قابل دسترسی است . گره های بعدی از طریق قسمت لینک موجود در هر گره قابل دسترس هستند . همچنین لینک آخرین گره با Nothing تنظیم می شود که انتهای لیست را نشان می دهد .
مزیت اصلی لیست های پیوندی نسبت به آرایه اینست که تعداد عناصر لیست پیوندی قابل تغییر است . بعبارت دیگر لیست های پیوندی بصورت دینامیک هستند و طول آنها قابل تغییر است اما سایز آرایه ثابت است . ( البته ویژوال بیسطک از آرایه های با سایز متغیر نیز پشتیبانی می کند اما این عمل تغییر سایز اتوماتیک نیست .)
عمل درج در لیست پیوندی ساده است و تنها بایستی دو اشاره گر تغییر یابد .
لیست های پیوندی را می توان به سادگی با قراردادن هر عضو جدید در محل صحیح بصورت sortشده نگهداری کرد .
اعضای لیست پیوندی در حافظه بصورت پیوسته ذخیره نمی شوند بنابراین نمی توان فوراً به هر عضو لیست دسترسی داشت ( بر خلاف آرایه ) .
برای ایجاد لیست پیوندی در ویژوال بیسیک نیاز به سه کلاس است :

۱ – کلاس ClistNode : کلاسی است که هر گره از لیست را توصیف می کند :

private mNodeData as Variant
private mNextNode as ClistNode
public Property Get Data() as Variant
Data=mNodeData
End Property
Public Property Let Dta(ByVal vNewValue as Variant)x
MNodeData=vNewValue
End Property
Public Property Get NextNode() as ClistNode
Set NextNode=mNextNode
End Property
Public Property Let NextNode(Byval vNewValue as Variant)x
Set mNextNode=vNewValue
End Property

۲ – کلاس Clist برای توصیف لیست پیوندی .
mFirstNode برای اشاره به اولین ClistNode و mLastNode برای اشاره به آخرین ClistNode در یک شی clist بکار می رود . زمانیکه یک Clsit ایجاد می شود این دو متغیر با Nothing تنظیم می شوند . روال Property Get Iterator یک شی ClistIterator برمی گرداند که می توان از آن برای حرکت در بین اعضای لیست استفاده کرد .

Private mFirstNode as ClistNode
Private mLastNode as ClistNode
Public Function IsEmpty() as boolean
IsEmpty=IIf(mFirstNode Is Nothing,True,False)x
End function
Public Sub InsertAtFront(insertItem as variant)x
Dim tempNode as ClistNode
If IsEmpty() then
Set mFirstNode=New ClistNode
Set mLastNode=mFirstNode
Else
Set tempNode=mFirstNode
Set mFirstNode=New ClistNode
MFirstNode.NextNode=tempNode
End if
MFirstNode.Data=insertItem
End sub
Public sub InsertAtBack(insertItem as Variant)x
Dim tempNode as ClistNode
If IsEmpty() then
Set mLastNode=New ClistNode
Set mFirstNode=mLastNode
Else
Set tempNode=mLastNode
Set mLastNode=New ClistNode
TempNode.NextNode=mLastNode
End if
MLastNode.Data=insertItem
End sub
Public function RemoveFromFront()x
Dim removeItem as Variant
If IsEmpty() then
Msgbox list is empty
RemoveFromFront=Null
Exit function
End if
RemoveItem=mFirstNode.Data
If mFirstNode Is mLastNode then
Set mFirstNode=Nothing
Set mLastNode=Nothing
Else
Set mFirstNode=mFirstNode.NextNode
End if
RemoveFromFront=removeItem
End function
Public Function RemoveFromBack()x
Dim removeItem as Variant
Dim current as ClistNode
If IsEmpty() then
Msgboc list is empty
RemovefromBack=Null
Exit function
End if
RemoveItem=mLastNode.Data
If mFirstNode Is mLastNode then
Set mFirstNode=nothing
Set mLastNode=Nothing
Else
Set current=mFirstNode
While Not current.NextNode Is mLastNode
Set current=current.NextNode
Wend
Set mLastNode=current
Current.NextNode=nothing
End if
RemoveFromBack=removeItem
End function
Public property Get Iterator() as variant
Dim iter as ClistIterator
Set iter=New ClistIterator
Iter.StartNode=mFirstNode
Set Iterator=iter
End property

عملکرد روال 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 برگشت داده می شود .

۳ – کلاس 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 as ClistNode
Private mFirstNode as ClistNode
Public Property Let StartNode(Byval vNewValue as variant)x
Set mFirstNode=vNewValue
Set mBookmark=mFirstNode
End property
Public function NextItem()x
Dim tempData as varaint
If mBookmark Is nothing then
NextItem=Null
Else
TempData=mBookmark.Data
Set mBookmark=mBookmark.NextNode
NextItem=tempData
End if
End function
Public function HasMoreItems() as boolean
HasMoreItems=IIf(Not mBookmark Is nothing,True,False)x
End function
Public sub ResetmBookmark()x
MBookmark=mFirstNode
End sub

  • پسورد: www.mspsoft.com
آیا این مطلب را می پسندید؟
https://www.mspsoft.com/?p=651
اشتراک گذاری:
واتساپتوییترفیسبوکپینترستلینکدین
مسعود شریفی پور
از سال 88 که با برنامه نویسی آشنا شدم خیلی علاقه مند بودم یک بستر آموزشی بسازم در فضای وب و به انتشار آموزش های در این زمینه بپردازم.حالا یک تیم داریم و با قدرت رو به جلو حرکت میکنیم.
مطالب بیشتر
برچسب ها:

نظرات

2 نظر در مورد ایجاد ساختارهای داده ای در ویژوال بیسیک – بخش دوم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *