Presentation is loading. Please wait.

Presentation is loading. Please wait.

תכנות תרגול 14 שבוע : 31.5.05. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.

Similar presentations


Presentation on theme: "תכנות תרגול 14 שבוע : 31.5.05. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה."— Presentation transcript:

1 תכנות תרגול 14 שבוע : 31.5.05

2 רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה נקרא רשימה מקושרת. איבר מידע מצביע לאיבר מצביע לראש הרשימה איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר 5 71 8

3 struct list { int data; int data; struct list *next; struct list *next;}; typedef strcut list Item; מידע מצביע לאיבר פעולות על הרשימה : יצירה והריסה של רשימה ספירת מספר האיברים ברשימה חיבור שתי רשימות מחיקה / הוספה של איבר לרשימה הדפסת רשימה

4 רשימות מקושרות ב -C  נחזיק מצביע אשר יהיה מצביע לראש הרשימה וישב ב main.  תהיה לנו פונקצית הוספה אשר תוסיף איברים לרשימה בסוף הרשימה.  הפונקציה תדע לקבל מצביע לראש הרשימה וערך להוספה ותוסיף את האיבר בסוף הרשימה.

5 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימות מקושרות ב -C int main() { Item *L_head = NULL; L_head = Add(L_head,5); L_head = Add(L_head,3); L_head = Add(L_head,7); } מצביע לראש הרשימה

6 Item* Add(Item* L_head, int value) { Item* L_tail = L_head; Item* L_tail = L_head; Item* I_new = malloc(sizeof (Item)); Item* I_new = malloc(sizeof (Item)); I_new->value = value; I_new->value = value; I_new->next = NULL; I_new->next = NULL; if (L_tail == NULL) return I_new; while (L_tail->next != NULL) L_tail=L_tail->next; L_tail=L_tail->next; L_tail->next = I_new; L_tail->next = I_new; return L_head; return L_head;}

7 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימות מקושרות ב -C int main() { Item *L_head = NULL; … L_head = Delete(L_head,3); } מצביע לראש הרשימה

8 Item *Delete(Item * head,int value) { Item* curr = head; Item* prev = head; if (curr->value == value) { curr = curr->next; free(head); return curr; } האיבר למחיקה הוא הראשון

9 while (curr != NULL) { if (curr->value == value) { prev->next = curr->next; free(curr); return head; } prev = curr; curr = curr->next; } return head; } חיפוש ומחיקת איבר

10 כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה

11 int Count(Item * L) { int counter=0; while (L) { counter++; L=L->next; } return counter; } int CountR(Item * L) { if (L == NULL) return 0; return 1 + CountR(L->next); }

12 כתוב פונקציה המקבלת מצביעים לשתי רשימות מקושרות ומחברת אותן. איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימה 1 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5 רשימה 2 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5

13 Item* Meld(Item* L1,Item* L2) { Item* L1_head = L1; if (L1 == NULL) return L2; if (L2 == NULL) return L1; while (L1->next != NULL) L1=L1->next; L1->next = L2; return L1_head; }

14 מערכים דו מימדים ניתן להכליל את המערך הרגיל של C ( החד מימדי ) למספר רב של מימדים. אנחנו נראה כיצד להכליל את המערכים שלמדנו לשני מימדים. נחשוב על מערכים דו מימדים כעל טבלה שלה עמודות ושורות.

15 מערכים דו מימדים a[0][0]a[0][1]a[0][2]a[0][3] a[1][0]a[1][1]a[1][2]a[1][3] a[2][0]a[2][1]a[2][2]a[2][3] שורה 0 שורה 1 שורה 2 עמודה 0 עמודה 1 עמודה 2 עמודה 3 שם המערך אינדקס שורה אינדקס עמודה

16 מערכים דו מימדים הגדרת מערך דו מימדי תתבצע כך : int main() { int a[3][4]= { {1,2,3,4},{5,6,7,8},{9,10,11,12} }; int a[3][4]= { {1,2,3,4},{5,6,7,8},{9,10,11,12} };} שם המערך מספר שורות מספר עמודות 12341234 אתחול שורה 0 56785678 אתחול שורה 1 9101112 אתחול שורה 2

17 #include #include #define ROW 3 #define COLUMN 4 int main() { inta[ROW][COLUMN]= {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; inta[ROW][COLUMN]= {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i, j; int i, j; for ( i = 0; i < ROW; i++ ) for ( i = 0; i < ROW; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) printf( "%4d", a[ i ][ j ] ); printf( "%4d", a[ i ][ j ] ); printf( "\n" ); printf( "\n" ); } return 0; } מעבר על השורות הדפסת כל שורה

