Programming

מסמכים קשורים
מבוא למדעי המחשב - חובלים

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

מבוא למדעי המחשב - חובלים

הגשה תוך שבוע בשעת התרגול

PowerPoint Presentation

אוניברסיטת חיפה החוג למדעי המחשב מבוא למדעי המחשב מועד א' סמסטר ב', תשע"ג, משך המבחן: שעתיים וחצי חומר עזר: אסור הנחיות: וודאו כי יש בידיכם

Microsoft Word B

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

שאלהIgal : מערכים דו מימדיים רקורסיה:

מבוא לתכנות ב- JAVA תרגול 7

סדנת תכנות ב C/C++

שאלהIgal : מערכים דו מימדיים רקורסיה:

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

PowerPoint Presentation

שאלהIgal : מערכים דו מימדיים רקורסיה:

אוניברסיטת בן גוריון בנגב תאריך המבחן: שקולניק אלכסנדר שם המרצה: מר בשפת JAVA מבוא לתכנות מבחן ב: מס' הקורס : הנדסת תעשיה וניהול מ

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

Microsoft Word - c_SimA_MoedB2005.doc

אוניברסיטת בן גוריון בנגב תאריך המבחן: שם המרצה: מר אלכסנדר שקולניק, בשפת JAVA מבחן ב: מבוא לתכנות מס' הקורס : מיועד לתלמידי : הנד

שיעור 1

תרגול 1

Tutorial 11

Microsoft Word - tutorial Dynamic Programming _Jun_-05.doc

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

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

תכנות דינמי פרק 6, סעיפים 1-6, ב- Kleinberg/Tardos סכום חלקי מרחק עריכה הרעיון: במקום להרחיב פתרון חלקי יחיד בכל צעד, נרחיב כמה פתרונות אפשריים וניקח

מבוא לתכנות ב- JAVA תרגול 11

הגשה תוך שבוע בשעת התרגול

Slide 1

PRESENTATION NAME

Microsoft PowerPoint - rec1.ppt

Slide 1

מבוא למדעי המחשב

תוכן העניינים

PowerPoint Presentation

תרגול מס' 7: תרגילים מתקדמים ברקורסיה

Slide 1

Slide 1

תוכן העניינים

Slide 1

הטכניון מכון טכנולוגי לישראל אלגוריתמים 1 )443432( סמסטר חורף הפקולטה למדעי המחשב תרגול 9 מסלולים קלים ביותר תרגיל APSP - 1 עד כה דנו באלגור

PowerPoint Presentation

תורת החישוביות תרגול הכנה לוגיקה ותורת הקבוצות מה יש כאן? בקורס תורת החישוביות נניח ידע בסיסי בתורת הקבוצות ובלוגיקה, והכרות עם מושגים בסיסיים כמו א"ב

תכנות מונחה עצמים א' – תש"ע

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

בס"ד תרגיל 3 מועד אחרון ל כללי בתרגיל זה עליכם לכתוב תוכנה שמדמה מאגר נתונים של חנות. את מוצרי החנות תייצגו באמצעות עצים ורשימות מקושרות יהיה עליכם לנ

מבוא למדעי המחשב

Slide 1

Microsoft Word - c_SimA_MoedA2006.doc

מהוא לתכנות ב- JAVA מעבדה 3

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים ע

Microsoft PowerPoint - T-10.ppt [Compatibility Mode]

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

מבוא לאסמבלי

מקביליות

תכנון אלגוריתמים, אביב 1021, תרגול מס' 4 תכנון דינאמי תכנון דינאמי בתרגול זה נדון בבעיית הכפלת סדרת מטריצות (16.1.(CLR ראשית נראה דוגמא: דוגמא: תהינה

מבוא למדעי המחשב

שעור 6

מבוא למדעי המחשב

תרגיל בית מספר 1#

Microsoft PowerPoint - rec3.ppt

Slide 1

תרגול 3 - מערכים

דוגמאות שהוצגו בהרצאה 10 בקורס יסודות מערכות פתוחות דוגמה 1 דוגמאות של פונקציות ב- awk שמראות שהעברת פרמטרים של משתנים פשוטים היא by value והעברת פרמט

PowerPoint Presentation

Slide 1

Homework Dry 3

Microsoft PowerPoint - lec2.ppt

מבוא למדעי המחשב

מתכונת עיצוב 3013

עוצמת ההורשה מה הופך את ההורשה לכלי כל כך עוצמתי? מעבר לכך שהוא מקל בהגדרת מחלקות חדשות על סמך מחלקות קיימות, יש לנו אפשרות להתייחס לאובייקט מסויים בכ

תכנון אלגוריתמים עבודת בית 4: תכנון אלגוריתמים תאריך הגשה: 02: , בצהריים,תא מספר 66 בקומת כניסה של בניין 003 מתרגל אחראי: אורי 0

פקולטה: מחלקה: שם הקורס: קוד הקורס: מדעי הטבע מדעי המחשב ומתמטיקה מתמטיקה בדידה תאריך בחינה: _ 07/07/2015 משך הבחינה: 3 שעות סמ' _ב' מועד

Slide 1

Algorithms Tirgul 1

Slide 1

תרגול מס' 1

234114

PowerPoint Presentation

ex1-bash

תרגיל בית מספר 1#

Microsoft Word - דוגמאות ב

תרגול 1

מקביליות

יוםראשון, 02 ליולי 2014 סמסטר סוף מבחן )236703( עצמים מונחה תכנות - א' מועד 2014, אביב סמסטר קמחי יחיאל ד"ר מרצה: מסינג מיטל עבדאלקאדר, כרם גלעד, ערן

תרגול מס' 7 – חזרה על MST ואלגוריתם Dijkstra

מבוא למדעי המחשב

Slide 1

שקופית 1

PowerPoint Presentation

ב ה. ד. ג. ב. ב. אוניברסיטת תל אביב - בית הספר למדעי המחשב מבוא מורחב למדעי המחשב, חורף :22 תרגיל בית מספר 6 - להגשה עד 66 בינואר 3162 בשעה קיר

תמליל:

קורס תכנות שיעור עשירי: מיונים, חיפושים, קצת ניתוח זמני ריצה, קצת תיקון טעויות ועוד על רשימות 1

רשימה מקושרת רשימה היא אוסף סדור של פעולות רשימה לעומת מערך ערכים 3 5 7 9 typedef struct node { int data; struct node *next; } node_t; 2

מעבר על רשימה מתחילים בהתחלה )head( נתקדם לאיבר הבא )iter next( עד שנגיע לסוף NULL( )iter ==.1.2.3 head iter iter iter iter iter Data Data Data Data Next Next Next Next NULL 3

דוגמה: חיפוש חיפוש ערך ברשימה node_t* find(node_t *head, int val) { while (head!= NULL && head->data!= val) head = head->next; return head; } node_t* find(node_t *head, int val) { if (head == NULL) return NULL; return (head->data == val)? head : find(head->next, val); } רקורסיבי 4

דוגמא: הוספת אברים שלא בהתחלה new after 7 list 3 2 1 5

דוגמא: שחרור רשימה מקושרת void free_list(node_t* head) { node_t* temp; } while (head!= NULL) { temp = head; head = head->next; free(temp); } void free_list(node_t* head) { if (head == NULL) return; רקורסיבי } free_list(head->next); free(head); 6

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

מיונים, חיפושים, חישוב וקצת סיבוכיות

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

חיפוש נאיבי במערך לא ממויין נרצה לדעת האם ערך כלשהו )value( נמצא במערך ואיפה אפשרות א': חיפוש המערך "רגיל" מעבר על כל ערכי int regular_serach(int array[], int size, int value) { int i; { for (i = 0; i < size; i++) { if (array[i] == value) return 1; } return -1;

חיפוש בינארי )דורש מערך ממוין( 11 קלט: מערך ממויין של מספרים שלמים A מספר שלם שברצוננו לחפש q פלט: -1 אם q לא נמצא ב- A אחרת, את האינדקס במערך A שבו נמצא.q האלגוריתם: בדוק את האיבר האמצעי במערך A אם הוא שווה ל- q החזר את האינדקס אם האיבר האמצעי קטן מ- q, חפש את A[middle+1,, ב-[ end q אם האיבר האמצעי גדול מ- q, חפש את q ב- middle-1] A[0,,

חיפוש בינארי )שימוש במצביעים( int * binarysearch (int arr [ ], int size, int quary) { int * middle; if (size == 0) return NULL; middle = arr + size/ 2; if (*middle == quary) return middle; if (*middle > quary) return binarysearch(arr, size/2, quary); else return binarysearch(arr+size/2+1, size-size/2-1, quary); } 12

Main & Output int a [] = {-5,-3,0,4,8,11,22,56,57,97}; int * ind = binarysearch(a,size,0); if (ind!= NULL) printf("%d\n",ind - a); 13

כמה זמן לוקח לעשות חיפוש בינארי? חישוב סיבוכיות 14 זמן ריצה: נחשוב על המקרה הגרוע ביותר גודל המערך שבו אנו מחפשים הולך וקטן בכל קריאה רקורסיבית n n/2 n/4.. 1 כל צעד באלגוריתם הוא מאוד מהיר )מספר קבוע וקטן של פעולות = c( (n) log 2 יש צעדים לכל היותר. לכן סה"כ האלגוריתם יבצע c*log 2 (n) פעולות, שזה בקירוב.log 2 (n) אם = 1,000,000 n חיפוש בינארי יבצע כ- 20 הרבה יותר מהיר מהאלגוריתם הנאיבי שמבצע כ- n צעדים בלבד! פעולות

סיבוכיות זמן ריצה )על רגל אחת( מודדים סיבוכיות של אלגוריתם עפ"י מדד של מקום )כמות זיכרון( ומדד של זמן ריצה. הערכת הסיבוכיות נעשית בכלליות, ללא התחשבות בפעולות קצרות שמספרם קבוע )כלומר לא תלוי בגודל הקלט(. מעריכים את זמן הריצה בסדרי גודל מסומן ב- O. לדוגמא, נניח שאנו עובדים על מערך בגודל = 1,000,000 n O(n 2 ) = constant * trillion (Tera) O(n) = constant * million (Mega) O(log(n)) = constant * 20 15

הבדלים מספריים n lg n n lg n n 2 1 16 256 4,096 65,536 1,048,576 16,777,216 0 0 1 4 64 256 8 2,048 65,536 12 49,152 16,777,216 16 1,048,565 4,294,967,296 20 20,971,520 1,099,511,627,776 24 402,653,183 281,474,976,710,656 16

השוואה גרפית 17

חיפוש בינארי איטרטיבי int binarysearch(int arr [], int size, int quary) { int start= 0, end = size - 1; int middle; while (start <= end) { middle = (start + end) / 2; if (quary == arr [middle]) return middle; if (quary < arr [middle]) end = middle - 1; if (quary > arr [middle]) start = middle + 1; } return -1; } 18

עד עכשיו הנחנו שהמערך ממויין איך נמיין מערך קיים ביעילות? 19

Bubble Sort מיון בועות - נסרוק את המערך ונשווה כל זוג ערכים שכנים נחליף ביניהם אם הם בסדר הפוך נחזור על התהליך עד שלא צריך לבצע יותר החלפות )המערך ממויין( למה בועות? האלגוריתם "מבעבע" בכל סריקה את האיבר הגדול ביותר למקומו הנכון בסוף המערך. 20

Bubble Sort Example 7 2 8 5 4 2 7 5 4 8 2 5 4 7 8 2 4 5 7 8 2 7 8 5 4 2 7 5 4 8 2 5 4 7 8 2 4 5 7 8 2 7 8 5 4 2 5 7 4 8 2 4 5 7 8 (done) 2 7 5 8 4 2 5 4 7 8 2 7 5 4 8 21

Bubble Sort Code void bubblesort(int arr[], int size) { int i,j,tmp; for (i = size - 1; i > 0; --i) for (j = 0; j < i; ++j) if (arr[j] > arr[j+1]) { // swap tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } 22

Bubble Sort Code int main() { int i, a [] = {7,2,8,5,4}; bubblesort(a,size); for (i = 0; i < SIZE; ++i) printf("%d ",a[i]); printf("\n"); } return 0; 23

מיון בועות ניתוח סיבוכיות זמן ריצה n עבור מערך בגודל void bubblesort(int arr[], int size) { int i,j; for (i = size - 1; i > 0; --i) for (j = 0; j < i; ++j) } constant if (arr[j] > arr[j+1]) { // swap tmp = arr[j]; } arr[j] = arr[j+1]; arr[j+1] = tmp; n iterations i iterations (n-1 + n-2 + n-3 +. + 1) * const ~ ½ * n 2 24

דוגמאות לחישוב סיבוכיות זמן ריצה מצא ערך מקסימלי במערך לא ממויין מצא ערך מקסימלי במערך ממויין מצא את הערך החמישי הכי גדול במערך ממויין מצא ערך מסויים במערך לא ממויין מצא ערך מסויים במערך ממויין ענה על n "שאלות פיבונאצ'י" שאלת פיבונאצ'י: מהו הערך ה- K נניח ש- K מוגבל להיות קטן מ- MAX בסדרת פיבונאצ'י? 25

,O(n 2 ) כן! ראינו שאפשר למיין מערך ב- האם אפשר למיין מהר יותר? MERGE SORT 26

- העקרונות Merge Sort ניתן למיין מערך קצר הרבה יותר מהר מאשר מערך ארוך בהנתן 2 מערכים ממויינים, למערך ממויין אחד די מהר ניתן לאחד אותם.O(n) 27

איחוד 2 מערכים ממויינים p p p p p p q q q q q 1 2 5 7 9 3 4 6 8 10 u u u u u u u u u u 1 2 3 4 5 6 7 8 9 10 28

- אלגוריתם Merge Sort אם המערך בגודל 1 או 0 אז הוא כבר ממויין..1 אחרת... חלק את המערך ל- 2 חצאים מיין כל תת-מערך רקורסיבית )ע"י קריאה ל- MergeSort (.2.3 אחד את שני תתי-המערכים הממויינים אחד. למערך ממויין.4 29

Merge Sort (partial) Code void mergesortrec(int arr[], int start, int end) { int middle = (end - start) / 2; if ((end - start) < 2) return; mergesortrec(arr,start,middle); mergesortrec(arr,middle+1,end); mergearrays(arr,start,middle,middle+1,end); } void mergesort(int arr [], int size) { return mergesortrec(arr,0,size-1); } 30

- דוגמא Merge Sort 31

ניתוח סיבוכיות זמן ריצה Merge Sort אם המערך בגודל 1 או 0 אחרת... חלק את המערך ל- 2 חצאים מיין כל תת-מערך רקורסיבית )MergeSort אז הוא כבר ממויין. )ע"י קריאה ל- אחד את שני תתי-המערכים הממויינים למערך ממויין אחד. n + 2 * (n/2) + 2 2 * n/2 2 + 2 3 * n/2 3 + + 2 log(n) * n/2 log(n) = n + n + + n = (n+1) * log(n) log(n) +1.1.2.3.4 32

השוואה גרפית 33

,O(n log(n)) לפעמים... ראינו שאפשר למיין מערך ב- האם אפשר למיין מהר יותר? BUCKET SORT 34

Bucket Sort אלגוריתם בזמן לינארי : O(n) אבל... מוגבל למספרים שלמים, חסומים בטווח. 35

Bucket Sort 36

מיון מחרוזות עד כה מיינו מספרים איך נמיין מחרוזות? בסדר לקסיקוגרפי פרטים בתרגול... )מילוני( 37

מיון גנרי נרצה למיין מערך של int / long / double / float / char / יורד עולה בסדר מה ההבדל בין המקרים? האלגוריתם זהה! האם נהיה חייבים לשכפל קוד עבור כל מקרה? 38

הרעיון של מיון גנרי נכתוב פונקציה אחת שתוכל למיין מערכים של int / long / double / float / char בסדר עולה או יורד. מה יהיו הפרמטרים? מצביע למערך מצביע לפונקציית השוואה 39

הרעיון של מיון גנרי ב- C אפשר להעביר לפונקציה מצביע למערך כללי )* )void וניתן להעביר לפונקציה מצביע לפונקציית ההשוואה. לא נכנס לפרטים במסגרת קורס זה... Comperator code array Memory 40

41 תיקון טעויות )על קצה המזלג(

Magic Source: http://csu-il.blogspot.com/ 42

Mind Reading Card Trick Error correction / error identification Error correcting for one card flip What if 2 cards flip? 3? 4? Applications: Messages between computers Hard disk drive CD Barcode Spelling corraction 43

Israeli ID Error Detection Israeli ID: unique per person, 9 digits Right most digit is control digit How is the control checked? Consider first 8 ID digits For every 2 nd digit d: d < 5 write 2*d d > 5 write 2*d + 1 10 (sum of 2*d digits) The rest of the digits remain without change ID 053326187 44

Example: 053326187 7 8 1 6 2 3 3 5 0 7 + = 23 + 1 + 3 + 2 + 6 + 3 + 1 0 (23 + control_digit) % 10 = 0 45

Raid Redundant array of independent disks http://en.wikipedia.org/wiki/raid Add XOR disk How to fix a flaw disk s data? Bitwise operations in C http://www.cprogramming.com/tutorial/bitwise_operators.html 46

47 עוד על רשימות

מיון רשימות מקושרות ראינו בנייה של רשימה ממוינת בהינתן רשימה קיימת כיצד נמיין? שתי אפשרויות: שימוש באחד מאלגוריתמי המיון שלמדנו 1. בניית רשימה חדשה ממוינת מאברי הרשימה הישנה 2. 48

אלגוריתם merge-sort נזכר באלגוריתם: נחצה את הרשימה נמיין כל מחצית נמזג את הרשימות הממוינות 49

merge sort node_t* mergesort(node_t *head) { node_t *other; // Base case -- length 0 or 1 if ( (head == NULL) (head->next == NULL) ) return head; other = split(head); // Split the list // Recursively sort the sublists other = mergesort(other); head = mergesort(head); } // answer = merge the two sorted lists together return sortedmerge(head, other); 50

split node_t* split(node_t* source) { int len = length(source); int i; node_t *other; if (len < 2) return NULL; for (i = 0; i < (len-1)/2; i++) source = source->next; } // Now cut at current other = source->next; source->next = NULL; return other; 51

sorted merge node_t* sortedmerge(node_t *a, node_t *b) { node_t dummy, *tail = &dummy; dummy.next = NULL; } while (a!= NULL && b!= NULL) { if (a->data <= b->data) { tail->next = a; a = a->next; } else { tail->next = b; b = b->next; } tail = tail->next; } if (a == NULL) { tail->next = b; } else { // b == NULL tail->next = a; } return dummy.next; 52

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

דוגמא מבנה של חוליה ברשימה ללא שינוי typedef struct node { int data; struct node *next; } node_t; - מבנה נוסף המחזיק מצביע לתחילת/סוף הרשימה ואת גודלה typedef struct { node_t *head, *tail; int length; } List; 54

כיצד נממש את?add_first void add_first(list *list, int data) { node_t *new_node = create_node(data); /* incomplete, must check for failure */ new_node->next = list->head; list->head = new_node; if (list->tail == NULL) list->tail = new_node; } list->length++; 55

כיצד נממש את?add_last void add_last(list *list, int data) { node_t *new_node = create_node(data); /* incomplete, must check for failure */ } if (list->head == NULL) { list->head = new_node; list->tail = new_node; list->length = 1; return; } list->tail->next = new_node; list->tail = new_node; list->length++; אין צורך לרוץ על כל הרשימה 56

כיצד נשתמש int main() { int value = 0; List list; list.head = NULL; list.tail = NULL; list.length = 0; } scanf( %d, &value); while (value >= 0) { add_first(&list, value); scanf( %d, &value); }... 57

העלילה מסתבכת עד עכשיו אם פונקציה יכולה לשנות את ראש הרשימה היא תחזיר את ראש הרשימה החדש כיצד נשנה משתנה שהוגדר בפונקציה אחרת? בעזרת מצביע למשתנה 58

לדוגמא: add_first void add_first(node_t **headref, int data) { node_t *new_node = create_node(data); if (new_node == NULL) { printf("fatal error: Unable to allocate memory!"); exit(exit_failure); } { new_node->next = *headref; *headref = new_node; 59

שימוש int main() { int i; node_t *list = NULL; for (i = 0; i < 6; i++) add_first(&list, i); // list == {5, 4, 3, 2, 1, 0} print_list(list); free_list(list); } return 0; 60

עוד דוגמא: append הפונקציה append מחברת רשימה מקושרת אחת בסוף של רשימה מקושרת שנייה דומה לשרשור מחרוזות Stack Heap a b 1 3 4 2 61

לאחר הקריאה ל append a מצביע לרשימה המשורשרת הערך של b הוא NULL Stack Heap a b 1 3 4 2 62

מימוש void append(node_t** aref, node_t** bref) { node_t* ptr; { if (*aref == NULL) { // special case if a is empty *aref = *bref; } else { // Otherwise, find the end of a, and append b there ptr = *aref; while (ptr->next!= NULL) { // find the last node ptr = ptr->next; } ptr->next = *bref; // hang the b list off the last node } *bref = NULL; // NULL the original b, since it has been //appended above 63

דוגמת שימוש int main() { int i; node_t *a = NULL, *b = NULL; for (i = 0; i < 5; i++) add_first(&a, i); // a == {5, 4, 3, 2, 1, 0} for (i = 5; i < 10; i++) add_first(&b, i); // b == {9, 8, 7, 6, 5} append(&a, &b); // a == {5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5} // b == NULL print_list(a); } free_list(a); return 0; 64

תרגיל בית*** נכתוב פונקציה רקורסיבית שהופכת רשימה מקושרת נשתמש במצביע למצביע הדרכה: כדי להבין את הקוד שרטטו! 65

תרגיל בית*** - פתרון void RecursiveReverse(node_t** headref) { node_t* first, *rest; // empty list base case if (*headref == NULL) return; first = *headref; // suppose first = {1, 2, 3} rest = first->next; // rest = {2, 3} if (rest == NULL) return; // empty rest base case } RecursiveReverse(&rest); first->next->next = first; first->next = NULL; // tricky step -- make a drawing *headref = rest; // fix the head pointer 66