Computer Programming A תרגול 9

Similar documents
Introduction to Programming in C תרגול 8

Programming in C תרגול 8

מערכים שעור מס. 4 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

מבוא לתכנות בשפת C. Tzachi (Isaac) Rosen

קורס תכנות כתובות בזיכרון כתובות בזכרון מצביעים וכתובות מצביעים וכתובות שיעור שביעי: מבנים, הקצאת זיכרון דינאמית האופרטור &

Engineering Programming A

קורס תכנות בשיעור הקודם למדנו על רקורסיה שיעור שישי: מערכים פונקציה רקורסיבית שאלה חישוב נוסחאות רקורסיביות בשפת C

מבוא למדעי המחשב תרגול 13: עצים בינאריים

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

Practical Session - Heap

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

ת ונכת סרוק תורשוקמ תומישר :יעישת רועיש 1

Algorithms. Intro2CS week 5

תרגול מספר 3: מערכים

תרגול 4 פונקציות. מבנה של פונקציה: public static <return value type> <function name> (<arg1 type> <arg1>, <arg2 type> <arg2>, ) { <function body> }

שאלה 1 מהו הפלט של התוכנית הבאה:

קורס תכנות שיעור שישי: מחרוזות, מצביעים

רזח יליגרתו םי יראני ב ם

Practical Session No. 14 Topological sort,amortized Analysis

פרק 15 טיפוס חדש: מבנים שימוש במבנים שימוש במבנים שימוש במבנים

תכנות מתקדם בשפת C משתנים

הנכות 1 תואיגש םע תודדומתהו תואלול,םי : כרעמ 2 לוגרת

הנכות 1 תואיגש םע תודדומתהו תואלול,םיכרעמ : לו 2 גרת

סכום (סדרת ערכים) אחרת - דוגמא: סכום-ספרות (num) אם < 10 num החזר 1 או אם = 0 = num החזר 0 public static int numofdigits (int num)

משתנים שעור מס. 2 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

Tutorial 10. Introduction to C++ שימו

הנכות 1 םוכיס לוגרת 13 1

תוכנה 1 תרגול 2: מערכים ומבני בקרה

ספרית התבניות הסטנדרטית (STL) כתיבת אלגוריתמים גנריים מצביעים חכמים. .vector. list iterator נכיר תחילה את האוסף הפשוט ביותר בספריה

תרגול 3 מערכים ופונקציות

מבוא למדעי המחשב תרגול 8 רשימה משורשרת כללית, Comparator

תכנות מונחה עצמים משחקים תשע"ו

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

תוכנה 1 תרגול מספר 13

תוכנה 1 תרגול מספר 13

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

פתרון מוצע לבחינת מה"ט ב_שפת c מועד אביב תשע"ח, פברואר 8102 מחבר: מר שייקה בילו, מכללת אורט רחובות

תרגול 12. Standard Template Library כתיבת אלגוריתמים גנריים מצביעים חכמים

מבוא למדעי המחשב תירגול 2: מבוא למדעי המחשב מ' - תירגול 2

תוכנה 1 תרגול 2: מערכים, מבני בקרה ושגיאות

מבני נתונים תכנות מונחה עצמים מבני נתונים. מחלקות אבסטרקטיות חבילות packages סיכום הרשאות גישה wrappers ADT מערך דינמי מחסנית

תוכנה 1. תרגול מספר 11: Static vs. Dynamic Binding מחלקות מקוננות Nested Classes

Amortized Analysis, Union-Find,

הנכות 1 םוכיס לוגרת 13 1

מבוא לתכנות ב- JAVA תרגול 5. Ipc161- practical session 5

פתרון מוצע לבחינה בשפת C של מה"ט מועד אביב תשע"ז, פברואר 2017 מחבר: מר עסאקלה שאדי, מכללת אורט בראודה

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

תוכנה 1 * לא בהכרח בסדר הזה

תזכורת: עץבינארי מבוא למדעי המחשב הרצאה 24: עצי חיפוש בינאריים

קורס תכנות שיעור שני: שימוש במשתנים,

תרגול 6 רקורסיה ותכנות מונחה עצמים

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

$ gcc check.c. $ a.out. $ gcc check.c -o check. $ check. $ gcc -Wall check.c -o check. #include <stdio.h>

הנכות 1 םוכיס לוגרת 13 1

מבוא למדעי המחשב תירגול 3:

