תרגילים לשרשרת חוליות 1

‫מדעי המחשב‬
‫‪1‬‬
‫מבני נתונים‬
‫שרשרת חוליות‬
‫רשימה מקושרת‬
‫חלק מהפעולות שלהלן הן פעולות שיש להן שימוש בהקשרים שונים (תבניות אלגוריתמיות)‪.‬‬
‫פעולות אלו סומנו בצבע אדום‪ .‬אם טרם עשית זאת‪ ,‬הוסף אותן למחלקת השרות ‪.Chain‬‬
‫‪.1‬‬
‫א‪.‬‬
‫ב‪.‬‬
‫ג‪.‬‬
‫כתוב פעולה המקבלת רשימה וערך מטיפוס איברי הרשימה‪ ,‬ומחזירה "אמת" אם הערך מופיע‬
‫ברשימה ו"שקר" אחרת‪.‬‬
‫כתוב פעולה‪ ,‬המקבלת רשימה וערך מטיפוס איברי הרשימה‪ ,‬ומחזירה את מקומו של הערך‬
‫ברשימה‪ .‬אם הערך לא ברשימה‪ ,‬יוחזר ‪.null‬‬
‫כתוב פעולה המקבלת רשימה ושני ערכים מטיפוס איברי הרשימה‪ ,‬ומעדכנת את המקום שבו נמצא‬
‫הערך הראשון להיות הערך השני‪ .‬התבסס על הפעולות ככתבת בסעיפים הקודמים‪.‬‬
‫]‪ lst [3, 5, 4, 7, 4, 8‬והערכים ‪ 4‬ו‪,20 -‬‬
‫לדוגמה‪ ,‬עבור הרשימה‪:‬‬
‫תתקבל הרשימה‪lst [3, 5, 20, 7, 4, 8] :‬‬
‫‪.3‬‬
‫ברצוננו להוסיף את הפעולות הבאות לפעולות המטפלות במבנה נתונים‪ :‬רשימה‪:‬‬
‫אורך‪-‬רשימה ‪ -‬בהינתן רשימה ‪ L‬תחזיר הפעולה את מספר האיברים ברשימה‪.‬‬
‫מחק‪-‬ברשימה ‪ -‬בהינתן רשימה ‪ L‬והמספר ‪" ,x‬יימחקו" כל האיברים שערכם ‪ x‬ברשימה‪.‬‬
‫החלף‪-‬ברשימה ‪ -‬בהינתן רשימה ‪ L‬ומקום ‪ p‬בה‪ ,‬תהפוך הפעולה את הסדר בין האיבר שבמקום ‪ p‬לבין‬
‫האיבר העוקב לו ברשימה‪( .‬שים ‪ :‬יש לטפל במקרה שבו אין איבר עוקב לאיבר שבמקום ‪.)p‬‬
‫כתוב אלגוריתם למימוש פעולות אילו (השתמש בפעולות שבממשק רשימה)‪.‬‬
‫א‪.‬‬
‫חשב את הסיבוכיות של הפעולות שמימשת‪.‬‬
‫ב‪.‬‬
‫‪.4‬‬
‫שרשור רשימות‪ :‬כתוב פעולה בשם ‪ concat‬המקבלת שתי רשימות ומשרשרת את הרשימה הראשונה לסופה‬
‫של הרשימה השנייה‪.‬‬
‫‪.5‬‬
‫מיזוג רשימות‪ :‬כתוב פעולה המקבלת שתי רשימות ממויינות בסדר עולה‪ ,‬בכל רשימה אין ערך החוזר על‬
‫עצמו יותר מפעם אחת‪ ,‬ומחזירה רשימה שלישית ממויינת‪ ,‬שהיא רשימת האיחוד של שתי הרשימות‪ ,‬בדרך‬
‫הבאה‪:‬‬
‫עם חזרות‪ :‬אם ערך מופיע בשתי הרשימות‪ ,‬הוא יופיע פעמיים ברשימת האיחוד‪.‬‬
‫א‪.‬‬
‫ללא חזרות‪ :‬אם ערך מופיע בשתי הרשימות‪ ,‬הוא יופיע ברשימת האיחוד בדיוק פעם אחת‪.‬‬
‫ב‪.‬‬
‫‪.6‬‬
‫חיתוך רשימות‪ :‬כתוב פעולה המקבלת שתי רשימות ממויינות בסדר עולה‪ ,‬בכל רשימה אין ערך החוזר על‬
‫עצמו יותר מפעם אחת‪ ,‬ומחזירה את רשימת החיתוך ‪ -‬רשימה המכילה את כל האיברים הנמצאים בשתי‬
‫הרשימות גם יחד‪.‬‬
‫‪.7‬‬
‫כתוב פעולה המקבלת שתי רשימות לא ממויינות ‪ ,‬בכל רשימה אין ערך החוזר על עצמו יותר מפעם אחת‪,‬‬
‫ומחזירה רשימה שלישית שהיא רשימת האיחוד של שתי הרשימות‪ ,‬כך שאיברים המופיעים בשתי הרשימות‬
‫יופיעו ברשימת האיחוד פעם אחת בלבד‪.‬‬
‫‪.8‬‬
‫נתונה רשימה ‪ L‬של מספרים שלמים‪.‬‬
‫כתוב פעולה בשם רשימת‪-‬המספרים‪-‬העוקבים‪-‬המקסימלית ‪ longestSubList‬שתחזיר רשימה חדשה‬
‫שהיא רשימת המספרים העוקבים הגדולה ביותר ברשימה נתונה ‪.L‬‬
‫(שני מספרים עוקבים אם השני גדול מהראשון ב‪.)-1‬‬
‫]‪L1 [3 , 5 , 6 , 7 , 8 , -1 , 0 , 1 , 2 , 3 , 4 , 6 , 7 , 13 , 1 , 2‬‬
‫למשל‪ ,‬עבור הרשימה‪:‬‬
‫]‪L2 [-1 , 0 , 1 , 2 , 3 , 4‬‬
‫תתקבל רשימת המספרים המקסימלית הבאה‪:‬‬
‫‪blog.csit.org.il‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫‪.9‬‬
‫מבני נתונים‬
‫‪2‬‬
‫הרשימות ‪ L1‬ו‪ L2-‬ממומשות באמצעות שרשרת חוליות‪ .‬ידוע כי קיימת חוליה כלשהי בכל אחת משתי‬
‫הרשימות המצביעה על חוליה המשותפת לשתי הרשימות‪ ,‬החל מחוליה המשך הרשימה משותף‪.‬‬
‫ראה דוגמה‪ :‬שים ♥‪ ,‬כי מספר החוליות עד לחוליה המשותפת אינו חייב להיות זהה בשתי הרשימות‪.‬‬
‫‪3‬‬
‫‪6‬‬
‫‪//‬‬
‫‪12‬‬
‫‪7‬‬
‫‪8‬‬
‫ב‪.‬‬
‫‪.10‬‬
‫‪5‬‬
‫‪1‬‬
‫‪21‬‬
‫א‪.‬‬
‫‪L1‬‬
‫‪9‬‬
‫‪L2‬‬
‫ממש את הפעולה‪ listDisconnect (L1, L2) :‬שתקבל שתי רשימות לא ריקות ‪ L1‬ו‪L2-‬‬
‫המחוברות ביניהן בנקודה כלשהי ומנתקת אותן‪ .‬לאחר הפעלת הפעולה‪ ,‬תכיל כל אחת מהרשימות‬
‫בסופה את האיברים המשותפים‪( .‬ראה איור)‬
‫‪//‬‬
‫‪6‬‬
‫‪12‬‬
‫‪7‬‬
‫‪1‬‬
‫‪3‬‬
‫‪8‬‬
‫‪//‬‬
‫‪6‬‬
‫‪12‬‬
‫‪7‬‬
‫‪1‬‬
‫‪21‬‬
‫‪9‬‬
‫‪5‬‬
‫‪L1‬‬
‫‪L2‬‬
‫מהי סיבוכיות הפעולה שכתבת בסעיף א' כפונקציה של המספר האיברים בכל אחת משתי הרשימות‬
‫המחוברות? נמק!‬
‫מספרים שלמים גדולים יכולים להיות מיוצגים ע"י רשימה באופן הבא‪:‬‬
‫המספר ‪ 113,526,785,901‬יהיה מיוצג ברשימה‪:‬‬
‫‪//‬‬
‫‪112‬‬
‫‪526‬‬
‫‪785‬‬
‫‪901‬‬
‫‪lst‬‬
‫שים ♥ כי שלשות המספרים נרשמות בסדר הפוך‪.‬‬
‫כתוב פעולה המקבלת שתי רשימות ‪ lst1‬ו‪ ,lst2 -‬המייצגות כל אחת מספר בייצוג הנ"ל‪ ,‬ומחזירה רשימה‬
‫שלישית שהיא רשימת הסכום שלהן‪.‬‬
‫‪.11‬‬
‫רשימה ‪ L1‬היא תת‪-‬רשימה של רשימה ‪ L2‬אם מתקיימים שני תנאים‪:‬‬
‫כל איבר ‪ x‬ברשימה ‪ L1‬קיים גם ברשימה ‪.L2‬‬
‫‪‬‬
‫סדר האיברים זהה בשתי הרשימות‪.‬‬
‫‪‬‬
‫‪  3, 12, 5, 32, 1‬היא תת‪-‬רשימה של ‪6, 3, 34, 1, 1, 12, 5, 8, 32, 5, 1‬‬
‫לדוגמה‪:‬‬
‫שים ♥‪ :‬האיברים ברשימה ‪ L1‬אינם חייבים להופיע ברצף בתוך הרשימה ‪.L2‬‬
‫כתוב פעולה‪ :‬האם‪-‬תת‪-‬רשימה )‪ ,isSubList (L1, L2‬שתקבל כפרמטר שתי רשימות ותחזיר 'אמת'‪ ,‬אם ‪L1‬‬
‫היא תת‪-‬רשימה של ‪ L2‬ו'שקר' אחרת‪.‬‬
‫‪blog.csit.org.il‬‬
‫הילה קדמן‬
‫מדעי המחשב‬
‫‪.12‬‬
‫מבני נתונים‬
‫‪3‬‬
‫(בגרות‪ ,‬תשנ"ח) ‪ -‬מקטע‪-‬משותף‪-‬מכסימלי לשתי רשימות נתונות הוא תת‪-‬רשימה הרצופה המכסימלית‪,‬‬
‫המשותפת לשתיהן‪.‬‬
‫לדוגמה‪ :‬עבור הרשימות ‪ L1‬ו‪: L2-‬‬
‫המקטע המשותף המכסימלי הוא הרשימה ‪.l3‬‬
‫‪L1: 1,5,6,3,4,8,9,5,4,3,6,7‬‬
‫‪L2: 5,4,4,8,9,5,6,3,6‬‬
‫‪L3: 4,8,9,5‬‬
‫נתונה הפעולה‪:‬‬
‫‪Java: public static boolean listCompare (Node<Integer> L1, Node<Integer> L2,‬‬
‫)‪Node<Integer> p1, Node<Integer>, int n‬‬
‫‪public static bool listCompare (Node<int> L1, Node<int> L2,‬‬
‫)‪Node<int> p1, Node<int>, int n‬‬
‫‪C#:‬‬
‫הפעולה מקבלת שתי רשימות‪ ,‬שתי הפניות ומספר שלם ( ‪p1‬מפנה על חוליה ב‪ L1 -‬ו‪ p2 -‬מפנה על חוליה ב‪-‬‬
‫‪ .)L2‬הפעולה מחזירה "אמת" אם ‪ n‬האיברים החל מ ‪ p1‬ברשימה ‪ , L1‬זהים ל‪ n-‬האיברים החל מ‪p2-‬‬
‫ברשימה ‪ ,L2‬ו‪"-‬שקר" אחרת‪ .‬אם יש פחות מ‪ n -‬איברים אחרי ‪ p1‬או אחרי ‪ ,p2‬יוחזר "שקר"‪.‬‬
‫כתוב פעולה בשם ‪ ,maxJointSection‬שתקבל שתי רשימות ‪ L1‬ו‪ , L2-‬ותחזיר את המקטע המשותף‬
‫המכסימלי לשתיהן‪ .‬השתמש בפעולהה הנתונה‪.‬‬
‫שים ♥‪ :‬בבחינה היה רשום‪ :‬הפונקציה ‪ listCompare‬נתונה ואין צורך לממש אותה‪.‬‬
‫בדף העבודה זה‪ ,‬כדי להריץ את התכנית יש לממש את הפעולה‪.‬‬
‫‪blog.csit.org.il‬‬
‫הילה קדמן‬