Проблема с перегрузкой оператора + (объединение списков). Списки объединяет, но к первому списку прибавляется второй, пытался исправить, приравнять следующий элемент конца первого списка к нулю - не помогает.
Также не правильно работает перегрузка проверки на равенство, хотя по идее все правильно написал. Выдает 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);
}
}
}
В перегрузке сравнения все неправильно я так понял, потому что сравнивал по ссылкам, а надо сравнить все элементы списка. Но не знаю как это на Шарпе написать.