Exams questions examples

ASP.Net Web API.

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Array Creation and Initialization. Loop through Arrays

הנכות 1 םוכיס לוגרת 14 1

תוכנה 1 3 תרגול מס' מערכים ומבני בקרה

רשימות דילוגים Skip Lists

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Loop through Arrays. Array Creation and Initialization

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

Chapter 11.2 Linked lists ( )

תרגילים ופתרונות בשפת - C הסתעפויות

תרגול 3 מערכים ופונקציות

Nir Adar

דף הדרכה ליצירת שרת/ לקוח עם GUI

תוכנה 1. תרגול מס' 3 עבודה עם מחרוזות )Strings( מתודות )Methods( העברת פרמטרים

תוכנה 1 * לא בהכרח בסדר הזה

מבוא לתכנות תוכנית שעור מס. 1 1 דר' דרור טובי, המרכז האוניברסיטאי אריאל בשומרון.

Smart Pointers Nir Adar

מצליחה. 1. int fork-bomb() 2. { 3. fork(); 4. fork() && fork() fork(); 5. fork(); printf("bla\n"); 8. return 0; 9. }

מחרוזות ב Java ותכנות מונחה בדיקות )Test Driven Development(

תוכנה 1 טיפוסי השפה טיפוסים לא פרימיטיביים הטיפוסים הפרימיטיביים מחרוזות המרה למספרים תרגול 2: טיפוסי שפה, מחרוזות, מערכים ושגיאות

עקרונות שפות תכנות 2016 תרגול 8 Type Inference System. Substitution Interpreter.

תוכנה 1 בשפת Java נושאים שונים בהורשה רובי בוים ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב

ב ה צ ל ח ה! אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ה תשרי תשע"ח 15/10/17 שמות המורים: ציון סיקסיק מיועד לתלמידי : א'

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

תרגול 7 רשימות משורשרות, רקורסיית

<exp> ::= <define> <cexp> <define> ::= ( define <var-decl> <cexp> ) / DefExp(var:VarDecl, val:cexp)

שאלות חזרה 2 האוניברסיטה החליטה לפרסם שמות הסטודנטים המצטיינים בקורס שלנו. סטודנט מצטיין הוא סטודנט שקיבל

תור שימושים בעולם התוכנה

כתבו קוד ב- 3 קבצי ה hpp (כתבו כהערה את שם הקובץ מעל) כך שהקוד יהיה תקין ובסגנון טוב. אין חובה


הפלט אחרי הביצוע של ההוראה :what3(root)

מבוא למדעי המחשב 2018 תרגול 7

Communication Networks ( ) / Spring 2011 The Blavatnik School of Computer Science, Tel-Aviv University. Allon Wagner

הקלחמ ה תמרב ת ונ וכ ת (static members ) יליזרב דהוא Java תפשב ם דקת מ תונכת ביבא ל ת תטיסרבינוא

תוכנה 1. תרגול מספר 11: Static vs. Dynamic Binding מחלקות מקוננות Nested Classes בית הספר למדעי המחשב אוניברסיטת תל אביב

תוכנה 1 סמסטר א' תשע"א

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

מבוא לתכנות מערכות מבחן מועד א' סמסטר חורף

מבוא למדעי המחשב השפעת השינוי על סטודנט הרצאה 18: פולימורפיזם ומחלקות אבסטרקטיות אם ברצוננו ששכר הלימוד לא יעלה על 2500.

תוכנה 1 תרגול מספר 10: תרגיל חזרה חברת הייטק בית הספר למדעי המחשב אוניברסיטת תל אביב

במידה ולסעיף ניתנה תשובה ובנוסף נרשם לגבי הסעיף לא יודע/ת אזי הניקוד שיינתן

גירסה

מבוא למדעי המחשב תרגול 12 מחסנית )Stack( memoization

מדעי המחשב 2 יחידות לימוד פתרון בחינת הבגרות פרק א. I x > a. פתרון 2: משפט switch

עבודה עם STL. )Dmitry Korolev

Transcription:

Computer Programming A תרגול 9 1

מטרת התרגול הקצאת זיכרון מבנים רשימות דינאמית

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

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