18 מערכים דו מימדים ופונקציות כיצד נעביר מערך דו מימדי לפונקציה כך שהפונקציה תדע שמדובר במערך דו - מימדי ? כשדיברנו על מערכים רגילים אמרנו שצרך להעביר מצביע לראש המערך ואת גודל המערך. מה נעביר לפונקציה בבואנו להעביר מערך דו מימדי ?

19 void printArray(int a[][ COLUMN ], int size ) { int i, j; int i, j; for ( i = 0; i < size; i++ ) for ( i = 0; i < size; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) printf( "%4d", a[ i ][ j ] ); printf( "%4d", a[ i ][ j ] ); printf( "\n" ); printf( "\n" ); }} מעבר על השורות הדפסת כל שורה

20 מערכים דו מימדים ופונקציות אנחנו מתייחסים למערך דו מימדי כאליו זו טבלה אבל בזיכרון הוא מופיע כמערך רגיל כדי שבתוך הפונקציה נוכל לפנות לאיברו של המערך באמצעות [][] חייבים לציין את גודל כל שורה כלומר את מספר העמודות 123123 45645612 3 4 5 6 אשליה מציאות 012012 0101 012345012345

21 מערכים דו מימדים ופונקציות כדי לגשת לתא a[1][1] צריך לדעת שהשורה ה 0 מכילה 3 תאים למעשה מה שמתבצע בפועל זה a[row][col] a[row*COLUMN+col] a[1][1] a[1*COLUMN+1] 123123 45645612 3 4 5 6 אשליה מציאות 012012 0101 012345012345

22 #include #include #define ROW 3 #define COLUMN 4 void printArray(int [][ COLUMN ], int ); int main() { int array1[ ROW ][ COLUMN ] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int array1[ ROW ][ COLUMN ] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; printf( "Values in array1 by row are:\n" ); printf( "Values in array1 by row are:\n" ); printArray( array1, ROW ); printArray( array1, ROW ); return 0; return 0;} void printArray(int a[][ COLUMN ], int size ) { int i, j; int i, j; for ( i = 0; i < size; i++ ) { for ( i = 0; i < size; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) printf( "%4d", a[ i ][ j ] ); printf( "%4d", a[ i ][ j ] ); printf( "\n" ); printf( "\n" ); }}

23 תרגיל כתוב פונקציה המקבלת מערך דו מימדי בגודל 10X10 וממלאת אותו בלוח הכפל. התוכנית תדפיס את לוח הכפל המתקבל

24 פתרון void fillArray( int a[][ COLUMN ], int size ) { int i, j; int i, j; for ( i = 0; i < size; i++ ) { for ( i = 0; i < size; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) a[ i ][ j ] = (i+1)*(j+1); a[ i ][ j ] = (i+1)*(j+1); }}

25 מערכים דו מימדים ומחרוזות נגדיר מערך דו מימדי שיכיל שמות. לצורך זה כל שורה במערך תהיה מחרוזת : char names[N][STR_SIZE]; Gadi\0 Rami\0 Dani\0 מה הערכים של N ו ? STR_SIZE #define N 3 #define STR_SIZE 5 0 1 2 3 4 012012

26 מערכים דו מימדים ומחרוזות נכתוב פונקציה שמקבלת שם ומערך. אם השם נמצא במערך הפונקציה תסמן את השם ב *. כיצד נגדיר את הפונקציה ? void markName (char [][STR_SIZE],int size,char *name);

27 מערכים דו מימדים ומחרוזות void markName(char Names[][STR_SIZE],int size,char *name) { int i; for ( i = 0; i < size; i++ ) if (strcmp(Names[i],name) == 0) { strcat(Names[i],"*"); return; }

28 נגדיר מערך של מצביעים. char *names[N]={NULL,NULL,NULL}; names[0] = (char*)malloc(10); strcpy(names[0],”Gadi”); names[1] = (char*)malloc(10); strcpy(names[0],”Rami”); names[2] = (char*)malloc(10); strcpy(names[0],”Dani”); NULL NULL NULL 012012 6024Rami\0 5124Dani\0 1084Gadi\0 6024 5124 1084

29 מערכים דו מימדים ומחרוזות נכתוב פונקציה שמקבלת מערך שמות. הפונקציה בודקת לכל שם האם הוא מופיע פעם נוספת במערך. כל שם שמופיע יותר מפעם אחת מודפס בצירוף הכניסות הזהות במערך. כיצד נגדיר את הפונקציה ? void PrintSameName (char [][STR_SIZE])


Download ppt "תכנות תרגול 14 שבוע : 31.5.05. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה."

Similar presentations


Ads by Google