210 likes | 306 Views
רשימה מקושרת Linked Lists. בעיה ?. STRING איך עושים Dim x as String בלי לדעת מראש את הגודל!. A. C. B. . רשימה מקושרת. Head. Linked Lists. A. C. B. A. Linked Lists – רשימה מקושרת. רשימה מקושרת היא סדרה של יחידות מקושרות לכל יחידה קוראים קדקוד ( node )
E N D
בעיה ? • STRING • איך עושים Dim x as String בלי לדעת מראש את הגודל!
A C B רשימה מקושרת Head Linked Lists
A C B A Linked Lists – רשימה מקושרת • רשימה מקושרת היא סדרה של יחידות מקושרות • לכל יחידה קוראים קדקוד (node) • בכל קדקוד (node) יש לכל הפחות • יחידה של מידע (מסוג כלשהו) • מצביע לקדקוד הבא ברשימה. • Head– מצביע לראש הרשימה • הקדקוד האחרון מצביע לNULL Head node data pointer מתורגם מ -www.cs.ust.hk/~qyang/171/linked-list.ppt
איך בנויה רשימה מקושרת? • קדקוד (NODE או LINK) • המידע ששומרים (או אוסף המידע) • קישור לקדקוד הבא (מדי פעם גם לקדקוד הקודם) • מחלקה לניהול הקדקודים (LINKED LIST) • משתנה לשמירת המקום של הקדקוד הראשון • פונקציית בנאי (CONSTRUCTOR) ליצירת קדקוד ראשון • פונקציית עזר (PRINT, ADD, DELETE, וכו')
A C B Z ניהול הקדקודים - הוספת קדקוד • נרצה להוסיף קדקוד Z בין B ל C • תחילה יש למצוא את B • מתחילים מHead ובודקים כל קדקוד, עד שמוצאים את B • כשמוצאים את B דוחפים אחריו את Z ומסדרים את הקשרים Head
D C B A ניהול הקדקודים - הורדת קדקוד • נרצה להוריד את קדקוד B • תחילה יש למצוא את B • מתחילים מHead ובודקים כל קדקוד, עד שמוצאים את B • כשמוצאים את B מסדרים את הקשרים ומוחקים אותו Head
דרך אחרת לחשוב על רשימה מקושרת • כל קדקוד קשור לקדקוד שבא אחריו • כלומר במקום המצביע שהיה לנו קודם, נשחיל את הקדוקודים אחד בשני
נבנה רשימה מקושרת בעזרת מחלקות • נבנה מחלקה Link • המחלקה מתארת קודקוד (חוליה בודדת בשרשרת) • נבנה מחלקה LinkedList • המחלקה מתארת את השרשרת ובנויה מLinks
מבנה המחלקה Link • משתנים • מידע השמור בחוליה (integer, string, structure…) • הקדקוד הבא (החוליה שמושחלת בתוך החוליה הנוכחית) • למחלקה יש את המתודות הבאות: • שני בנאים • אחד ליצירת הקדקוד הראשון, המקבלת רק מידע • אחד ליצירת קדקוד שנוסף לרשימה קיימת, המקבלת מידע ואת החוליה הקודמת • מתודה שמחזירה את המידע מהקדקוד • מתודה שמחזירה את הקדקוד הבא
דוגמא של LINK PublicClassLink PrivatetheStringAsString PrivatetheLinkAsLink PublicSubNew(ByValtheDataAsString, ByValmyParentAsLink) ?? EndSub PublicSubNew(ByValtheDataAsString) ?? EndSub FunctionGetData() AsString ?? EndFunction FunctionGetLink() AsLink ?? EndFunction EndClass
Me • כאשר אנו כותבים את המחלקה, אנחנו מייצרים "תכנון" של המחלקה • בזמן ריצה מיוצרים אובייקטים, שהם מימוש לפי התכנון הנ"ל • בזמן ריצה: Me מצביע לאובייקט עצמו
דוגמא של LINK PublicClassLink PrivatetheStringAsString PrivatetheLinkAsLink PublicSubNew(ByValtheDataAsString, ByValmyParentAsLink) theString = theData myParent.theLink = Me EndSub PublicSubNew(ByValtheDataAsString) theString = theData EndSub FunctionGetData() AsString ReturntheString EndFunction FunctionGetLink() AsLink ReturntheLink EndFunction EndClass
מבנה המחלקה LinkedList • משתנים • הקדקוד הנוכחי • הקדקוד הראשון • אורך הרשימה • למחלקה יש את המתודות הבאות: • בנאי • מתודה שמוסיפה קדקוד • מתודה שמחזירה את הקדקוד הבא • מתודה שמחזירה את הקדקוד הנוכחי • מתודה שמחזירה את הקדקוד הראשון • בסוף נוסיף גם מתודת הדפסה
בניית המחלקה LINKEDLIST - המשתנים PublicClassLinkedList PrivateFirstLinkAsLink PrivateCurrentLinkAsLink Private Size AsInteger EndClass
המחלקה LINKEDLIST – הוספת בנאי PublicClassLinkedList PrivateFirstLinkAsLink PrivateCurrentLinkAsLink Private Size AsInteger PublicSubNew(ByValtheDataAsString) FirstLink = NewLink(theData) CurrentLink = FirstLink Size = 1 EndSub EndClass
PublicClassLinkedList PrivateFirstLinkAsLink PrivateCurrentLinkAsLink Private Size AsInteger PublicSubNew(ByValtheDataAsString) FirstLink = NewLink(theData) CurrentLink = FirstLink Size = 1 EndSub PublicFunctionMakeLink(ByValtheDataAsString, ByVal last AsLink) AsLink ?? EndFunction FunctionGetNextLink(ByValaLinkAsLink) AsLink ?? EndFunction FunctionGetCurrentLink() AsLink ?? EndFunction FunctionGetFirstLink() AsLink ?? EndFunction EndClass המחלקה LINKEDLIST – הוספת מתודות
תוכן המתודות של LINKEDLIST PublicClassLinkedList PrivateFirstLinkAsLink PrivateCurrentLinkAsLink Private Size AsInteger PublicSubNew(ByValtheDataAsString) FirstLink = NewLink(theData) CurrentLink = FirstLink Size = 1 EndSub PublicFunctionMakeLink(ByValtheDataAsString, ByVal last AsLink) AsLink CurrentLink = NewLink(theData, last) Size = Size + 1 ReturnCurrentLink EndFunction FunctionGetNextLink(ByValaLinkAsLink) AsLink ReturnaLink.GetLink() EndFunction FunctionGetCurrentLink() AsLink ReturnCurrentLink EndFunction FunctionGetFirstLink() AsLink ReturnFirstLink EndFunction EndClass
PublicClassLinkedList PrivateFirstLinkAsLink PrivateCurrentLinkAsLink Private Size AsInteger PublicSubNew(ByValtheDataAsString) FirstLink = NewLink(theData) CurrentLink = FirstLink Size = 1 EndSub PublicFunctionMakeLink(ByValtheDataAsString, ByVal last AsLink) AsLink CurrentLink = NewLink(theData, last) Size = Size + 1 ReturnCurrentLink EndFunction FunctionGetNextLink(ByValaLinkAsLink) AsLink ReturnaLink.GetLink() EndFunction FunctionGetCurrentLink() AsLink ReturnCurrentLink EndFunction FunctionGetFirstLink() AsLink ReturnFirstLink EndFunction PublicSubPrintAll() DimiAsInteger Dim temp AsLink = FirstLink Fori = 0 To Size - 1 Console.WriteLine("Contents of Place " & i & " is :") Console.WriteLine(temp.GetData) 'temp = temp.GetLink temp = GetNextLink(temp) Next EndSub EndClass הוספת מתודת הדפסה LINKEDLIST
שימוש במחלקה (MAIN) Sub Main() Dim List AsNewLinkedList("Avi") DimaLinkAsLink = List.GetCurrentLink aLink = List.MakeLink("Bob", aLink) aLink = List.MakeLink("Chaim", aLink) List.PrintAll() EndSub
שיפורים??? • להדפיס טווח של קדקודים • להדפיס את הרשימה בסדר יורד • חיפוש אחרי מידע (ולהחזיר את התא או התאים שבו הוא נמצא) • שינוי של הNODE להכניס כמה סוגי מידע • איך??????