הקצאת זיכרון דינאמית #include <stdlib.h> //must add this library free, שימוש בפונקציות: malloc pointer_variable = (pointer_type) malloc (size_of_memory); int size, *p_list; printf("enter the number of elements:"); scanf("%d", &size); p_list = (int*)malloc (size * sizeof(int));. free(p_list); דוגמה: שחרור הזיכרון בסיום השימוש בו

דוגמא להקצאת ושחרור זיכרון כאשר מקצים זיכרון הערך המוחזר על ידי פונקצית הקצאת זיכרון היא כתובת. יש מקרים שבעבורם הקצאת הזיכרון נכשלת והערך המוחזר על ידי הפונקציה הוא.NULL מכיוון שלא קיבלנו כתובת, לא ניתן להשתמש במצביע כמצביע "חוקי" ונרצה לסיים את התוכנית. לכן, לאחר הקצאת זיכרון תמיד צריך לבדוק האם ההקצאה הצליחה. void main(){ long *l_list; l_list =(long*) malloc (5*sizeof(long)); if (l_list == NULL){ printf ("Failed to allocate memory"); return; free(l_list);

#include <stdio.h> #include <stdlib.h> int* foo (); int* foo (){ int arr[3]={1,2,3; return arr; void main(){ int* x = foo (); printf("%d",x[0]); נתבונן בתוכנית הבאה: דוגמא התנהגות תוכנית זו אינה מוגדרת מכיוון שהפונקציה מחזירה מצביע למערך לוקאלי. כאשר הפונקציה מסתיימת הזיכרון בו נמצא המערך אינו חוקי עוד לשימוש. נתקן את הפונקציה בצורה הבאה: int* foo (){ int *arr = (int*) malloc(sizeof(int)*3); arr[0]=1; arr[1]=2; arr[2]=3; return arr; לאחר סיום ריצת הפונקציה ולאחר שסיימנו להשתמש במערך, נדאג לשחרר את הזיכרון ע"י הוספת הפקודה הבאה ל- main או לכל פונקציה אחרת בה זיהינו כי אין עוד צורך בזיכרון שהוקצה. free(x);

תרגיל 1 תוכנית להדגמה של מערך דו-מימדי דינאמי: כשרוצים להגדיר מערך דו מימדי בעל גודל משתנה, עלינו ליצור מערך של מצביעים למערכים. גודל המערך לא ידוע בתחילת התכנית ולכן נגדיר את המערך באמצעות פונקצית.malloc() בתחילה נאתחל מערך של מצביעים, ולאחר מכן נאתחל כל מצביע להיות מערך של ה- type הרצוי. למשל, יצירת מערך של int -ים בגודל המוגדר ע"י המשתמש שבכל איבר בו יש את הערך של מכפלת האינדקסים שלו:

תרגיל 1 #include <stdio.h> #include <stdlib.h> void main(){ int i, j, k, rows, cols; int **array; printf("enter num of rows: "); scanf("%d",&rows); printf("enter num of columns: "); scanf("%d",&cols); if (!(array=(int **)malloc(rows*sizeof(int *)) )){ printf("memory allocation failed, quiting "); return;...

for (i=0; i<rows; i++) המשך תרגיל 1 /*Fill in the different rows:*/ if (!(array[i]=(int *)malloc(cols*sizeof(int)) )) for (k=0; k<i; k++) /*Free all priory allocated memory:*/ free( array[k] ); free(array); printf("memory allocation failed, quiting "); return; /*Terminate the program!*/ for (j=0; j<cols; j++) /*Fill in the different columns:*/ array[i][j] = i*j; for (i=0; i<rows; i++){ /*Print the different rows:*/ for (j=0; j<cols; j++) printf("%d ",array[i][j]); printf("\n");

המשך תרגיל 1 /*Free allocated memory:*/ for(i=0; i<rows; i++) free(array[i]); free(array);

תרגיל 2 עיין בקטע הבא וסמן את כל התשובות הנכונות )הנח כי כל הקצאות הזיכרון מצליחות(: #include <stdio.h> #include <stdlib.h> #define MAX 10 void main(){ int *ptr, *arr[max]; int i, j; for (i=max-1; i>=0; i--) התכנית לא מדפיסה כלום. יש שגיאה בזמן ריצה error).(run time התכנית תדפיס:.72 63 54 45 36 27 18 9 התכנית תדפיס אינסוף אפסים. התכנית תדפיס 0. התכנית תדפיס ערכים לא ידועים. אף לא אחת מהתשובות לעיל. if (arr[i] = (int *) malloc(i * sizeof(int))) for (j=0; j<i; j++) *(*(arr+i)+j) = j*i; //same as arr[i][j]=j*i ptr = *(arr+max-1); while (*ptr) printf ("%d ", *ptr--);.1.2.3.4.5.6.7

פתרון תרגיל 2

פתרון תרגיל 2

char *search(char *str1, char *str2){ int i, j, k, length; char *temp, *aux=null; for(i=0, length=0; *(str1+i); i++) if(aux) for(j=0; *(str2+j); j++){ //for j return NULL; for(k=0; *(str1+i+k) && *(str1+i+k) == *(str2+j+k); k++); if( k>length ){ //if length=k; aux=str1+i; if( temp = (char *)malloc(length+1) ){ //if for(i=0; i<length; i++) *(temp+i)='\0'; return temp; *(temp+i )= *(aux+i); נתונה הפונקציה הבאה: תרגיל 3:

תרגיל 3 הסבר בקצרה מה יעודה של הפונקציה הנ"ל. מה הפלט של קטע קוד הבא: char sentence1[]= It is clever of him to solve the problem ; char sentence2[]= I am glad to solve your problem, *sentence3; sentence3 = search(sentence1, sentence2); puts(sentence3);

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

structures מבנה )struct( הוא טיפוס אשר יכול להכיל מספר רב של נתונים מטיפוסים שונים. המבנה מורכב ממשתנים, שלכל אחד מהם קוראים שדה. ניתן לומר שמבנה דומה למערך בכך ששניהם יכולים לאגד מספר נתונים, אך מבנה נותן לנו גם חופש בבחירת טיפוסי הנתונים,כלומר מבנה יכול להכיל גם float, int, double ועוד בעת ובעונה אחת תחת משתנה אחד. התבנית של מבנה: struct nameofstruct { fields ; בהגדרת המבנה יש לכתוב את המילה השמורה struct ולאחר מכן את שם המבנה שבחרנו. חשוב ששמו של המבנה יהיה משמעותי בדיוק כמו בבחירת שמות למשתנים. בתוך הסוגריים יש לרשום את המשתנים ובסוף נקודה-פסיק.

structures לדוגמא: struct address { char city[20]; char street[20]; int housenum; ; יצרנו מבנה של "כתובת מגורים" הכולל: שם עיר ורחוב משתנה מסוג.int כעת נצהיר על משתנה מהטיפוס "כתובת מגורים": - מחרוזות בעלות 20 תווים, ומספר בית - struct address addr;

structures אופרטור הנקודה: כשנרצה לגשת לשדות של המשתנה addr הנקודה ).(. לדוגמא, נציב את המספר 5 ולעדכן אותם, נוכל לעשות זאת על בשדה של מספר הבית באופן הבא: שימוש ידי באופרטור addr.housenum = 5; לעדכן ניתן כך ולשנות את השדות. ניתן להצהיר על מספר משתנים מטיפוס מבנה בשורה אחת כמו שהצהרנו על משתנים פשוטים, לדוגמא: struct address addr1, addr2, addr3; כמו כן ניתן לאתחל מבנים כפי שאתחלנו מערך: struct address addr = {"Tel Aviv", "Menachem Begin", 132; addr1=addr2; : גם ניתן לבצע השמה בין מבנים, בצורה הבאה נסכם ונאמר כי ניתן לבצע את כל הפעולות שביצענו במשתנים פשוטים על מבנה באותו אופן כארגומנט בפונקציה, הצהרה וכו'(. )הצבה

structures struct address addr, *paddr; paddr = &addr; addr.housenum = 3; paddr->housenum = 3; (*paddr).housenum = 3; אופרטור -< : האופרטור >- מאפשר גישה לשדה של מבנה כלשהו ממצביע לדוגמא, נגדיר מצביע למבנה למבנה. :paddress,address נוכל לגשת לשדה housenum של המבנה ע"י כתיבת: או: או:

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

#include <stdio.h> structures // by reference void getdetails (struct person *p) { printf ("Enter name: "); gets (p->name); printf ("Enter age: "); scanf ("%d", &(p->age)); //by value void printdetails (struct person p) { printf("name: %s\n ", p.name); printf("age: %d\n ", p.age); void main() { struct person pr; getdetails (&pr); printdetails (pr); הסבר: בפונקצית main() יש מבנה מסוג person בשם.pr כשנפעיל את הפונקציה,getDetails נרצה שהיא תוכל לשנות את המבנה, ולכן נעביר לפונקציה את הכתובת של המשתנה.pr לפיכך, הפרמטר של הפונקציה getdetails צריך להיות כתובת - כלומר מצביע.

structures מבנה כערך המוחזר על ידי פונקציה: כאשר אנו מעוניינים לקלוט נתוני על הפונקציה יש לרשום: מבנה, לפעמים בעזרת זאת נעשה פונקציה המחזירה מבנה. בהצהרה struct nameofstruct nameoffunction(arguments); תרגיל 2: שנה את הפונקציה getdetails מהתכנית הקודמת כך שתחזיר מבנה, ועדכן את ה- main בהתאם.

struct person getdetails(){ struct person pers; printf ("Enter name: "); gets (pers.name); printf ("Enter age: "); scanf ("%d", &(pers.age)); return pers; structures void main(){ struct person pr; pr=getdetails(); printdetails (pr);

structures מערך של מבנים: ניתן ליצור מערך של מבנים בדיוק כמו בהצהרת מערך רגיל. לדוגמא: struct person pr[3];. יוצר מערך של שלושה משתנים מטיפוס person name כדי לגשת לשדותיו יש לפנות קודם לאיבר במערך שבו אנו מעוניינים - באיבר השני של המערך, נרשום: pr[1].name לדוגמא, עבור השדה תרגיל 3: שנה את התכנית הקודמת כך שתעבוד עם מערך של מבנים.

structures #include <stdio.h> void getdetails (struct person p[],int size){ int i; for (i=0; i<size; i++){ printf ("Enter name: "); gets (p[i].name); printf ("Enter age: "); scanf ("%d", &(p[i].age)); void printdetails (struct person p[],int size){ int i; for (i=0; i<size; i++) { printf("name: %s\n ", p[i].name); printf("age: %d\n ", p[i].age); void main(){ struct person pr[3]; getdetails (pr,3); printdetails (pr,3);

Typedef typedef char byte; typedef struct person{ char name[20]; int id; person;

רשימות מקושרות - הגדרה ותכונות: רשימות משורשרות רשימה מקושרת שרשרת של מבנים. כל מבנה מכיל מצביע למבנה הבא לא מצביע על המבנה הבא - כי אין כזה(. לאיבר שנמצא בתחילת הרשימה נהוג לקרוא "עוגן". או NULL )עבור המבנה האחרון אשר בניגוד למערך, אין גישה מיידית לכל איבר ברשימה באמצעות סוגריים מרובעות ][, אלא באמצעות סריקה של הרשימה עד שמגיעים לאיבר המבוקש. היתרון לעומת מערך הוספה ומחיקה יעילה של איברים. כלומר אם נרצה למחוק איבר מאמצע מערך, נהיה חייבים ליצור עותק חדש של המערך כולו. ברשימה כל מה שנצטרך לעשות זה למחוק את האיבר שמיועד להימחק, ולקשר בין שני האיברים שמסביבו. זהו חיסכון משמעותי ביותר מבחינת זמן ריצה. typedef struct node{ int value; node *next; node;

תרגיל 1: רשימות משורשרות כתוב פונקציה מקושרת ומחזירה את מספר הערכים השונים (value) שברשימה. לדוגמה, עבור הרשימה באה: *list) int count_distinct_items(node המקבלת כארגומנט מצביע לרשימה head 22 11 12 11 22 NULL count_distinct_items(head) שווה.3

רשימות משורשרות int count_distinct_items(node *list) { node *temp, *current = list; int found, count=0; while(current){ found = 0; temp = list; while(temp!= current){ if(temp->value == current->value) { found = 1; break; if (!found) count++; temp = temp->next; current = current->next; return count;

תרגיל 2: רשימות משורשרות

typedef struct node{ int data; struct node *next; node; רשימות משורשרות node* orderlist(node* head){ node* temp,*run,*odd=null,*even=null; while(head){ temp=head; head=head->next; temp->next=null; if(temp->data%2){ temp->next=odd; odd=temp; else{ if(!even) even=temp; else{ for(run=even;run->next;run=run->next); temp->next=run->next; run->next=temp; temp->value=(temp->value*2); if(!even) return odd; for(run=even;run->next;run=run->next); run->next=odd; return even;