-
-
Save anonymous/dd02a155fd62a61ab0379cba04377cf8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
//к сожалению в структурах запрещены циклические ссылки, но ими никто в c# не пользуется | |
//имена классов и членов с большой буквы (так принято) | |
class Element | |
{ | |
//не данные, а свойства (так принято) | |
//но если не нужно, можно убрать '{ get; set; }' | |
public char A; | |
public Element Next; | |
}; | |
class List | |
{ | |
//нельзя как в c++ писать 'public:', вы должны перед каждым методом писать 'public' | |
//private - по умолчанию, его можно не писать | |
//конструктор | |
public List() | |
{ | |
Head = null; | |
Count = 0; | |
} | |
//деструкторов в c# нет: тут автоматическая сборка мусора | |
//~list(); | |
/// <summary> | |
/// Коментарии в таком прикольном виде пишем | |
/// Добавление элемента в список | |
/// </summary> | |
/// <param name="c">данные</param> | |
public void Add(char c) | |
{ | |
if (Head == null) | |
{ | |
Head = new Element(); | |
Head.A = c; | |
Head.Next = null; | |
Count = 1; | |
} | |
else | |
{ | |
Element h = new Element(); | |
h.A = c; | |
h.Next = Head; | |
Head = h; | |
Count++; | |
} | |
} | |
//не могу написать оператор, вместо него будет функция | |
//public explicit List(char c) | |
public void CreateFromChar(char c) | |
{ | |
} | |
//оказывается все операторы должны быть статические, так что добавляем List в первый аргумент | |
//вроде не ругается, но я бы через функцию сделал | |
public static List operator +(List l, char c) | |
{ | |
l.Add(c); | |
return null; | |
} | |
public static List operator --(List l) | |
{ | |
if (l.Head.Next == null) | |
{ | |
Element h = new Element(); | |
h = l.Head; | |
l.Head = h.Next; | |
//Delete h; | |
l.Count--; | |
} | |
else Console.WriteLine("List is Empty!"); | |
return null; | |
} | |
public static bool operator ==(List l1, List l2) | |
{ | |
if ((l1.Head.Next == null) || (l2.Head.Next == null)) Console.WriteLine("Some List is Empty!"); | |
else | |
{ | |
if (l1.Count == l2.Count) return true; | |
else return false; | |
} | |
return false; | |
} | |
//оператор '==' должен быть вместе с '!=' | |
public static bool operator !=(List l1, List l2) | |
{ | |
return true; | |
} | |
//эти два метода тоже придется реализовать, иначе на '==' ругается | |
public override bool Equals(object obj) | |
{ | |
return base.Equals(obj); | |
} | |
public override int GetHashCode() | |
{ | |
return base.GetHashCode(); | |
} | |
public void Print() | |
{ | |
if (Head==null) Console.WriteLine("List is Empty!"); | |
else | |
{ | |
Element h = new Element(); | |
Element t = new Element(); | |
h = Head; | |
do | |
{ | |
Console.WriteLine(h.A+" "); | |
t = h.Next; | |
h = t; | |
} while (h!=null); | |
//Console.WriteLine(h.A+"\n"); | |
} | |
} | |
//приватные члены, можем ключевое слово 'private' опустить | |
//опять же оформил как свойства, но можем и как обычные данные сделать | |
Element Head { get; set; } | |
int Count { get; set; } | |
} | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
List ch1 = new List(); | |
List ch2 = new List(); | |
List ch3 = new List(); | |
List ch4 = new List(); | |
ch1.Add('a'); | |
ch2.Add('c'); | |
ch1.Print(); | |
ch2.Print(); | |
ch3 = ch1 + 'b'; | |
ch4 = ch2 + 'd'; | |
ch1.Print(); | |
ch2.Print(); | |
if (ch3 == ch4) Console.WriteLine("Are equal\n"); | |
else Console.WriteLine("Not equal\n"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment