נגדיר רשימה דו־כיוונית כאוסף סדור של חוליות מטיפוס BinNode<Integer> (ב-Java) או BinNode<int> (ב-C#) המקושרות כך: לכל זוג חוליות p1, p2 ברשימה, אם מתקיים p1.getRight() == p2 אז מתקיים גם p2.getLeft() == p1. ברשימה דו־כיוונית יש לפחות שתי חוליות.
כלומר: כל חוליה ברשימה — חוץ מהחוליה שבקצה הימני של הרשימה והחוליה שבקצה השמאלי של הרשימה — מצביעה על החוליה שלפניה ועל החוליה שאחריה.
לפניכם דוגמה לרשימה דו־כיוונית ומשתנה pos מטיפוס BinNode<Integer> המצביע על חוליה כלשהי ברשימה. המשתנה pos מצביע על החוליה שערכה 11:
הפעולה firstLeft (ב-C#: FirstLeft) מקבלת מצביע pos שונה מ-null המצביע על חוליה כלשהי ברשימה דו־כיוונית, ומחזירה את החוליה השמאלית ביותר ברשימה. הפעולה firstRight (ב-C#: FirstRight) מחזירה בהתאמה את החוליה הימנית ביותר.
1// שלד הפעולה firstLeft (להשלמה בסעיף א):
2public static BinNode<Integer> firstLeft(BinNode<Integer> pos)
3{
4 while ( ______________ )
5 pos = ______________ ;
6 return ______________ ;
7}
8
9// הפעולה what (נתונה — למעקב בסעיף ב):
10public static boolean what(BinNode<Integer> pos)
11{
12 BinNode<Integer> left = firstLeft(pos);
13 BinNode<Integer> right = firstRight(pos);
14 int sum = left.getValue() + right.getValue();
15 left = left.getRight();
16 right = right.getLeft();
17 while ((left != right) && (left.getRight() != right) &&
18 (left.getValue() + right.getValue() == sum))
19 {
20 left = left.getRight();
21 right = right.getLeft();
22 }
23 if (left == right)
24 return right.getValue() == sum;
25 if (left.getRight() == right)
26 return left.getValue() + right.getValue() == sum;
27 return false;
28}העתיקו את שלד הפעולה firstLeft (ב-C#: FirstLeft) והשלימו אותו, כך שהפעולה תבצע את הנדרש — תחזיר את החוליה השמאלית ביותר ברשימה.
עקבו אחר ביצוע הפעולה what (ב-C#: What) הנתונה, בעבור המשתנה pos והרשימה שבדוגמה שבתיאור (pos מצביע על החוליה שערכה 11). במעקב הַראו את הרשימה הדו־כיוונית ואת ערכי המשתנים pos, left, right, sum, וכתבו את הערך הבוליאני שהפעולה מחזירה.
קִבעו אם אפשר או אי אפשר להחליף את שלוש השורות האחרונות שבפעולה what — כלומר את שתי הוראות ה-if וההוראה return false — בהוראה היחידה:
return left.getValue() + right.getValue() == sum;
נמקו את קביעתכם.
נגדיר רשימה דו־כיוונית כאוסף סדור של חוליות מטיפוס BinNode<Integer> (ב-Java) או BinNode<int> (ב-C#) המקושרות כך: לכל זוג חוליות p1, p2 ברשימה, אם מתקיים p1.getRight() == p2 אז מתקיים גם p2.getLeft() == p1. ברשימה דו־כיוונית יש לפחות שתי חוליות.
כלומר: כל חוליה ברשימה — חוץ מהחוליה שבקצה הימני של הרשימה והחוליה שבקצה השמאלי של הרשימה — מצביעה על החוליה שלפניה ועל החוליה שאחריה.
לפניכם דוגמה לרשימה דו־כיוונית ומשתנה pos מטיפוס BinNode<Integer> המצביע על חוליה כלשהי ברשימה. המשתנה pos מצביע על החוליה שערכה 11:
הפעולה firstLeft (ב-C#: FirstLeft) מקבלת מצביע pos שונה מ-null המצביע על חוליה כלשהי ברשימה דו־כיוונית, ומחזירה את החוליה השמאלית ביותר ברשימה. הפעולה firstRight (ב-C#: FirstRight) מחזירה בהתאמה את החוליה הימנית ביותר.
1// שלד הפעולה firstLeft (להשלמה בסעיף א):
2public static BinNode<Integer> firstLeft(BinNode<Integer> pos)
3{
4 while ( ______________ )
5 pos = ______________ ;
6 return ______________ ;
7}
8
9// הפעולה what (נתונה — למעקב בסעיף ב):
10public static boolean what(BinNode<Integer> pos)
11{
12 BinNode<Integer> left = firstLeft(pos);
13 BinNode<Integer> right = firstRight(pos);
14 int sum = left.getValue() + right.getValue();
15 left = left.getRight();
16 right = right.getLeft();
17 while ((left != right) && (left.getRight() != right) &&
18 (left.getValue() + right.getValue() == sum))
19 {
20 left = left.getRight();
21 right = right.getLeft();
22 }
23 if (left == right)
24 return right.getValue() == sum;
25 if (left.getRight() == right)
26 return left.getValue() + right.getValue() == sum;
27 return false;
28}העתיקו את שלד הפעולה firstLeft (ב-C#: FirstLeft) והשלימו אותו, כך שהפעולה תבצע את הנדרש — תחזיר את החוליה השמאלית ביותר ברשימה.
עקבו אחר ביצוע הפעולה what (ב-C#: What) הנתונה, בעבור המשתנה pos והרשימה שבדוגמה שבתיאור (pos מצביע על החוליה שערכה 11). במעקב הַראו את הרשימה הדו־כיוונית ואת ערכי המשתנים pos, left, right, sum, וכתבו את הערך הבוליאני שהפעולה מחזירה.
קִבעו אם אפשר או אי אפשר להחליף את שלוש השורות האחרונות שבפעולה what — כלומר את שתי הוראות ה-if וההוראה return false — בהוראה היחידה:
return left.getValue() + right.getValue() == sum;
נמקו את קביעתכם.