Advertisement
CR7CR7

libraryD1-List

Jul 14th, 2023
734
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.82 KB | None | 0 0
  1. using System;
  2.  
  3. namespace d1
  4. {
  5.     // Клас за представяне на елемент от списъка
  6.     public class Node<T>
  7.     {
  8.         // Поле за съхранение на стойността на елемента
  9.         public T Value { get; set; }
  10.  
  11.         // Поле за съхранение на връзка към следващия елемент
  12.         public Node<T> Next { get; set; }
  13.  
  14.         // Конструктор с параметър за стойността на елемента
  15.         public Node(T value)
  16.         {
  17.             Value = value;
  18.             Next = null;
  19.         }
  20.     }
  21.  
  22.     // Клас за представяне на списък
  23.     public class List<T>
  24.     {
  25.         // Поле за съхранение на първия елемент на списъка
  26.         private Node<T> head;
  27.  
  28.         // Поле за съхранение на последния елемент на списъка
  29.         private Node<T> tail;
  30.  
  31.         // Поле за съхранение на броя на елементите в списъка
  32.         private int count;
  33.  
  34.         // Конструктор без параметри
  35.         public List()
  36.         {
  37.             head = null;
  38.             tail = null;
  39.             count = 0;
  40.         }
  41.  
  42.         // Метод за проверка дали списъкът е празен
  43.         public bool IsEmpty()
  44.         {
  45.             return count == 0;
  46.         }
  47.  
  48.         // Метод за добавяне на елемент в началото на списъка
  49.         public void AddFirst(T value)
  50.         {
  51.             Node<T> node = new Node<T>(value); // Създаваме нов елемент с посочената стойност
  52.  
  53.             if (IsEmpty()) // Ако списъкът е празен
  54.             {
  55.                 head = node; // Задаваме първия и последния елемент да сочат към новия елемент
  56.                 tail = node;
  57.             }
  58.             else // Ако списъкът не е празен
  59.             {
  60.                 node.Next = head; // Задаваме новия елемент да сочи към първия елемент
  61.                 head = node; // Задаваме първия елемент да сочи към новия елемент
  62.             }
  63.  
  64.             count++; // Увеличаваме броя на елементите с 1
  65.         }
  66.  
  67.         // Метод за добавяне на елемент в края на списъка
  68.         public void AddLast(T value)
  69.         {
  70.             Node<T> node = new Node<T>(value); // Създаваме нов елемент с посочената стойност
  71.  
  72.             if (IsEmpty()) // Ако списъкът е празен
  73.             {
  74.                 head = node; // Задаваме първия и последния елемент да сочат към новия елемент
  75.                 tail = node;
  76.             }
  77.             else // Ако списъкът не е празен
  78.             {
  79.                 tail.Next = node; // Задаваме последния елемент да сочи към новия елемент
  80.                 tail = node; // Задаваме последния елемент да сочи към новия елемент
  81.             }
  82.  
  83.             count++; // Увеличаваме броя на елементите с 1
  84.         }
  85.  
  86.         // Метод за премахване на първия елемент от списъка
  87.         public T RemoveFirst()
  88.         {
  89.             if (IsEmpty()) // Ако списката е празен
  90.             {
  91.                 throw new InvalidOperationException("Списката е празен."); // Хвърляме изключение
  92.             }
  93.  
  94.             T value = head.Value; // Запазваме стойността на първия елемент в променлива
  95.  
  96.             if (count == 1) // Ако има само един елемент в списката
  97.             {
  98.                 head = null; // Задаваме първия и последния да сочат към null, което означава, че списъкът става празен
  99.                 tail = null;
  100.             }
  101.             else // Ако има повече от един елемент в списъка
  102.             {
  103.                 head = head.Next; // Задаваме първия елемент да сочи към втория елемент
  104.             }
  105.  
  106.             count--; // Намаляваме броя на елементите с 1
  107.  
  108.             return value; // Връщаме запазената стойност като резултат от метода
  109.         }
  110.  
  111.         // Метод за премахване на последния елемент от списъка
  112.         public T RemoveLast()
  113.         {
  114.             if (IsEmpty()) // Ако списката е празен
  115.             {
  116.                 throw new InvalidOperationException("Списката е празен."); // Хвърляме изключение
  117.             }
  118.  
  119.             T value = tail.Value; // Запазваме стойността на последния елемент в променлива
  120.  
  121.             if (count == 1) // Ако има само един елемент в списъка
  122.             {
  123.                 head = null; // Задаваме първия и последния да сочат към null, което означава, че спискът става празен
  124.                 tail = null;
  125.             }
  126.             else // Ако има повече от един елемент в списъка
  127.             {
  128.                 Node<T> current = head; // Създаваме помощна променлива за обхождане на списъка
  129.  
  130.                 while (current.Next != tail) // Докато не стигнем предпоследния елемент
  131.                 {
  132.                     current = current.Next; // Преминаваме към следващия елемент
  133.                 }
  134.  
  135.                 current.Next = null; // Задаваме предпоследния елемент да сочи към null
  136.                 tail = current; // Задаваме последния елемент да сочи към предпоследния елемент
  137.             }
  138.  
  139.             count--; // Намаляваме броя на елементите с 1
  140.  
  141.             return value; // Връщаме запазената стойност като резултат от метода
  142.         }
  143.  
  144.         // Метод за връщане на първия елемент от списъка без да го премахваме
  145.         public T GetFirst()
  146.         {
  147.             if (IsEmpty()) // Ако списката е празен
  148.             {
  149.                 throw new InvalidOperationException("Списката е празен."); // Хвърляме изключение
  150.             }
  151.  
  152.             return head.Value; // Връщаме стойността на първия елемент като резултат от метода
  153.         }
  154.  
  155.         // Метод за връщане на последния елемент от списъка без да го премахваме
  156.         public T GetLast()
  157.         {
  158.             if (IsEmpty()) // Ако списката е празен
  159.             {
  160.                 throw new InvalidOperationException("Списката е празен."); // Хвърляме изключение
  161.             }
  162.  
  163.             return tail.Value; // Връщаме стойността на последния елемент като резултат от метода
  164.         }
  165.     }
  166. }
  167.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement