הרצאה 4 נושא :רשימות מקושרות – תור ומחסנית – רשימת מעגלים בעיה: רוצים לקבל סטודנטים למכללה אך לא יודעים את מספרם -1להקצות מקסימום מקומות אפשריים - חסרון – 1בזבוז של מקומות – חסרון - 2אם יבואו יותר מ – מקס 1+סטודנטים נצטרך לבצע פעולות יקרות כדי להכיל אותם! -2היינו רוצים להקצות בדיוק את מספר המקומות הדרוש – כלומר אם הגיעו 30סטודנטים אז להקצות 30מקומות אם 130אז 130מקומות – ולכן דרוש מבנה דינמי – ולכן כדי לעשות את זה משתמשים במבנה נתונים שקוראים לו רשימה מקושרת! דוגמה: -1איציק -2מירי -3בר -4רפאל הרשימה תראה כך:
ʷʩ ʶʩ ʠ
ʩ ʸʩ ʮ
ʸʡ ʬʠʴ ʸ
אם נרצה למצוא את הת.ז .של בר נצטרך לעבור אחד אחד וזה החיסרון!
HEAD ʯʥ ʹ ʠʸ ʤʺ ʡʥ ʺʫ ʤʮʩ ʹ ʸʡ
VAL1 | next
VAL2 | next
VAL3 next
NULL
:כל תא ברשימה המקושרת נראה כך typedef struct{ int val; cell* next; }cell; :נראה איך נוצרת הרשימה המתוארת לעיל
: ניתן להגדיל את הרשימה בצורה דינמית ע"י הגדרת תא חדש new_cell = (cell *)malloc(sizeof(cell));
מה ניתן לעשות עם רשימה: –להוסיף ולמחוק אברים –לעדכן שדות
רוצים 6דונם: ):דונם realloc( 6 ) דונם 1. 120=malloc( 6 מעתיקה את הכל למקום חדש 2. ;)3. free(542 סוגים שונים של רשימה מקושרת: -1תור – Queue )(FIFO – First In First Out הכנסה :מהקצה של TAIL הוצאה :מהקצה של HEAD
ʭʩ ʱʩ ʰʫʮ ʭʩ ʸ ʡʠ
head
3
4
HE AD
2
NULL
מי שמגיע נכנס אחרון – ואראשון יוצא ראשון מחסנית STACK ))LIFO – Last in first out
head HEAD 4
3
2
ʤʱ ʰʫʤ ʤʠʶʥ ʤ
NULL
;temp=head->next ;)free(head ;head=temp
רשימה מקושרת כללית: הכנסה\הוצאה מכל חלקי הרשימה ולא רק מהסוף או ההתחלה. (1יוצר תא חדש ;))cell* new_cell=(cell *)=malloc(sizeof(cell ;new_cell.val = 10 (2מצא את האבר ברשימה שאחריו יוכנס האיבר החדש. (3עדכן את המצביעים:
NEXTשל האיבר שמצא יצביע לאיבר החדש NEXTשל החדש יהיה ה NEXTשל האיבר שמצא
HEAD 3
4
2
1
NULL
(4רשימה מקושרת דו כיוונית
{typedef struct ;int val ;cell*next ;cell*prev ;}cell
HEAD 4
3
NULL
(5רשימה מעגלית – HEADנבחר באופן שרירותי
2
1
HEAD 1
2
3
4