예제 #1
0
        public MyLinkedListNode <T> FindLast(T value) //Находит последний узел, содержащий указанное значение
        {
            MyLinkedListNode <T> current = tail;

            while (current != null)
            {
                if ((current.Value).Equals(value))
                {
                    return(current);
                }
                else
                {
                    current = current.Previous;
                }
            }
            return(null);
        }
예제 #2
0
        public MyLinkedListNode <T> Find(T value) //Находит первый узел, содержащий указанное значение
        {
            MyLinkedListNode <T> current = head;

            while (current != null)
            {
                if ((current.Value).Equals(value))
                {
                    return(current);
                }
                else
                {
                    current = current.Next;
                }
            }
            return(null);
        }
예제 #3
0
        public bool Contains(int searchingContent)
        {
            bool finder = false;

            MyLinkedListNode <T> temp = First;

            while (temp != null)
            {
                if (temp.Content.Equals(searchingContent))
                {
                    finder = true;
                    break;
                }
                temp = temp.Next;
            }

            return(finder);
        }
예제 #4
0
        public void sort(IComparer <T> comparer)
        {
            //будем делегировать запрос на сортировку классу System.Array
            T[] array      = new T[count];
            int arrayIndex = 0;

            this.CopyTo(array, arrayIndex);
            Array.Sort(array, comparer);
            MyLinkedList <T>     tmp         = new MyLinkedList <T>(array);
            MyLinkedListNode <T> current     = this.Head;
            MyLinkedListNode <T> current_tmp = tmp.Head;

            while (current != null)
            {
                current.Value = current_tmp.Value;
                current       = current.Next;
                current_tmp   = current_tmp.Next;
            }
        }
예제 #5
0
 public void Remove(MyLinkedListNode <T> node)
 {
     if (node == First)
     {
         First          = node.Next;
         First.Previous = null;
     }
     else if (node == Last)
     {
         Last      = node.Previous;
         Last.Next = null;
     }
     else
     {
         node.Previous.Next = node.Next;
         node.Next.Previous = node.Previous;
     }
     Count--;
 }
예제 #6
0
        public void AddBefore(MyLinkedListNode <T> node, T content)
        {
            MyLinkedListNode <T> tempNode = new MyLinkedListNode <T>(content);

            if (node == First)
            {
                tempNode.Next = node;
                node.Previous = tempNode;
                First         = tempNode;
            }
            else
            {
                tempNode.Next      = node;
                tempNode.Previous  = node.Previous;
                node.Previous.Next = tempNode;
                node.Previous      = tempNode;
            }
            Count++;
        }
예제 #7
0
        public void AddAfter(MyLinkedListNode <T> node, T content)
        {
            MyLinkedListNode <T> tempNode = new MyLinkedListNode <T>(content);

            if (node == Last)
            {
                node.Next         = tempNode;
                tempNode.Previous = node;
                Last = tempNode;
            }
            else
            {
                tempNode.Next          = node.Next;
                tempNode.Next.Previous = tempNode;
                node.Next         = tempNode;
                tempNode.Previous = node;
            }
            Count++;
        }
예제 #8
0
        public void AddLast(T contentOfNextItem)
        {
            if (First == null)
            {
                First = new MyLinkedListNode <T>(contentOfNextItem);
                Last  = First;
                return;
            }
            MyLinkedListNode <T> nextItem = new MyLinkedListNode <T>(contentOfNextItem);

            if (Last == First)
            {
                Last          = nextItem;
                Last.Previous = First;
                First.Next    = Last;
            }
            else
            {
                Last.Next         = nextItem;
                nextItem.Previous = Last;
                Last = nextItem;
            }
            Count++;
        }
예제 #9
0
        public void AddAfter(MyLinkedListNode <T> given_node, T value)
        {
            MyLinkedListNode <T> new_node = new MyLinkedListNode <T>(value);

            this.AddAfter(given_node, new_node);
        }
