אתם מתרגלים שאלה מתוך בגרות מדעי המחשב — מבני נתונים (שאלון 899271)מבחן 2016 · קיץ מועד א · שאלה 5כל שאלות המבחן ←
מבנים לינאריים›רשימות מקושרות

מוגדרת "רשימה דו-כיוונית" כאוסף סדור של חוליות BinNode<int> המקושרות כך שלכל זוג חוליות p1,p2: אם p1.GetRight()==p2 אז p2.GetLeft()==p1 (יש לפחות שתי חוליות). כלומר כל חוליה — חוץ מהחוליה שבקצה הימני והחוליה שבקצה השמאלי — מצביעה על החוליה שלפניה ועל החוליה שלאחריה. בדוגמה שבשאלון: הרשימה 13-10-27-11-8 (null בקצה שמאל, null בקצה ימין), ומשתנה pos מצביע על החוליה עם הערך 11.

public class BinNode<T> {
    private T value;
    private BinNode<T> left;   // ברשימה דו-כיוונית: החוליה השמאלית (הקודמת)
    private BinNode<T> right;  // ברשימה דו-כיוונית: החוליה הימנית (הבאה)
    public BinNode(T value) { this.value = value; this.left = null; this.right = null; }
    public T GetValue() { return value; }
    public void SetValue(T value) { this.value = value; }
    public BinNode<T> GetLeft() { return left; }
    public void SetLeft(BinNode<T> left) { this.left = left; }
    public BinNode<T> GetRight() { return right; }
    public void SetRight(BinNode<T> right) { this.right = right; }
}
// "רשימה דו-כיוונית": לכל זוג חוליות p1,p2 — אם p1.GetRight()==p2 אז p2.GetLeft()==p1.

הרשימה הדו-כיוונית שבדוגמה, pos מצביע על החוליה עם הערך 11

null <- [13] <-> [10] <-> [27] <-> [11] <-> [8] -> null
                                    ^pos

הפעולה FirstLeft מקבלת מצביע pos שונה מ-null מטיפוס BinNode<int> המצביע על חוליה כלשהי ברשימה דו-כיוונית ומחזירה את החוליה השמאלית ביותר ברשימה. הפעולה FirstRight מקבלת מצביע pos שונה מ-null מטיפוס BinNode<int> המצביע על חוליה כלשהי ברשימה דו-כיוונית ומחזירה את החוליה הימנית ביותר ברשימה.

לסעיף ב — לפניך הפעולה What(BinNode<int> pos) המקבלת מצביע לחוליה כלשהי ברשימה דו-כיוונית ומחזירה ערך בוליאני. הרשימה הדו-כיוונית מכילה לפחות 3 חוליות.

public static bool What(BinNode<int> pos)
{
    BinNode<int> left = FirstLeft(pos);
    BinNode<int> right = FirstRight(pos);

    int sum = left.GetValue() + right.GetValue();
    left = left.GetRight();
    right = right.GetLeft();

    while ((left != right) && (left.GetRight() != right) &&
           (left.GetValue() + right.GetValue() == sum))
    {
        left = left.GetRight();
        right = right.GetLeft();
    }
    if (left == right)
        return right.GetValue() == sum;

    if (left.GetRight() == right)
        return left.GetValue() + right.GetValue() == sum;
    return false;
}

«השורות המוקפות במסגרת» הן שלוש השורות האחרונות בפעולה: מ-if (left.GetRight() == right) ועד return false;.

סעיף א

לפניך שלד הפעולה FirstLeft המקבלת pos שונה מ-null מטיפוס BinNode<int> המצביע על חוליה כלשהי ברשימה דו-כיוונית, ומחזירה את החוליה השמאלית ביותר ברשימה. העתק את השלד למחברתך והשלם אותו כך שהפעולה תבצע את הנדרש.

public static BinNode<int> FirstLeft(BinNode<int> pos)

סעיף ב1

עקוב אחר ביצוע הפעולה What(pos) בעבור המשתנה pos והרשימה הדו-כיוונית שבדוגמה שהוצגה בתחילת השאלה. במעקב הראה את ערכי המשתנים pos, left, right, sum.

סעיף ב2

קבע אם אפשר או אי אפשר להחליף את 3 השורות האחרונות שבפעולה — השורות המוקפות במסגרת — בהוראה: return left.GetValue()+right.GetValue()==sum;. נמק את קביעתך.

שאלות ותגובות על השאלה

🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות

שאלו כאן — ותקבלו מענה מוסמך.

🎓 מרצה לתכנות עונה כאן — תקבלו מענה מקצועי