Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2017, 23:15   #1
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
Восклицание Перегрузки объединения и сравнения

Проблема с перегрузкой оператора + (объединение списков). Списки объединяет, но к первому списку прибавляется второй, пытался исправить, приравнять следующий элемент конца первого списка к нулю - не помогает.
Также не правильно работает перегрузка проверки на равенство, хотя по идее все правильно написал. Выдает false всегда, но если допустим списки приравнять (l1 = l2) только тогда выдаст true.
Помогите исправить.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication2
{
    class Node
    {
        public void SetNextNode(Node _nextNode)
        {
            this.next = _nextNode;
        }
        public char Element
        {
            get
            {
                return this.element;
            }
            set
            {
                this.element = value;
            }
        }
 
        public Node Next
        {
            get
            {
                return this.next;
            }
            set
            {
                this.next = value;
            }
        }
 
        private Node next;
        private char element;
    }
 
    class List
    {
        public int Length { get; private set; }
        private Node headNode;
        private Node tailNode;
 
        public List()
        {
            // создание пустого списка
            this.headNode = null;
            this.tailNode = this.headNode;
            this.Length = 0;
        }
  // ввод с клавиатуры
        public void Input()
        {
            Console.WriteLine("Ввод списка!");
            Console.Write("Количество элементов в списке: ");
            char _element;
            int N;
            N = int.Parse(Console.ReadLine());
            for (int i = 0; i < N; i++)
            {
                Console.Write(i + ". c = ");
                _element = char.Parse(Console.ReadLine());
                // проверяем, является ли список пустым
                if (headNode == null) // если список пуст
                {
                    // создать узел, сделать его головным
                    this.headNode = new Node(); //
                    this.headNode.Element = _element;
                    // этот же узел и является хвостовым
                    this.tailNode = this.headNode;
                    // следующего узла нет
                    this.headNode.SetNextNode(null);
                }
                else // если список не пуст
                {
                    // создать временный узел
                    Node newNode = new Node();
                    // следующий за предыдущим хвостовым узлом - это наш временный новый узел
                    this.tailNode.SetNextNode(newNode);
                    // сделать его же новым хвостовым
                    this.tailNode = newNode;
                    this.tailNode.Element = _element;
                    // следующего узла пока нет
                    this.tailNode.SetNextNode(null);
                }
 
                ++this.Length;
            }
        }
 
        // вывод на экран
        public void Print()
        {
            // определяем узел началом списка
            Node node = headNode;
            // пока список не станет пустым
            while (node != null)
            {
                // печатает первый элемент списка
                Console.Write(node.Element);
                // переходит к следующему узлу
                node = node.Next;
            }
            Console.WriteLine();
        }
 
        // перегрузка бинарного оператора +
        public static List operator +(List l1, List l2)
        {
            List l3 = new List();
            l3.headNode = l1.headNode;
            l1.tailNode.Next = l2.headNode;
            l3.tailNode = l2.tailNode;
            l3.Length = l1.Length + l2.Length;
            return l3;
        }
 
        // перегрузка бинарного оператора ==
        public override bool Equals(object obj)
        {
            return this.Equals(obj as List);
        }
        public bool Equals(List l)
        {
            // если параметр равен null, вернется false
            if (object.ReferenceEquals(l, null))
            {
                return false;
            }
            // оптимизация для общего случая успеха
            if (object.ReferenceEquals(this, l))
            {
                return true;
            }
            // если типы не совсем одинаковы, вернется false
            if (this.GetType() != l.GetType())
            {
                return false;
            }
            // Возвращаем true, если поля совпадают.
            return object.ReferenceEquals(this, l);
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        public static bool operator ==(List l1, List l2)
        {
            // проверяем значение null с левой стороны
            if (object.ReferenceEquals(l1, null))
            {
                // null == null = true.
                if (object.ReferenceEquals(l2, null))
                {
                    return true;
                }
                // Только левая сторона имеет значение null.
                return false;
            }
            // Equals обрабатывает случай null с правой стороны.
            return l1.Equals(l2);
        }
 
        // перегрузка бинарного оператора !=
        public static bool operator !=(List l1, List l2)
        {
            return !(l1 == l2);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List l1 = new List();
            l1.Input();
            Console.Write("Вывод списка l1: "); l1.Print();
 
            List l2 = new List();
            l2.Input();
            Console.Write("Вывод списка l2: "); l2.Print();
 
            List l3;
            Console.WriteLine("Перегружаем оператор объединения списков:");
            Console.Write("l1 + l2 = ");
            l3 = l1 + l2;
            l3.Print();
 
            Console.WriteLine("Перегружаем оператор сравнения:");
            Console.WriteLine("l1 == l2 = {0}", l1 == l2);
        }
    }
}
В перегрузке сравнения все неправильно я так понял, потому что сравнивал по ссылкам, а надо сравнить все элементы списка. Но не знаю как это на Шарпе написать.
Изображения
Тип файла: png Безымянный.png (18.5 Кб, 58 просмотров)

Последний раз редактировалось Alexis_777; 20.11.2017 в 01:53.
Alexis_777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузки в C# iyoulka C# (си шарп) 1 17.04.2017 18:31
Написать реализацию перегрузки функции Miha2059 Общие вопросы C/C++ 1 06.03.2015 09:32
Функция перегрузки bujlka Помощь студентам 3 02.12.2012 15:44
Сложение двух string методом перегрузки + MyQwErTy Помощь студентам 4 16.10.2012 22:25
Классы+перегрузки mo_Ouse C# (си шарп) 0 05.06.2012 22:21