//16. Рекурсивний метод видалення n-ного за рахунком елемента; public void DeleteAtRec(int pos, RList rl) { //проверка if (pos < 1 || pos > Counter(rl)) { throw new Exception("Введенная позиция меньше 1 или больше кол-ва элементов листа"); } //последний элемент if (pos == Counter(rl)) { while (rl.next.next != null) { rl = rl.next; } rl.next = null; return; } //первый элемент if (pos == 1) { while (rl.next.next != null) { rl.data = rl.next.data; rl = rl.next; } rl.data = rl.next.data; rl.next = null; } else { pos--; DeleteAtRec(pos, rl.next); } }
//8. Рекурсивний метод додавання нового елемента n-ним у список; public void AddAtRec(int pos, int num, RList rl) { if (pos < 1 || pos > Counter(rl)) { throw new Exception("Введенная позиция меньше 1 или больше кол-ва элементов листа"); } if (pos == Counter(rl)) { while (rl.next != null) { rl = rl.next; } rl.next = new RList(num); return; } if (pos == 1) { int temp = rl.data; rl.data = num; RList lel = new RList(temp); lel.next = rl.next; rl.next = lel; } else { pos--; AddAtRec(pos, num, rl.next); } }
public static void deleteEl(RList rl) { while (rl.next.next != null) { rl.data = rl.next.data; rl = rl.next; } rl.data = rl.next.data; rl.next = null; }
//подсчет кол-ва элементов в листе public static int Counter(RList rl) { int count = 1; while (rl.next != null) { count++; rl = rl.next; } return(count); }
//40. Метод пошуку елемента із заданим значенням(результат - посилання на знайдений елемент); public RList SearchByKey(int key, RList rl) { while (rl.next != null) { if (rl.data == key) { return(rl); } rl = rl.next; } return(rl); }
//принт начиная с последнеого public void RecInvPrint2(RList rl) { if (rl.next == null) { Console.WriteLine(rl.data); } else { RecInvPrint2(rl.next); Console.WriteLine(rl.data); } }
//1,3 , 5, 8, 16, 24, 35, 40, 55 public void Print(RList kek) { Console.WriteLine(); if (kek.next == null) { Console.Write(" " + kek.data + " "); } else { Print(kek.next); Console.Write(" " + kek.data + " "); } }
//55.Індексатор з двома параметрами, що дозволяє знайти мінімальне значення //серед значень елементів, розташованих між елементами із заданими номерами. public int this[int i, int j, RList rl] { get { int count = 0; int cou = 0; //обрезаем конец листа RList temp = CutJ(j - 1, rl); //обрезаем начало листа temp = Cut(i, temp); //находим минимальое число в промежутке return(finmin(temp)); } }
public static RList Reverse(RList rl) { dynamic n = null; while (rl != null) { RList temp = rl.next; rl.next = n; n = rl; rl = temp; } rl = n; return(rl); }
public static RList Cut(int i, RList rl) { int count = 0; while (rl.next != null) { count++; if (count == i) { return(new RList(rl.next)); } rl = rl.next; } return(new RList()); }
public static RList CutJ(int j, RList rl) { int count = 0; RList temp = new RList(rl.data); while (count != j) { count++; RList lul = new RList(rl.next.data); lul.next = temp; temp = lul; rl = rl.next; } return(Reverse(temp)); }
//add last public void Add(int num) { if (next == null) { next = new RList(num); } else { RList kek = next; while (kek.next != null) { kek = kek.next; } kek.next = new RList(num); } }
public static int finmin(RList LR) { int min = 10000; while (LR.next != null) { if (LR.data < min) { min = LR.data; } LR = LR.next; } //на случай если последний элемент наименьший if (LR.data < min) { min = LR.data; } return(min); }
//24. Метод видалення всіх парних за значенням елементів; public RList DeleteAbleByTwo(RList rl) { RList kek = rl; RList prev = null; if (kek == null) { return(prev); } if (kek.next == null) { if (kek.data % 2 == 0) { return(null); } } while (kek != null) { if (kek.data % 2 == 0) { if (prev == null) { rl = rl.next; kek = rl; } else { prev.next = kek.next; kek = kek.next; } } else { prev = kek; kek = kek.next; } } return(rl); }
public RList(int i, RList n) { data = i; next = n; }
public RList() { data = default(int); next = null; }
public RList(int i) { data = i; next = null; }
public RList(RList n) { data = n.data; next = n.next; }
static void Main(string[] args) { Console.WriteLine("Enter the first element to create a recursive singly linked list\n"); RList kek = new RList(Convert.ToInt32(Console.ReadLine())); while (true) { ShowMenu(); int x = Convert.ToInt32(Console.ReadLine()); switch (x) { case 0: Environment.Exit(0); break; case 1: Console.WriteLine(); kek.Print(kek); Console.WriteLine(); break; case 2: Console.WriteLine("\n Enter the element you wanna insert"); kek.Add(Convert.ToInt32(Console.ReadLine())); break; case 3: Console.WriteLine("List looks like this:"); kek.Print(kek); Console.WriteLine("\n Enter the postion you wanna insert"); int pos = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Enter the number you wanna insert"); int num = Convert.ToInt32(Console.ReadLine()); kek.AddAtRec(pos, num, kek); break; case 4: Console.WriteLine("\n Enter the position you wanna delete"); int pos2 = Convert.ToInt32(Console.ReadLine()); kek.DeleteAtRec(pos2, kek); break; case 5: kek.DeleteAbleByTwo(kek); break; case 6: Console.WriteLine(); kek.RecInvPrint1(kek); Console.WriteLine(); kek.RecInvPrint2(kek); break; case 7: Console.WriteLine("\nEnter the key you wanna get link to"); int key = Convert.ToInt32(Console.ReadLine()); kek.Print(kek.SearchByKey(key, kek)); break; case 8: kek.Print(kek); Console.WriteLine("\nEnter element FROM"); int _from = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("\nEnter element TO"); int _to = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("The minimal number is"); Console.WriteLine(kek[_from, _to, kek]); break; } //1,3 , 5, 8, 16, 24, 35, 40, 55 } }