190 likes | 336 Views
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).
E N D
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) רשימה מקושרת ממוינת ודו-כיוונית של איברים מוגדרת על פי ההגדרה הבאה: struct item { int value; inthowManyAfter; Item* next; Item* prev; } Item; Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel
רשימה דו כיוונית (שאלת מבחן 1– המשך) השדה value מציין את ערך האיבר, השדה howManyAfter מציין כמה איברים קיימים ברשימה אחרי האיבר, השדה next מצביע לאיבר הבא ברשימה והשדה prev מצביע לאיבר הקודם ברשימה. הרשימה ממוינת לפי השדה value בסדר עולה. הפונקציהitem* addItem(item *lst, intnewVal)יוצרת ומוסיפה לרשימה הממוינת שראשה lst איבר חדש שערכו newVal למיקום הנכון ברשימה, ומעדכנת את כל השדות הרלוונטיים בכל הרשימה. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel
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
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
עצים בינאריים - חזרה size = 9 height = 3
עץ בינארי - סריקות 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); } }
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
תרגיל 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
הגדרות 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
תרגיל 2 • כתוב פונקציה הנקראת sum_tree שמקבלת כקלט מצביע לשורש עץ המכיל ערכים שלמים בצמתיו ומחזירה את סכום הערכים של צמתיו קדקודיו. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel
תרגיל 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
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
תרגיל 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
שאלת מבחן 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
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 בצומת הנוכחי.
שאלת מבחן 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
שאלת מבחן 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