1 / 19

Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

Introduction to Programming in C. תרגול 11. 20.12.2010. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel. 1. מטרת התרגול. רשימה דו-כיוונית עצים בינאריים. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel. רשימה דו כיוונית (שאלת מבחן 1).

Download Presentation

Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introduction to Programming in C תרגול 11 20.12.2010 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1

  2. מטרת התרגול • רשימה דו-כיוונית • עצים בינאריים Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  3. רשימה דו כיוונית (שאלת מבחן 1) רשימה מקושרת ממוינת ודו-כיוונית של איברים מוגדרת על פי ההגדרה הבאה: struct item { int value; inthowManyAfter; Item* next; Item* prev; } Item; Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  4. רשימה דו כיוונית (שאלת מבחן 1– המשך) השדה value מציין את ערך האיבר, השדה howManyAfter מציין כמה איברים קיימים ברשימה אחרי האיבר, השדה next מצביע לאיבר הבא ברשימה והשדה prev מצביע לאיבר הקודם ברשימה. הרשימה ממוינת לפי השדה value בסדר עולה. הפונקציהitem* addItem(item *lst, intnewVal)יוצרת ומוסיפה לרשימה הממוינת שראשה lst איבר חדש שערכו newVal למיקום הנכון ברשימה, ומעדכנת את כל השדות הרלוונטיים בכל הרשימה. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  5. Item* addItem(Item *lst, intnewVal) { Item *prev,*newHead=lst,*newItem; newItem = ?? 1 ?? ; newItem->value = newVal; for(prev=NULL;?? 2 ?? && newVal>lst->value; ?? 3 ?? ,lst=lst->next); newItem->next = lst; newItem->prev = prev; if (lst) { lst->prev = newItem; newItem->howManyAfter = lst->howManyAfter + 1; } else ?? 4 ??; if( ?? 5 ?? ) ?? 6 ??; else newHead = newItem; } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  6. while(prev) { ?? 7 ??; ?? 8 ??; } return newHead; ?? 1 ?? = (item*)malloc(sizeof(item)); ?? 2 ?? = lst ?? 3 ?? = prev=lst; ?? 4 ?? = newItem->howManyAfter=0; ?? 5 ?? = prev ?? 6 ?? = prev->next=newItem; ?? 7 ?? = prev->howManyAfter=prev->next->howManyAfter+1; or prev->howManyAfter++; ?? 8 ?? = prev=prev->prev; Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  7. עצים בינאריים - חזרה size = 9 height = 3

  8. עץ בינארי - סריקות void preorder( node *r) { if(r!=NULL) { printf("\t %d",r->data); preorder(r->left); preorder(r->right); }} void inorder(node *r){ if(r!=NULL){ inorder(r->left); printf("\t %d",r->data); inorder(r->right); } } void postorder( node *r) { if(r!=NULL) { postorder(r->left); postorder(r->right); printf("\t %d",r->data); } }

  9. 1 6 3 5 8 2 9 עץ בינארי - מעברים בכיתה למדתם שלוש שיטות לסריקת עץ (pre, in & post order). עקוב אחר שלוש הסריקות בעץ הנתון ורשום משמאל לימין מהו סדר האיברים הנסרקים בכל אחת מהן. ב-pre הכוונה שקודם סורקים את האב ורק אח"כ את בניו (השמאלי ואז הימני). ב-post הכוונה שקודם סורקים את הבנים. ב-in הכוונה שסורקים בן שמאלי, אח"כ את האב ואז את הבן הימני. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  10. תרגיל 1 - פתרון preorder: 1,6,8,5,2,9,3 inorder: 8,6,2,5,9,1,3 postorder: 8,2,9,5,6,3,1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  11. הגדרות typedef struct TreeNode { int iData; /*The data of this tree node. */ struct TreeNode *left ; /*Pointer to the left child. */ struct TreeNode *right ; /*Pointer to the right child. */ } TreeNode; typedef struct ListNode { int iData; /*The data of this list node. */ struct ListNode * next ; /*Pointer to the next node*/ } ListNode; Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  12. תרגיל 2 • כתוב פונקציה הנקראת sum_tree שמקבלת כקלט מצביע לשורש עץ המכיל ערכים שלמים בצמתיו ומחזירה את סכום הערכים של צמתיו קדקודיו. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  13. תרגיל 2 - פתרון float sum_tree(TreeNode* tree) { if (!tree) return 0; return ( (tree->iData) + (sum_tree(tree->left)) + (sum_tree(tree->right)) ) ; } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  14. 1 6 3 תרגיל 3 • כתוב פונקציה ListNode* tree_to_inorder_list(TreeNode* root) המקבלת כקלט מצביע לעץ ומחזירה מצביע לרשימה מקושרת המחזיקה את אברי העץ לפי סידור inorder. הניחו כי הפונקציות הבאות קיימות: • curr = create_list_node(node->iData); • curNode= append_lists(leftNode, rightNode); 6 1 3 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  15. תרגיל 3 - פתרון ListNode* tree_to_inorder_list(TreeNode* root){ ListNode* curr, *left = NULL, *right = NULL; if (root){ left = tree_to_inorder_list(root->left); right = tree_to_inorder_list(root->right); curr = create_list_node(root->iData); curr->next = right; left = append_lists(left, curr); } return left; } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  16. שאלת מבחן 2 נתונה ההגדרה הבאה של צומת בעץ בינארי: typedefstruct tree tree; struct tree { int value; int count; tree* left, *right; }; • כתוב פונקציה רקורסיבית • int fillNode(tree * node , int number)שמקבלת צומת בעץ ומספר שלם. הפונקציה תחשב כמה צמתים מתחת לצומת הנוכחי (כולל הצומת הנוכחי) מכילים את הערך number של node. את הערך שחושב תכניס למשתנה count ב- node. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  17. tree value=5 | count=3 2 | 3 3 | 3 2 | 1 3 | 1 3 | 2 5 | 1 2 | 1 3 | 1 5 | 1 שאלת מבחן 2 - המשך • כתוב פונקציה רקורסיביתvoid fillTree(tree * root) שמקבלת עץ בינארי ומחשבת עבור כל צומת בו כמה צמתים מתחתיו כולל הוא עצמו מכילים את הערך number. את תוצאת החישוב נכניס למשתנה count בצומת הנוכחי.

  18. שאלת מבחן 2 - פתרון intfillNode(tree *node,int value){ int temp; if(!node) return 0; temp=fillNode(node->left, value) + fillNode(node->right, value); if(node->value==value) node->count = ++temp; return temp; }  Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

  19. שאלת מבחן 2 – פתרון (המשך) void fillTree(node *root){ if(!root) return; fillNode(root, root->value); fillTree(root->left); fillTree(root->right); } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

More Related