מבוא כללי למדעי המחשב רשימות מקושרות www.cs.tau.ac.il/courses/cs4math/09b 3579.

Slides:



Advertisements
Similar presentations
מבוא למדעי המחשב לתעשייה וניהול
Advertisements

1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
רשימה מקושרת Linked Lists. דוגמא STRING איך עושים Dim x as String בלי לדעת מראש את הגודל !
תכנות תרגול 11 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
שאלות חזרה לבחינה. שאלה דיסקים אופטיים מסוג WORM (write-once-read-many) משמשים חברות לצורך איחסון כמויות גדולות של מידע באופן קבוע ומבלי שניתן לשנותו.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
Backpatching 1. תזכורת מתרגול קודם קוד ביניים - שפת הרביעיות שיטות לייצור קוד ביניים –שימוש בתכונת code –כתיבה ישירה ל-buffer של פקודות שיטות לתרגום מבני.
תכנות – שיעור 7. חזרה -מערכים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים זהים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים.
מערכות הפעלה ( אביב 2009) חגית עטיה ©1 מערכת קבצים log-structured  ה log הוא העותק היחיד של הנתונים  כאשר משנים בלוק (data, header) פשוט כותבים את הבלוק.
תכנות תרגול 14 שבוע:
תכנות תרגול 14 שבוע : רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.
ערכים עצמיים בשיטות נומריות. משוואה אופינית X מציין וקטור עצמי מציינת ערך עצמי תואם לוקטור.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
תכנות תרגול 12 שבוע : הקצאת זיכרון דינאמית הזיכרון המקסימאלי ששימש את התוכנית שלנו עד היום היה קבוע מראש. לפני הרצת התוכנית, לאחר שהתוכנית עברה.
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Data Structures, CS, TAU, Perfect Hashing 1 Perfect Hashing בעיה : נתונה קבוצה S של n מפתחות מתחום U השוואה ל - Hash : * טבלה קבועה (Hash רגיל - דינאמי.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
1 Data Structures, CS, TAU, Perfect Hashing בעיה: נתונה קבוצה S של n מפתחות מתחום U השוואה ל- Hash : * טבלה קבועה (Hash רגיל - דינאמי) * רוצים זמן קבוע.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
יחס סדר חלקי.
תכנות תרגול 4 שבוע : לולאות for לולאות for for (counter=1 ;counter
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא מורחב למדעי המחשב בשפת Scheme תרגול 10. אג'נדה שאלות מבחינות חזרה על מימוש stream אפשרי 2.
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
תכנות תרגול 12 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
Practice session 6 Sequence Operations Partial Evaluation Lazy Lists.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
Programming Pointers. נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך.
עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבני נתונים רשימה מקושרת, מחסנית ותור
Tirgul 12 Trees 1.
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מיונים וחיפושים קרן כליף.
מצביעים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
הרצאה 06 רשימות מקושרות קרן כליף.
קורס תכנות – סמסטר ב' תשס"ח
קורס תכנות שיעור 11: הסוף.
הקצאות דינאמיות קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
Engineering Programming A
שאלה 1.
מערכים של מצביעים הקצאה דינאמית
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
איתור נתונים מתקדם, בעזרת vlookup וחברים
מבוא לתכנות ב- Java תרגול 10 - רשימות מקושרות.
Presentation transcript:

מבוא כללי למדעי המחשב רשימות מקושרות

רשימות מקושרות - תזכורת כפי שאמרנו, במערכות רבות יש תחלופה תכופה של אובייקטים (מחיקה והוספה). כפי שאמרנו, במערכות רבות יש תחלופה תכופה של אובייקטים (מחיקה והוספה). למשל במערכת לניהול ספרים בספריה, מערכת לרישום סטודנטים באוניברסיטה, וכו'. למשל במערכת לניהול ספרים בספריה, מערכת לרישום סטודנטים באוניברסיטה, וכו'. אם מייצגים את הנתונים באמצעות מערך, אז צריך להעתיק את כל המערך מחדש כשצריך להוסיף משהו, ו-"לצופף" את כל המערך כשצריך למחוק משהו מהאמצע. אם מייצגים את הנתונים באמצעות מערך, אז צריך להעתיק את כל המערך מחדש כשצריך להוסיף משהו, ו-"לצופף" את כל המערך כשצריך למחוק משהו מהאמצע. זה לא יעיל. זה לא יעיל.

רשימות מקושרות - תזכורת לעבודה עם רשימות גדולות שיש בהן שינויים נירצה להשתמש ברשימה מקושרת במקום להשתמש במערך. לעבודה עם רשימות גדולות שיש בהן שינויים נירצה להשתמש ברשימה מקושרת במקום להשתמש במערך. בניגוד למערך, שהוא אוסף של תאים רצופים, רשימה מקושרת היא אוסף של תאים לא רצופים, שכל אחד מהם כולל גם מצביע לתא שאחריו ברשימה. בניגוד למערך, שהוא אוסף של תאים רצופים, רשימה מקושרת היא אוסף של תאים לא רצופים, שכל אחד מהם כולל גם מצביע לתא שאחריו ברשימה. כפי שאמרנו, זה מקל מאוד על ביצוע תוספות ומחיקות, בלי צורך לשנות את שאר תאי הרשימה. כפי שאמרנו, זה מקל מאוד על ביצוע תוספות ומחיקות, בלי צורך לשנות את שאר תאי הרשימה. כדי לעבור על הרשימה מספיק להחזיק מצביע לתא הראשון שלה, וממנו להתקדם לתא הבא, וכן הלאה. כדי לעבור על הרשימה מספיק להחזיק מצביע לתא הראשון שלה, וממנו להתקדם לתא הבא, וכן הלאה. המוסכמה היא שהתא האחרון ברשימה מצביע על NULL. המוסכמה היא שהתא האחרון ברשימה מצביע על NULL.

דוגמא בציור: רשימה מקושרת של מספרים לעומת מערך:

דוגמא בציור: הוספת איבר בהתחלה (במימוש על-ידי מערך היינו צריכים להזיז קדימה את כל הערכים שלו, בהנחה שהיה מקום)

דוגמא בציור: הוספת איבר בסוף

עוד דוגמא בציור: מחיקת איבר נניח שנתונה הרשימה הבאה של מספרים שלמים : נניח שנתונה הרשימה הבאה של מספרים שלמים : נניח שרוצים למחוק את האיבר שבו נמצא המספר 7. נניח שרוצים למחוק את האיבר שבו נמצא המספר 7. אז צריך למצוא את מי שמצביע עליו (5), ולגרום לו להצביע על מי שאחרי 7 (כלומר 9). אז צריך למצוא את מי שמצביע עליו (5), ולגרום לו להצביע על מי שאחרי 7 (כלומר 9). 3579

עוד דוגמא בציור: מחיקת איבר יוצרים קישור שעוקף את 7, ומוחקים את האיבר עם הערך 7. יוצרים קישור שעוקף את 7, ומוחקים את האיבר עם הערך (במערכים היינו צריכים "לצופף" את כל איברי המערך)

תזכורת: רשימות לעומת מערכים  הוספה ומחיקה של איברים מרשימה ידרשו תמיד רק שינוי מקומי (באיבר אחד או שניים), בעוד שבמערכים עשוי להידרש שינוי בכל המערך.  אבל יש גם חסרונות: - אין גישה ישירה לכל איבר (למשל כדי לגשת לאיבר המיליון נצטרך לעבור את כל האיברים שלפניו כדי לדעת איפה הוא). - כשמוסיפים איבר נצטרך להקצות אותו דינאמית, מה שדורש יותר זמן לעומת גישה למערך שהוקצה מראש.  לכן נעדיף רשימה מקושרת רק כשיש הוספות ומחיקות תכופות.

תזכורת: מימוש רשימות מקושרות ב-C איבר ברשימה ייוצג על-ידי מבנה שיכיל לפחות שני שדות: לפחות שדה אחד יכיל מידע (בדוגמא שלנו יש שדה אחד שמכיל מספר שלם), ושדה אחד יכיל מצביע לאיבר הבא. איבר ברשימה ייוצג על-ידי מבנה שיכיל לפחות שני שדות: לפחות שדה אחד יכיל מידע (בדוגמא שלנו יש שדה אחד שמכיל מספר שלם), ושדה אחד יכיל מצביע לאיבר הבא. אז עבור הדוגמא של רשימת מספרים שלמים נגדיר איבר ע"י: אז עבור הדוגמא של רשימת מספרים שלמים נגדיר איבר ע"י: typedef struct Item { typedef struct Item { int data; int data; struct Item *next; struct Item *next; } Item; השדה data יכיל את המספר שהאיבר מכיל. השדה data יכיל את המספר שהאיבר מכיל. השדה next יכיל מצביע לאיבר הבא ברשימה. (אם אין איבר נוסף, כלומר זה האיבר האחרון, אז ערך המצביע הזה יהיה NULL) השדה next יכיל מצביע לאיבר הבא ברשימה. (אם אין איבר נוסף, כלומר זה האיבר האחרון, אז ערך המצביע הזה יהיה NULL) 3 datanext

בניית רשימה חדשה: הוספת איברים מעצם טבעה של רשימה מקושרת (שיש בה תוספות ומחיקות), מספר האיברים בה לא ידוע מראש ואין עליו חסם. אנחנו נדרשים להוסיף איברים במהלך ריצת התוכנית. מעצם טבעה של רשימה מקושרת (שיש בה תוספות ומחיקות), מספר האיברים בה לא ידוע מראש ואין עליו חסם. אנחנו נדרשים להוסיף איברים במהלך ריצת התוכנית. תוספת איבר לרשימה מקושרת תיעשה בעזרת הקצאה דינאמית שלו. הקצאה דינאמית של איבר אחד נעשית במקרה זה ע"י: תוספת איבר לרשימה מקושרת תיעשה בעזרת הקצאה דינאמית שלו. הקצאה דינאמית של איבר אחד נעשית במקרה זה ע"י: Item *ptr; ptr = (Item *) malloc (sizeof(Item)); נתאר פונקציה להוספת איבר כזה לרשימה. נתאר פונקציה להוספת איבר כזה לרשימה.

הוספת איבר לתחילת רשימה  אמרנו שתמיד נשמור מצביע לאיבר הראשון ברשימה, וממנו נוכל להתקדם לאחרים.  נממש פונקציה בשם Add, שתקבל מצביע לראש הרשימה וערך להוספה, ותוסיף את הערך בתחילת הרשימה.  הפונקציה תחזיר מצביע לראש הרשימה (החדש).  (נוכל להשתמש בפונקציה הזאת לבניית רשימה מקושרת חדשה אם נתחיל עם רשימה ריקה, כלומר עם מצביע שערכו NULL).

רשימות מקושרות-הוספת איבר בהתחלה

Add מימוש פונקציית ההוספה פונקציית ההוספה צריכה לעשות שלושה דברים: פונקציית ההוספה צריכה לעשות שלושה דברים: ליצור איבר עבור המידע החדש. ליצור איבר עבור המידע החדש. לדאוג שהוא יצביע על תחילת הרשימה הקיימת (או על NULL אם היא ריקה). לדאוג שהוא יצביע על תחילת הרשימה הקיימת (או על NULL אם היא ריקה). להחזיר מצביע על האיבר החדש (תחילת הרשימה החדשה). להחזיר מצביע על האיבר החדש (תחילת הרשימה החדשה). האיבר החדש צריך להיות מוקצה דינאמית ע"י הפונקציה (משתנה מקומי רגיל נעלם בסוף הפונקציה).

פונקציה להוספת איבר בהתחלה Item* Add(Item* head, int value) { Item* new_item; Item* new_item; new_item = (Item*) malloc(sizeof (Item)); new_item = (Item*) malloc(sizeof (Item)); new_item->data = value; new_item->data = value; new_item->next = head; new_item->next = head; return new_item; return new_item;} האיבר החדש יצביע לראש הרשימה הקודם, ויהיה ראש הרשימה החדש. יוצרים איבר חדש עם הערך הדרוש (לצורך ההדגמה הנחנו שהקצאת הזיכרון הצליחה) מקבלים מצביע לראש רשימה וערך להוספה

head head 3 רשימות מקושרות ב-C – שימוש ב- Add …. int main() { Item *head = NULL; head = Add(head,7); head = Add(head,3); head = Add(head,5);....} 7head 5 head מתחילים מרשימה ריקה וכל פעם מוסיפים לה ערך בהתחלה

מציאת איבר ברשימה פעולה נפוצה נוספת שנירצה לממש היא חיפוש איבר ברשימה והחזרת מצביע אליו. פעולה נפוצה נוספת שנירצה לממש היא חיפוש איבר ברשימה והחזרת מצביע אליו. הפרמטרים לפונקציה יהיו: הפרמטרים לפונקציה יהיו: מצביע לראש הרשימה מצביע לראש הרשימה הערך שאותו מחפשים הערך שאותו מחפשים הערך המוחזר יהיה: הערך המוחזר יהיה: מצביע לאיבר עם הערך המבוקש (NULL אם האיבר אינו ברשימה) מצביע לאיבר עם הערך המבוקש (NULL אם האיבר אינו ברשימה)

מציאת איבר ברשימה - מימוש הפונקציה פשוט מתקדמת על איברי הרשימה לפי המצביעים, עד שמצאנו את הערך המבוקש או עד שמגיעים לסוף (NULL). הפונקציה פשוט מתקדמת על איברי הרשימה לפי המצביעים, עד שמצאנו את הערך המבוקש או עד שמגיעים לסוף (NULL). ברגע שמתקיים אחד מהתנאים האלה, היא מחזירה את המקום שהגענו אליו ברשימה (שהוא או מצביע לאיבר המבוקש או סוף הרשימה, כלומר NULL). ברגע שמתקיים אחד מהתנאים האלה, היא מחזירה את המקום שהגענו אליו ברשימה (שהוא או מצביע לאיבר המבוקש או סוף הרשימה, כלומר NULL).

מציאת איבר ברשימה Item *Find(Item *head, int value) { Item *check = head; while ((check != NULL) && (check->data != value)) check = check->next; return check; } מתחילים לחפש מראש הרשימה. כל עוד לא הגענו לסוף ולא מצאנו את הערך המבוקש – מתקדמים ברשימה. הפונקציה מקבלת מצביע לראש הרשימה וערך שרוצים למצוא בה כשהגענו לערך המבוקש או לסוף, מחזירים מצביע למקום שהגענו אליו (באופן דומה יכולנו לחפש את האיבר הראשון שמקיים תנאי כלשהו)

רשימות מקושרות-מציאת איבר למשל אם נחפש את 5: head check

רשימות מקושרות-מציאת איבר למשל אם נחפש את 5: head check

רשימות מקושרות-מציאת איבר למשל אם נחפש את 5: head check

דוגמא: מציאת איבר ברשימה Item *Find(Item *head, int value) { Item *check = head; while ((check != NULL) && (check->data != value)) check = check->next; return check; } מתחילים לחפש מראש הרשימה. כל עוד לא הגענו לסוף ולא מצאנו את הערך המבוקש – מתקדמים ברשימה. הפונקציה מקבלת מצביע לראש הרשימה וערך שרוצים למצוא בה כשהגענו לערך המבוקש או לסוף, מחזירים מצביע למקום שהגענו אליו אם value לא נמצא ברשימה, אז בפעם האחרונה שהלולאה תתבצע יתקיים ש- check הוא NULL, אבל לא יבדק הערך של check->data, כך שלא תהיה בעיה (לא ניגש לכתובת NULL). אם value לא נמצא ברשימה, אז בפעם האחרונה שהלולאה תתבצע יתקיים ש- check הוא NULL, אבל לא יבדק הערך של check->data, כך שלא תהיה בעיה (לא ניגש לכתובת NULL).

שחרור רשימה מקושרת בסיום השימוש ברשימה נרצה לשחרר את כל הזיכרון שהיא משתמשת בו. בסיום השימוש ברשימה נרצה לשחרר את כל הזיכרון שהיא משתמשת בו. - בשונה ממערך שהוקצה דינאמית, free של ראש הרשימה משחרר רק את האיבר הראשון, כי כל אחד מאיברי הרשימה הוקצה ע"י malloc נפרד, ו- free משחרר את מה שהוקצה בפקודת malloc אחת בדיוק. נכתוב פונקציה שמקבלת מצביע לראש הרשימה ועוברת ומשחררת את כל האיברים שהוקצו על ידי פונקצית ההוספה. נכתוב פונקציה שמקבלת מצביע לראש הרשימה ועוברת ומשחררת את כל האיברים שהוקצו על ידי פונקצית ההוספה.

שחרור רשימה מקושרת - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head כל פעם משחררים את האיבר הראשון ברשימה שנשארה, עד שכולה משוחררת. ראש הרשימה מתקדם לאיבר הבא. מתחילים לשחרר מראש הרשימה. משחררים את ראש הרשימה הקודם. באיטרציה הבאה ישוחרר ראש הרשימה הבא. to_free מקבלים מצביע לראש רשימה מקושרת

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head כל פעם מוחקים את האיבר הראשון שנשאר ברשימה, עד שהיא מתרוקנת.

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head מצביע נוסף על האיבר הראשון, שישוחרר to_free

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head ממשיכים כל עוד לא הגענו לסוף הרשימה to_free מצביע נוסף על האיבר הראשון, שישוחרר

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head to_free ראש הרשימה מתקדם ממשיכים כל עוד לא הגענו לסוף הרשימה מצביע נוסף על האיבר הראשון, שישוחרר

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head to_free האיבר הראשון משוחרר ראש הרשימה מתקדם ממשיכים כל עוד לא הגענו לסוף הרשימה מצביע נוסף על האיבר הראשון, שישוחרר

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head to_free כעת ישוחרר האיבר הבא האיבר הראשון משוחרר ראש הרשימה מתקדם ממשיכים כל עוד לא הגענו לסוף הרשימה מצביע נוסף על האיבר הראשון, שישוחרר

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head to_free כעת ישוחרר האיבר הבא האיבר הראשון משוחרר ראש הרשימה מתקדם ממשיכים כל עוד לא הגענו לסוף הרשימה מצביע נוסף על האיבר הראשון, שישוחרר

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head to_free כעת ישוחרר האיבר הבא האיבר הראשון משוחרר ראש הרשימה מתקדם ממשיכים כל עוד לא הגענו לסוף הרשימה מצביע נוסף על האיבר הראשון, שישוחרר

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head to_free כעת ישוחרר האיבר הבא האיבר הראשון משוחרר ראש הרשימה מתקדם ממשיכים כל עוד לא הגענו לסוף הרשימה מצביע נוסף על האיבר הראשון, שישוחרר

שחרור רשימה - מימוש void FreeList (Item* head) { Item* to_free = head; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; }} head to_free כשהגענו ל- NULL מסיימים כעת ישוחרר האיבר הבא האיבר הראשון משוחרר ראש הרשימה מתקדם ממשיכים כל עוד לא הגענו לסוף הרשימה מצביע נוסף על האיבר הראשון, שישוחרר

רשימות מקושרות – עוד דוגמאות דוגמאות נוספות לפעולות נפוצות על רשימות מקושרות:  הוספה בסוף רשימה  מחיקה מאמצע רשימה

הוספת איבר בסוף

הוספת איבר בסוף - השלבים נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון. נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון

הוספת איבר בסוף - השלבים נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון. נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון

הוספת איבר בסוף - השלבים נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון. נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון

הוספת איבר בסוף - השלבים נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון. נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון

הוספת איבר בסוף - השלבים נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון. נחפש את האיבר האחרון ברשימה, וכאשר נמצא אותו נגרום לו להצביע על 7, ו-7 יהפוך להיות האיבר האחרון

מחיקת איבר מאמצע הרשימה

נחפש את האיבר שלפני האיבר שמוצבע אליו ברשימה, וכאשר נמצא אותו נגרום לו להצביע על האיבר שאחרי האיבר שמוצבע אליו. נחפש את האיבר שלפני האיבר שמוצבע אליו ברשימה, וכאשר נמצא אותו נגרום לו להצביע על האיבר שאחרי האיבר שמוצבע אליו