예제 #10
0
        public static void Test(MyLinkedList <string> sentence)
        {
            // Create the link list.
            Display(sentence, "MyLinkedList: ");
            Console.WriteLine("sentence.Contains(\"jumps\") = {0}",
                              sentence.Contains("jumps"));

            // Add the word 'today' to the beginning of the linked list.
            sentence.AddFirst("today");
            Display(sentence, "Test 1: Add 'today' to beginning of the list:");

            // Move the first node to be the last node.
            MyLinkedListNode <string> mark1 = sentence.Head;

            sentence.RemoveFirst();
            sentence.AddLast(mark1);
            Display(sentence, "Test 2: Move first node to be last node:");

            // Change the last node to 'yesterday'.
            sentence.RemoveLast();
            sentence.AddLast("yesterday");
            Display(sentence, "Test 3: Change the last node to 'yesterday':");

            // Move the last node to be the first node.
            mark1 = sentence.Tail;
            sentence.RemoveLast();
            sentence.AddFirst(mark1);
            Display(sentence, "Test 4: Move last node to be first node:");

            // Indicate the last occurence of 'the'.
            sentence.RemoveFirst();
            MyLinkedListNode <string> current = sentence.FindLast("the");

            IndicateNode(sentence, current, "Test 5: Indicate last occurence of 'the':");

            // Add 'lazy' and 'old' after 'the' (the LinkedListNode named current).
            sentence.AddAfter(current, "old");
            sentence.AddAfter(current, "lazy");
            IndicateNode(sentence, current, "Test 6: Add 'lazy' and 'old' after 'the':");

            // Indicate 'fox' node.
            current = sentence.Find("fox");
            IndicateNode(sentence, current, "Test 7: Indicate the 'fox' node:");

            // Add 'quick' and 'brown' before 'fox':
            sentence.AddBefore(current, "quick");
            sentence.AddBefore(current, "brown");
            IndicateNode(sentence, current, "Test 8: Add 'quick' and 'brown' before 'fox':");

            // Keep a reference to the current node, 'fox',
            // and to the previous node in the list. Indicate the 'dog' node.
            mark1 = current;
            MyLinkedListNode <string> mark2 = current.Previous;

            current = sentence.Find("dog");
            IndicateNode(sentence, current, "Test 9: Indicate the 'dog' node:");

            // The AddBefore method throws an InvalidOperationException
            // if you try to add a node that already belongs to a list.

            Console.WriteLine("Test 10: Throw exception by adding node (fox) already in the list:");
            try
            {
                sentence.AddBefore(current, mark1);
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine("Exception message: {0}", ex.Message);
            }
            Console.WriteLine();

            // Remove the node referred to by mark1, and then add it
            // before the node referred to by current.
            // Indicate the node referred to by current.
            sentence.Remove(mark1);
            sentence.AddBefore(current, mark1);
            IndicateNode(sentence, current, "Test 11: Move a referenced node (fox) before the current node (dog):");

            // Remove the node referred to by current.
            sentence.Remove(current);
            IndicateNode(sentence, current, "Test 12: Remove current node (dog) and attempt to indicate it:");

            // Add the node after the node referred to by mark2.
            sentence.AddAfter(mark2, current);
            IndicateNode(sentence, current, "Test 13: Add node removed in test 11 after a referenced node (brown):");

            // The Remove method finds and removes the
            // first node that that has the specified value.
            sentence.Remove("old");
            Display(sentence, "Test 14: Remove node that has the value 'old':");

            // When the linked list is cast to ICollection(Of String),
            // the Add method adds a node to the end of the list.
            sentence.RemoveLast();
            ICollection <string> icoll = sentence;

            icoll.Add("rhinoceros");
            Display(sentence, "Test 15: Remove last node, cast to ICollection, and add 'rhinoceros':");

            Console.WriteLine("Test 16: Copy the list to an array:");
            // Create an array with the same number of
            // elements as the inked list.
            string[] sArray = new string[sentence.Count];
            sentence.CopyTo(sArray, 0);

            foreach (string s in sArray)
            {
                Console.WriteLine(s);
            }

            // Release all the nodes.
            sentence.Clear();

            Console.WriteLine();
            Console.WriteLine("Test 17: Clear linked list. Contains 'jumps' = {0}",
                              sentence.Contains("jumps"));

            Console.WriteLine();
        }
예제 #11
0
 public MyLinkedList()
 {
     count = 0;
     head  = null;
     tail  = null;
 }
예제 #12
0
        public void AddFirst(T value)
        {
            MyLinkedListNode <T> new_node = new MyLinkedListNode <T>(value);

            this.AddFirst(new_node);
        }
예제 #13
0
 public MyLinkedList(MyLinkedListNode <T> tempHead)
 {
     First = tempHead;
     Last  = First;
     Count = 1;
 }
예제 #14
0
 public void Clear()
 {
     First = null;
     Last  = null;
     Count = 0;
 }
예제 #15
0
 public void RemoveLast()
 {
     Last = Last.Previous;
     Count--;
 }
예제 #16
0
 public void RemoveFirst()
 {
     First = First.Next;
     Count--;
 }