using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using Unit4.CollectionsLib; namespace OpenS { internal class Program { static void Main(string[] args) { // יצירת שרשרת חוליות (של מספרים שלמים) חדשה בעלת איבר אחד, איבר הבא נאל Node<int> node = new Node<int>(1); Console.WriteLine("Chain: " + node); // הדפסת השרשרת node.SetValue(2); // עדכון ערך השרשרת Console.WriteLine("New Chain: " + node); // הדפסת השרשרת החדשה // יצירת שרשרת חוליות (של מספרים שלמים) חדשה בעלת איבר אחד, איבר הבא נאל Node<int> chain = new Node<int>(1); Console.Write("New Chain: "); PrintChain(chain); // הדפסת (כל) השרשרת // יצירת שרשרת חוליות (של מספרים שלמים), איבר הבא נאל Node<int> chain1 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); Console.Write("New Chain: "); PrintChain(chain1); ; // הדפסת השרשרת // גישה לערכים Console.WriteLine("First Node Value: " + chain1.GetValue()); // קבלת הערך של האיבר הראשון Console.WriteLine("Second Node Value: " + chain1.GetNext().GetValue()); // קבלת הערך של האיבר השני Console.WriteLine("Third Node Value: " + chain1.GetNext().GetNext().GetValue()); // קבלת הערך של האיבר השלישי //... Node<int> chain2 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); // יצירת שרשרת חדשה Console.Write("New Chain: "); PrintChainReverse(chain2); // הפעלת פונקציה שלוקחת שרשרת מקושרת ומחזירה את איברי השרשרת בסדר הפוך Node<int> chain3 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); // יצירת שרשרת חדשה int size = SizeOfChain(chain3); // הפעלת פונקציה שלוקחת שרשרת ומחזירה את כמות האיברים בשרשרשת מקושרת Console.WriteLine("Size Of Chain: " + size); // הדפסת השרשרת החדשה Node<int> chain4 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); int NodeValue1 = 1; int NodeValue2 = 0; bool IsNodeExists1 = IsNodeExists(chain4, NodeValue1); // הפעלת פונקציה שבודקת אם ערך ווליו שמתקבל קיים בשרשרת Console.WriteLine("Is The Value " + NodeValue1 + " Exist? " + IsNodeExists1); bool IsNodeExists2 = IsNodeExists(chain4, NodeValue2); // הפעלת פונקציה שבודקת אם ערך ווליו שמתקבל קיים בשרשרת Console.WriteLine("Is The Value " + NodeValue2 + " Exist? " + IsNodeExists2); Node<int> chain5 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); chain5 = RemoveFirst(chain5); // הפעלת פונקציה שלוקחת שרשרת ומסירה את האיבר הראשון בשרשרת מקושרת Console.Write("New Chain: "); PrintChain(chain5); // הדפסת השרשרת החדשה Node<int> chain6 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); chain5 = RemoveLast(chain6); // הפעלת פונקציה שלוקחת שרשרת ומסירה את האיבר האחרון בשרשרת מקושרת Console.Write("New Chain: "); PrintChain(chain6); // הדפסת השרשרת החדשה Node<int> chain7 = new Node<int>(1, new Node<int>(3, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); int value1 = 3; bool IsNodeExists3 = IsNodeExists(chain7, value1); // בדיקה אם הערך שאנחנו רוצים להוציא מהשרשרת המקושרת בכלל קיים if (IsNodeExists3 == true) // אם הערך קיים { chain6 = RemoveByValue(chain6, value1); // הפעלת הפונקציה שמסירה איבר לפי ערך Console.Write("New Chain: "); PrintChain(chain6); // הדפסת השרשרת החדשה } Node<int> chain8 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); int index = 3; chain8 = RemoveByIndex(chain8, index); // הפעלת הפונקציה שמירה איבר לפי אינדקס Console.Write("New Chain: "); PrintChain(chain8); // הדפסת השרשרת החדשה // יצירת שרשרת חוליות של מספרים שלמים. נקסט אחרון שווה נאל Node<int> chain9 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); // יצירת שרשרת חוליות של מספרים שלמים. נקסט אחרון שווה נאל // יצירת שרשרת חוליות של מספרים שלמים. נקסט אחרון שווה נאל Node<int> chain10 = new Node<int>(5, new Node<int>(4, new Node<int>(3, new Node<int>(2, new Node<int>(1))))); // יצירת שרשרת חוליות של מספרים שלמים. נקסט אחרון שווה נאל bool isSorted1 = IsSortedAscending(chain7); // הפעלת הפונקציה שבודקת אם סדר האיברים עולה ברשימה מקושרת Console.WriteLine("Is Chain Sorted Ascending? " + isSorted1); bool isSorted2 = IsSortedAscending(chain8); // הפעלת הפונקציה שבודקת אם סדר האיברים עולה ברשימה מקושרת Console.WriteLine("Is Chain Sorted Ascending? " + isSorted2); bool isSorted3 = IsSortedDescending(chain9); // הפעלת הפונקציה שבודקת אם סדר האיברים יורד ברשימה מקושרת Console.WriteLine("Is Chain Sorted Descending? " + isSorted3); bool isSorted4 = IsSortedDescending(chain10); // הפעלת הפונקציה שבודקת אם סדר האיברים יורד ברשימה מקושרת Console.WriteLine("Is Chain Sorted Descending? " + isSorted4); Node<int> chain11 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); double average = Average(chain11); // הפעלת פונקציה שמחשבת את הממוצע ברשימה מקושרת ושמירתו במשתנה Console.WriteLine("The Average: " + average); // הדפסת הממוצע Node<int> chain12 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); int number = 6; chain12 = AddNodeStart(chain12, number); // עפעלת פונקציה שמוסיפה איבר בתחילת שרשרת מקושרת Console.Write("New Chain: "); PrintChain(chain12); // הדפסת השרשרת החדשה Node<int> chain13 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); int number1 = 0; AddNodeEnd(chain13, number1); // הפעלת פונקציה שמוסיפה איבר בסוף שרשרת מקושרת Console.Write("New Chain: "); PrintChain(chain13); // הדפסת השרשרת החדשה Node<int> chain14 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); int value = 10; int index1 = 5; chain14 = AddNodeAtIndex(chain14, index1, value); // הפעלת פונקציה שמוסיפה איבר בשרשרת מקושרת לפי אינדקס Console.Write("New Chain: "); PrintChain(chain14); // הדפסת השרשרת החדשה Node<int> chain15 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5, new Node<int>(6)))))); Node<int> chain16 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); FindAndPrintMiddle(chain15); // הדפסת האיבר/ים האמצעי/ים FindAndPrintMiddle(chain16); // הדפסת האיבר/ים האמצעי/ים Node<int> chain17 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); Node<int> chain18 = new Node<int>(2, new Node<int>(2, new Node<int>(10, new Node<int>(4, new Node<int>(5))))); bool isBalanced1 = IsBalanced(chain17); // הפעלת פונקציה שבודקת אם ברשימה מקושרת מספר האיברים הגדולים מהממוצע שווה למספר האיברים הקטנים מהממוצע Console.WriteLine("Is the list balanced? " + isBalanced1); bool isBalanced2 = IsBalanced(chain18); // הפעלת פונקציה שבודקת אם ברשימה מקושרת מספר האיברים הגדולים מהממוצע שווה למספר האיברים הקטנים מהממוצע Console.WriteLine("Is the list balanced? " + isBalanced2); Node<int> chain19 = new Node<int>(2, new Node<int>(2, new Node<int>(2, new Node<int>(2, new Node<int>(3, new Node<int>(2, new Node<int>(4))))))); int numToFind = 2; int sequenceCount = sequences(chain19, numToFind); Console.WriteLine($"Number of sequences for {numToFind}: {sequenceCount}"); Node<int> chain20 = new Node<int>(2, new Node<int>(0, new Node<int>(3, new Node<int>(4, new Node<int>(5, new Node<int>(6)))))); int minIndex = FindMinValueIndex(chain20); // הפעלת פונקציה שמוצאת את האינדקס של הערך הנמוך ביותר בשרשרת Console.WriteLine("The index of the minimum value is: " + minIndex); // הדפסת הערך Node<int> chain21 = new Node<int>(0, new Node<int>(1, new Node<int>(3, new Node<int>(4, new Node<int>(5, new Node<int>(6)))))); int maxIndex = FindMaxValueIndex(chain21); // הפעלת פונקציה שמוצאת את האינדקס של הערך הנמוך ביותר בשרשרת Console.WriteLine("The index of the maximum value is: " + maxIndex); // הדפסת הערך Node<int> chain22 = new Node<int>(1, new Node<int>(2, new Node<int>(1, new Node<int>(4, new Node<int>(5))))); List<int> minIndexes = FindMinValueIndexes(chain22); // הפעלת פונקציה שמוצאת את האינדקס/ים של הערך/ים הנמוך/ים ביותר בשרשרת Console.WriteLine("The indexes of the minimum value is: " + string.Join(", ", minIndexes)); // הדפסת הערך Node<int> chain23 = new Node<int>(5, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); List<int> maxIndexes = FindMaxValueIndexes(chain23); // הפעלת פונקציה שמוצאת את האינדקס/ים של הערך/ים הנמוך/ים ביותר בשרשרת Console.WriteLine("The indexes of the maximum value is: " + string.Join(", ", maxIndexes)); // הדפסת הערך Node<int> chain24 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); List<int> secondMaxIndexes = FindSecondMaxValueIndex(chain24); // הפעלת הפונקציה Console.WriteLine("The index of the second maximum value is: " + string.Join(", ", secondMaxIndexes)); // הדפסת הערכים Node<int> chain25 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); List<int> secondMinIndexes = FindSecondMinValueIndex(chain25); // הפעלת הפונקציה Console.WriteLine("The index of the second minimum value is: " + string.Join(", ", secondMinIndexes)); // הדפסת הערכים Node<int> chain26 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(2, new Node<int>(1))))); Node<int> chain27 = new Node<int>(1, new Node<int>(2, new Node<int>(3, new Node<int>(4, new Node<int>(5))))); bool Palindrome1 = IsPalindrome(chain26); // הפעלת פונקציה שבודקת אם הרשימה היא פלינדרום Console.WriteLine("Is The Chain a Palindrome? " + Palindrome1); bool Palindrome2 = IsPalindrome(chain27); // הפעלת פונקציה שבודקת אם הרשימה היא פלינדרום Console.WriteLine("Is The Chain a Palindrome? " + Palindrome2); } // Node<int> current = chain; // משתנה שמצביע על האיבר הנוכני ברשימה. בתחילת הלולאה הוא מצביע על ראש הרשימה. static void PrintChain(Node<int> chain) // פונקציה להדפסת כל האיברים ברשימה מקושרת { Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current != null) // לולאה שעוברת על כל האיברים ברשימה עד לסופה { Console.Write(current.GetValue() + " ---> "); //הדפסת האיבר הנוכחי ברשימה current = current.GetNext(); // עבור לאיבר הבא ברשימה } Console.WriteLine("Null!"); // לאחר סיום הפונקציה והדפסת כל האיברים, אין עוד איברים ולכן איבר הבא נאל } static void PrintChainReverse(Node<int> chain) // פונקציה להדפסת כל האיברים בסדר הפוך ברשימה מקושרת { if (chain == null) // אם השרשרת ריקה { Console.WriteLine("The chain is null. Nothing to print."); // הודעה מתאימה return; // יציאה מהפונקציה } List<int> values = new List<int>(); // רשימה זמנית לאחסון הערכים Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית // איסוף כל הערכים בשרשרת while (current != null) // כל עוד השרשרת לא ריקה { values.Add(current.GetValue()); // מוסיף את הערך לרשימה של ווליוס current = current.GetNext(); // עבור לאיבר הבא } // הדפסת הערכים מהסוף להתחלה for (int i = values.Count - 1; i >= 0; i--) { Console.Write(values[i] + " ---> "); } Console.WriteLine("Null!"); // הגענו לאיבר האחרון } public static int SizeOfChain(Node<int> chain) // פונקציה שמחזירה את כמות האיברים ברשימה מקושרת { if (chain == null) // אם השרשרת ריקה { return 0; // אין איברים } int size = 0; // אתחול הגודל Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current != null) // לולאה שרצה על כל איברי השרשרת { size++; // עלה את סכום האיברים current = current.GetNext(); // עבור לאיבר הבא ברשימה } return size; // החזר את כמות האיברים } public static bool IsNodeExists(Node<int> chain, int value) // פונקציה שבודקת אם איבר קיים לפי ערך ווליו (שמתקבל בפרמטר) ברשימה מקושרת { // משתנה עזר לשימירת הרשימה/השרשרת המקורית Node<int> current = chain; // לולאה שרצה על כל האיברים ברשימה while (current != null) { // אם הערך של האיבר הנוכחי שווה לערך שחיפשנו if (current.GetValue() == value) { return true; // מצאנו את הערך } // עוברים לאיבר הבא current = current.GetNext(); } // אם יצאנו מהלולאה בלי למצוא את הערך, האיבר לא קיים return false; } public static Node<int> RemoveFirst(Node<int> chain) // פונקציה שמסירה את האיבר הראשון ברשימה מקושרת { if (chain == null) // אם השרשרת ריקה { return null; // מקרה קיצון, אין איברים להסרה } if (chain.GetNext() == null) // אם בשרשרת איבר יחיד { return null; // מקרה קיצון, אם בשרשרת יש רק איבר אחד ונסיר אותו לא תתקיים שרשרת } return chain.GetNext(); // הסרת האיבר הראשון והחזרת הרשימה החדשה } public static Node<int> RemoveLast(Node<int> chain) // פונקציה שמסירה את האיבר האחרון ברשימה מקושרת { if (chain == null) // אם השרשרת ריקה { return null; // מקרה קיצון, אין איבר להסרה } if (chain.GetNext() == null) // אם בשרשרת איבר יחיד { return null; // מקרה קיצון, אם בשרשרת יש רק איבר אחד ונסיר אותו לא תתקיים שרשרת } Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current.GetNext().GetNext() != null) // לולאה שרצה עד לאיבר האחרון { current = current.GetNext(); // עבור לאיבר הבא } current.SetNext(null); // הסרת האיבר האחרון return chain; // החזרת הרשימה החדשה } public static Node<int> RemoveByValue(Node<int> chain, int value) // פונקציה שמסירה את האיבר האחרון ברשימה מקושרת { if (chain == null) // אם השרשרת ריקה { return null; // מקרה קיצון, אין איבר להסרה } if (chain.GetNext() == null) // אם בשרשרת איבר יחיד { return null; // מקרה קיצון, אם בשרשרת יש רק איבר אחד ונסיר אותו לא תתקיים שרשרת } Node<int> NewNode = new Node<int>(0); // יצירת שרשרת חדשה לאחסון השרשרת המקורית NewNode.SetNext(chain); // קישור לראש הרשימה Node<int> prev = NewNode; // משתנה לאחסון האיבר הקודם Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית bool flag = false; // משתנה בוליאני שאומר האם מצאנו את האיבר להסרה while (current != null) // לולאה שעוברת על כל הרשימה { if (current.GetValue() == value) // אם מצאנו את האיבר להסרה { prev.SetNext(current.GetNext()); // קישור האיבר הקודם לאיבר הבא של האיבר הנוכחי flag = true; // עדכון המשתנה שמעיד שמצאנו את האיבר } else // אם לא מצאנו את האיבר הנוכחי { prev = current; // עדכון האיבר הקודם לאיבר הנוכחי } current = current.GetNext(); // עבור לאיבר הבא } if (!flag) // אם לא מצאנו את האיבר להסרה { Console.WriteLine($"Value {value} does not exist!"); // הערך לא קיים בשרשרת return null; // מקרה קיצון, צא מהפונקציה } return NewNode.GetNext(); // החזר את השרשרת החדשה } public static Node<int> RemoveByIndex(Node<int> chain, int index) // פונקציה שמסירה את איבר לפי אינדקס שמתקבל בפרמטר ברשימה מקושרת { if (chain == null || index < 0) // אם הרשימה ריקה או שהאינדקס שלילי { return null; // מקרה קיצון, אין איבר להעיף } if (chain.GetNext() == null) // אם בשרשרת איבר יחיד { return null; // מקרה קיצון, אם בשרשרת יש רק איבר אחד ונסיר אותו לא תתקיים שרשרת } Node<int> prev = null; // מצביע על הצומת הקודם Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית int currentIndex = 0; // מכיל את האינדקס הנוכחי שאנחנו נמצאים בו ברשימה while (current != null) // לולאה שרצה על כל האיברים { if (currentIndex == index) // אם מצאנו את האינדקס { if (prev == null) // אם האיבר להסרה הוא האיבר הראשון { chain = current.GetNext(); // עדכון הראש של הרשימה לאיבר הבא } else // אם האיבר להסרה הוא לא האיבר הראשון { prev.SetNext(current.GetNext()); // קישור האיבר הקודם לאיבר הבא של האיבר הנוכחי } } prev = current; // האיבר הקודם עובר להיות האיבר הנוכחי current = current.GetNext(); // עבור לאיבר הבא currentIndex++; // עברנו האינדקס הנוכחי } if (currentIndex <= index) // אם הגענו לסוף הרשימה מבלי למצוא את האינדקס { Console.WriteLine($"Index {index} does not exist!"); // האינדקס לא קיים return null; // מקרה קיצון, צא מהפונקציה } return chain; // החזרת הרשימה החדשה } public static bool IsSortedAscending(Node<int> chain) // פונקציה שבודקת אם רשימה מקושרת ממוינת בסדר עולה { if (chain == null || chain.GetNext() == null) // בדוק אם השרשרת ריקה או שקיים רק איבר אחד { return false; // אין סדר עולה } Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current.GetNext() != null) // לולאה שעוברת על כל האיברים { if (current.GetValue() >= current.GetNext().GetValue()) // אם הערך הנוכחי גדול מהערך הבא { return false; // הרשימה לא מסודרת } current = current.GetNext(); // עוברים לאיבר הבא } return true; // אם עברנו את כל הבדיקות, הרשימה מסודרת בסדר עולה } public static bool IsSortedDescending(Node<int> chain) // פונקציה שבודקת אם רשימה מקושרת ממוינת בסדר יורד { if (chain == null || chain.GetNext() == null) // בדוק אם השרשרת ריקה או שקיים רק איבר אחד { return false; // אין סדר עולה } Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current.GetNext() != null) // לולאה שעוברת על כל האיברים ברשימה עד הסוף { if (current.GetValue() <= current.GetNext().GetValue()) // אם הערך הנוכחי קטן או שווה לערך הבא { return false; // הרשימה לא בסדר יורד } current = current.GetNext(); // עבור לאיבר הבא ברשימה } return true; // אם עברנו את כל הבדיקות, הרשימה מסודרת בסדר יורד } public static double Average(Node<int> chain) // פונקציה שמדפיסה את ממוצע ערך האיברים ברשימה מקושרת { if (chain == null) // אם השרשרת ריקה { return 0; // ממוצע אפס } int sum = 0; // משתנה לשמירת סכום כל הערכים ברשימה int count = 0; // משתנה לספירת מספר האיברים ברשימה Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current != null) // לולאה שעוברת על כל האיברים ברשימה עד שהיא מגיעה לסוף { sum += current.GetValue(); // מוסיף את הערך של האיבר הנוכחי לסכום count++; // מגדיל את ספירת האיברים current = current.GetNext(); // מעביר את המצביע לאיבר הבא ברשימה } return (double)sum / count; // החזר את הממוצע } public static Node<int> AddNodeStart(Node<int> chain, int data) // פונקציה שמוסיפה איבר בתחילת רשימה מקושרת { // יצירת איבר חדש Node<int> newNode = new Node<int>(data); // הגדר את האיבר הבא לשרשרת המקורית newNode.SetNext(chain); // החזר את הרשימה החדשה לאחר הוספת האיבר return newNode; } public static void AddNodeEnd(Node<int> chain, int value) // פונקציה שמוסיפה איבר בסוף רשימה מקושרת { // יצירת איבר חדש עם הערך שקיבלנו מהפרמטר Node<int> newNode = new Node<int>(value); // בדוק אם הרשימה ריקה. אם כן, אין איבר להוספה if (chain == null) return; else { Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current.GetNext() != null) // לולאה שעוברת על כל האיברים ברשימה { current = current.GetNext(); // עבור לאיבר הבא ברשימה } current.SetNext(newNode); // חיבור האיבר החדש לסוף הרשימה } } public static Node<int> AddNodeAtIndex(Node<int> chain, int index, int value) // פונקציה שמוסיפה איבר לפי אינדקס (שמתקבל בפרמטר) ברשימה מקושרת { // יצירת איבר חדש עם הערך שקיבלנו מהפרמטר Node<int> newNode = new Node<int>(value); // בדוק אם הרשימה ריקה או אם האינדקס אינו תקין אם כן צא מהפונקציה if (chain == null || index < 0) { Console.WriteLine("Chain Is Empty Or Index Is"); return null; } // אם האינדקס הוא 0, הוסף את האיבר החדש בתחילת הרשימה if (index == 0) { // הגדר את האיבר הבא לשרשרת המקורית newNode.SetNext(chain); // החזר את הרשימה החדשה לאחר הוספת האיבר return newNode; } // מציאת האיבר לפני המקום שבו רוצים להוסיף Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית int currentIndex = 0; // משתנה לאחסון האינדקס הנוכחי while (current != null && currentIndex < index - 1) // לולאה לחיפוש האיבר המבוקש לפי האינדקס בפרמטר { current = current.GetNext(); // עבור לאיבר הבא currentIndex++; // עדכון האינדקס הנוכחי } // אם הגענו לסוף הרשימה, האינדקס לא קיים if (current == null) { Console.WriteLine("Nonexistent Index!"); // הדפסת הודעה מתאימה return null; // מקרה קיצון, יציאה מהפונקציה } // חיבור האיבר החדש לרשימה newNode.SetNext(current.GetNext()); // קישור האיבר החדש לאיבר הבא current.SetNext(newNode); // קישור האיבר הקודם לאיבר החדש return chain; // החזרת הראשימה החדשה } public static void FindAndPrintMiddle(Node<int> chain) // פונקציה שמוצאת את האיברים האמצעיים ברשימה מקושרת ומדפיסה אותם { if (chain == null) // אם השרשרת ריקה { Console.WriteLine("The List Is Empty."); // הודעה מתאימה return; // יציאה מהפונקציה } Node<int> slow = chain; // משתנה עזר ראשון שמצביע לאיבר הראשון ברשימה Node<int> fast = chain; // משתנה עזר שני שמצביע לאיבר הראשון ברשימה Node<int> prevSlow = null; // משתנה לאחסון האיבר הקודם של סלואו while (fast != null && fast.GetNext() != null) // לולאה שרצה על כל האיברים { prevSlow = slow; // עדכון האיבר הקודם להיות האיבר הנוכחי slow = slow.GetNext(); // האיבר הנוכחי הראשון עובר לאיבר הבא fast = fast.GetNext().GetNext(); // האיבר הנוכחי השני עובר שני איברים קדימה } if (fast == null) // מספר זוגי של איברים { Console.WriteLine($"The Middle Nodes: {prevSlow.GetValue()} and {slow.GetValue()}"); } else // מספר אי זוגי של איברים { Console.WriteLine($"The Middle Node: {slow.GetValue()}"); } } public static int GetValueByIndex(Node<int> chain, int index) // פונקציה שעוברת על כל האיברים בשרשרת ומחזירה את הערך של האיבר כאשר היא מגיעה לאינדקס המבוקש { int currentIndex = 0; // מייצג את האינדקס הנוכחי בשרשרת Node<int> currentNode = chain; // משתנה עזר לשמירת האיבר הנוכחי // לולאה שרצה על האיברים כל עוד לא הגענו לסוף השרשרת while (currentNode != null) { // בודק אם הגענו לאינדקס המבוקש if (currentIndex == index) { return currentNode.GetValue(); // מחזיר את הערך אם הגענו לאינדקס המבוקש } // מתקדם לאיבר הבא ומגדיל את האינדקס הנוכחי באחד currentNode = currentNode.GetNext(); currentIndex++; } return -1; // מחזיר -1 אם לא נמצא האיבר באינדקס המבוקש } public static int GetIndexByValue(Node<int> chain, int value) // פונקציה לקבלת אינדקס בעזרת ערך מסוים ברשימה מקושרת { int currentIndex = 0; // משתנה לאחסון האינדקס הנוכחי Node<int> currentNode = chain; // מצביע לאיבר הנוכחי ברשימה while (currentNode != null) // לולאה שעוברת על כל האיברים ברשימה { if (currentNode.GetValue() == value) // בדיקה אם הערך של הנוד הנוכחי תואם לערך המבוקש { return currentIndex; // מחזיר את האינדקס אם הערך נמצא } currentNode = currentNode.GetNext(); // מעבר לאיבר הבא הרשימה currentIndex++; // הגדלת האינקס } return -1; // החזר -1 אם הערך לא נמצא } public static bool IsBalanced(Node<int> chain) // פונקציה שבודקת אם רשימה מקושרת היא גם "רשימה מאוזנת". רשימה מאוזנת היא רשימה שמספר האיברים הגדולים מהממוצע שווה למספר האיברים הקטנים מהממוצע. { // אם הרשימה ריקה, היא נחשבת מאוזנת if (chain == null) return true; int sum = 0; // משתנה לשמירת סכום הערכים int count = 0; // משתנה לספירת האיברים Node<int> current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית while (current != null) // לולאה שרצה על כל האיברים { sum += current.GetValue(); // הוספת הערך לסכום count++; // העלאת מונה האיברים current = current.GetNext(); // מעבר לאיבר הבא } // חישוב הממוצע double average = (double)sum / count; int greaterCount = 0; // משתנה לספירת איברים הגדולים מהממוצע int lesserCount = 0; // משתנה לספירת איברים הקטנים מהממוצע current = chain; // משתנה עזר לשימירת הרשימה/השרשרת המקורית // ספירת האיברים הגדולים והקטנים מהממוצע while (current != null) // לולאה שעוברת על כל האיברים { if (current.GetValue() > average) // אם הערך גדול מהממוצע { greaterCount++; // ספירת איבר גדול מהממוצע } else if (current.GetValue() < average) // אם הערך קטן מהממוצע { lesserCount++; // ספירת איבר קטן מהממוצע } current = current.GetNext(); // מעבר לאיבר הבא ברשימה } return greaterCount == lesserCount; // החזרת התשובה האם הרשימה היא מאוזנת } public static int sequences(Node<int> chain, int num) // פונקציה שבודקת את מספר הרצפים שיש ברשימה מקושרת עבור מספר מסוים { int sequences = 0; // סוכם הרצפים Node<int> pos = chain; // משתנה עזר למיקום נוכחי ברשימה bool inSequence = false; // בדיקה אם הרצף ממשיך int count = 0; // מונה למופעים רצופים // לולאה שרצה כל עוד לא הגענו לסוף הרשימה while (pos != null) { // בודק אם הערך של הצומת הנוכחי שווה למספר שאנחנו מחפשים if (pos.GetValue() == num) { count++; // מוסיף למונה inSequence = true; // הרצף קיים } else { if (inSequence && count >= 2) // אם סיימנו רצף עם 2 מופעים או יותר { sequences++; // מוסיפים לספירה } inSequence = false; // הרצף הפסיק count = 0; // מאפס את המונה } // עובר לאיבר הבא ברשימה pos = pos.GetNext(); } // בודק במקרה שהרצף נגמר בסוף הרשימה if (inSequence && count >= 2) { sequences++; } // מחזיר את מספר הרצפים של המספר המבוקש return sequences; } public static int FindMinValueIndex(Node<int> chain) // פונצקיה שמקבלת שרשרת ומחזירה את האינדקס של האינדקס של הערך הנמוך ביותר בשרשרת מקושרת { if (chain == null) // אם השרשרת ריקה { Console.WriteLine("The List Is Empty."); // הודעה מתאימה return -1; // יציאה מהפונקציה } Node<int> pos = chain; // משתנה עזר לשמירת השרשרת המקורית int minValue = pos.GetValue(); // אתחול הערך המינימלי לערך החוליה הראשונה int minIndex = 0; // אינדקס המינימום מתחיל מאפס int currentIndex = 0; // מונה אינדקס נוכחי // לולאה שעוברת על כל החוליות ברשימה while (pos != null) { if (pos.GetValue() < minValue) // עם הערך הנוכחי קטן מהערך המינימלי הקודם { minValue = pos.GetValue(); // עדכון הערך המינימלי minIndex = currentIndex; // עדכון האינדקס למיקום הנמוך ביותר } pos = pos.GetNext(); // מעבר לחוליה הבאה currentIndex++; // עדכון האינדקס הנוכחי } return minIndex; // החזרת האינדקס של הערך הנמוך ביותר } public static int FindMaxValueIndex(Node<int> chain) // פונקציה שמקבלת שרשרת ומחזירה את האינדקס של הערך הגבוה ביותר בשרשרת המקושרת { if (chain == null) // אם השרשרת ריקה { Console.WriteLine("The List Is Empty."); // הודעה מתאימה return -1; // החזרת -1 במקרה של שרשרת ריקה } Node<int> pos = chain; // משתנה עזר לשמירת השרשרת המקורית int maxValue = pos.GetValue(); // אתחול הערך המקסימלי לערך של החוליה הראשונה int maxIndex = 0; // אינדקס המקסימום מתחיל מאפס int currentIndex = 0; // מונה אינדקס נוכחי // לולאה שעוברת על כל החוליות ברשימה while (pos != null) { if (pos.GetValue() > maxValue) // אם הערך הנוכחי גדול מהערך המקסימלי הקודם { maxValue = pos.GetValue(); // עדכון הערך המקסימלי maxIndex = currentIndex; // עדכון האינדקס למיקום הגבוה ביותר } pos = pos.GetNext(); // מעבר לחוליה הבאה currentIndex++; // עדכון האינדקס הנוכחי } return maxIndex; // החזרת האינדקס של הערך הגבוה ביותר } public static List<int> FindMinValueIndexes(Node<int> chain) // פונקציה שמקבלת שרשרת ומחזירה את האינדקס/ים עם הערך/ים הכי נמוך/ים { if (chain == null) // אם הרשימה ריקה { Console.WriteLine("The List Is Empty."); // הודעה מתאימה return null; // מקרה קיצון, יציאה מהפונקציה } Node<int> pos = chain; // משתנה עזר שמחזיק את השרשרת המקורית int minValue = pos.GetValue(); // אתחול ערך מינימלי עם הערך של האיבר הראשון List<int> minIndexes = new List<int>(); // רשימה להחזיק את האינדקסים של הערך/ים המינימלי/ם int currentIndex = 0; // מונה אינדקסים נוכחי // לולאה שעוברת על כל הצמתים ברשימה while (pos != null) { if (pos.GetValue() < minValue) // אם הערך הנוכחי קטן מהערך המינימלי הקודם { minValue = pos.GetValue(); // עדכון הערך המינימלי minIndexes.Clear(); // ניקוי אינדקסים קודמים minIndexes.Add(currentIndex); // הוספת האינדקס המינימלי החדש } else if (pos.GetValue() == minValue) // אם הערך הנוכחי שווה לערך המינימלי הנוכחי { minIndexes.Add(currentIndex); // הוספת אינדקס זה לרשימת האינדקסים המינימליים } pos = pos.GetNext(); // // מעבר לאיבר הבא currentIndex++; // עדכון האינדקס הנוכחי } return minIndexes; // החזרת האינדקסים של הערכים המינימלים } public static List<int> FindMaxValueIndexes(Node<int> chain) // פונקציה שמקבלת שרשרת ומחזירה את האינדקסים עם הערך/ים הכי גבוה/ים בשרשרת מקושרת { if (chain == null) // אם הרשימה ריקה { Console.WriteLine("The List Is Empty."); // הודעה מתאימה return null; // מקרה קיצון, יציאה מהפונקציה } Node<int> pos = chain; // משתנה עזר לשמירת השרשרת המקורית int maxValue = pos.GetValue(); // אתחול ערך מקסימלי עם הערך של האיבר הראשון List<int> maxIndexes = new List<int>(); // רשימה להחזיק את האינדקסים של הערך/ים המקסימלי/ם int currentIndex = 0; // מונה אינדקסים נוכחי // לולאה שעוברת על כל הצמתים ברשימה while (pos != null) { if (pos.GetValue() > maxValue) // אם הערך הנוכחי גדול מהערך המקסימלי הקודם { maxValue = pos.GetValue(); // עדכון הערך המקסימלי maxIndexes.Clear(); // ניקוי אינדקסים קודמים maxIndexes.Add(currentIndex); // הוספת האינדקס המקסימלי החדש } else if (pos.GetValue() == maxValue) // אם הערך הנוכחי שווה לערך המקסימלי הנוכחי { maxIndexes.Add(currentIndex); // הוספת אינדקס זה לרשימת האינדקסים המקסימליים } pos = pos.GetNext(); // מעבר לאיבר הבא currentIndex++; // עדכון האינדקס הנוכחי } return maxIndexes; // החזרת האינדקסים של הערכים המקסימליים } public static List<int> FindSecondMaxValueIndex(Node<int> chain) // פונקציה שמקבלת שרשרת { if (chain == null) return new List<int>(); // אם הרשימה ריקה, מחזירים רשימה ריקה int max = int.MinValue; int secondMax = int.MinValue; List<int> secondMaxIndexes = new List<int>(); int index = 0; // סיבוב על כל האלמנטים בשרשרת for (Node<int> current = chain; current != null; current = current.GetNext()) { // מעדכנים את הערכים המקסימליים if (current.GetValue() > max) { secondMax = max; // הערך הקודם הופך לערך השני הכי גבוה max = current.GetValue(); // מעדכנים את הערך המקסימלי } else if (current.GetValue() > secondMax && current.GetValue() < max) { secondMax = current.GetValue(); // מעדכנים את הערך השני הכי גבוה } index++; } // מחפשים את כל האינדקסים של הערך השני הכי גבוה index = 0; // מאפסים את האינדקס for (Node<int> current = chain; current != null; current = current.GetNext()) { if (current.GetValue() == secondMax) { secondMaxIndexes.Add(index); // מוסיפים את האינדקס לרשימה } index++; } return secondMaxIndexes; // מחזירים את הרשימה של אינדקסים } public static List<int> FindSecondMinValueIndex(Node<int> chain) // פונקציה שמקבלת שרשרת { if (chain == null) return new List<int>(); // אם הרשימה ריקה, מחזירים רשימה ריקה int min = int.MaxValue; int secondMin = int.MaxValue; List<int> secondMinIndexes = new List<int>(); int index = 0; // סיבוב על כל האלמנטים בשרשרת for (Node<int> current = chain; current != null; current = current.GetNext()) { // מעדכנים את הערכים המינימליים if (current.GetValue() < min) { secondMin = min; // הערך הקודם הופך לערך השני הכי נמוך min = current.GetValue(); // מעדכנים את הערך המינימלי } else if (current.GetValue() < secondMin && current.GetValue() > min) { secondMin = current.GetValue(); // מעדכנים את הערך השני הכי נמוך } index++; } // מחפשים את כל האינדקסים של הערך השני הכי נמוך index = 0; // מאפסים את האינדקס for (Node<int> current = chain; current != null; current = current.GetNext()) { if (current.GetValue() == secondMin) { secondMinIndexes.Add(index); // מוסיפים את האינדקס לרשימה } index++; } return secondMinIndexes; // מחזירים את הרשימה של אינדקסים } public static bool IsPalindrome(Node<int> chain) // פונקציה שבודקת אם רשימה מקושרת היא פלינדרום { // אם הרשימה ריקה או כוללת איבר אחד, היא נחשבת פלינדרום if (chain == null || chain.GetNext() == null) return true; // שלב 1: העתקת הערכים לרשימה כדי שניתן יהיה לקרוא אחורה List<int> values = new List<int>(); Node<int> current = chain; // משתנה עזר לשמירת השרשרת המקורית while (current != null) // לולאה שעוברת על כל האיברים ומוסיפה אותם לרשימה { values.Add(current.GetValue()); current = current.GetNext(); } // שלב 2: בדיקת סימטריה int left = 0; // התחלה של הרשימה int right = values.Count - 1; // סוף של הרשימה while (left < right) // לולאה שממשיכה כל עוד יש איברים משני הצדדים { if (values[left] != values[right]) // אם הערכים אינם שווים { return false; // השרשרת אינה פלינדרום } left++; right--; } return true; // אם כל הערכים היו שווים, הרשימה היא פלינדרום } } }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter