Добавить элементы в двусвязный список без использования коллекций - C#
Формулировка задачи:
Добрый день.
Как можно добавить элементы в двусвязный список без использования коллекций?
Решение задачи: «Добавить элементы в двусвязный список без использования коллекций»
textual
Листинг программы
using System;
namespace Interface
{
//класс элемента связного списка
public sealed class ListElement<T1>
{
//суть - узел
private ListElement<T1> PrevElement;
private ListElement<T1> NextElement;
private T1 DateElement;
//новый элемент
public ListElement(ListElement<T1> PrevElement, ListElement<T1> NextElement, T1 DateElement)
{
this.PrevElement = PrevElement;
this.NextElement = NextElement;
this.DateElement = DateElement;
}
//замена частей узла
public ListElement<T1> GetSetNextElement
{
get { return this.NextElement; }
set { this.NextElement = value; }
}
public ListElement<T1> GetSetPrevElement
{
get { return this.PrevElement; }
set { this.PrevElement = value; }
}
public T1 GetSetDateElement
{
get { return this.DateElement; }
set { this.DateElement = value; }
}
}
class MyLinkedList <T1>
{
private ListElement<T1> LastElement;
private ListElement<T1> FirstElement;
private int count = 0;
//число элементов списка
public int NumberOfElements()
{
return count;
}
//добавить элемент в список
public void AddElement(T1 elem)
{
if (FirstElement == null)
{
ListElement<T1> NewElement = new ListElement<T1>(null , null, elem);
FirstElement = NewElement;
LastElement = NewElement;
}
else
{
ListElement<T1> NewElement = new ListElement<T1>(LastElement, null, elem);
LastElement.GetSetNextElement = NewElement;
LastElement = NewElement;
}
count++;
}
//Добавить элемент по индексу
public T1 AddToPosition(T1 elem, int index)
{
ListElement<T1> Last = LastElement;
ListElement<T1> Next = SearchElement(index);
if (index == 0)
{
FirstElement = new ListElement<T1>(null, null, elem);
FirstElement.GetSetNextElement = Next;
Next.GetSetPrevElement = FirstElement;
return default(T1);
}
ListElement<T1> Prev = SearchElement(index - 1);
ListElement<T1> NewElement = new ListElement<T1>(null, null, elem);
Prev.GetSetNextElement = NewElement;
NewElement.GetSetPrevElement = Prev;
Next.GetSetPrevElement = NewElement;
NewElement.GetSetNextElement = Next;
count++;
LastElement = Last;
return default(T1);
}
//удалить элемент по индексу
public T1 DeleteElement(int index)
{
ListElement<T1> Prev;
ListElement<T1> Next;
if (index == 0)
{
FirstElement = SearchElement(index + 1);
return default(T1);
}
Prev = SearchElement(index-1);
Next = SearchElement(index+1);
Prev.GetSetNextElement = Next;
Next.GetSetPrevElement = Prev;
count--;
return default(T1);
}
//прочитать элемент по индексу
public T1 ReadElement(int index)
{
ListElement<T1> Element = SearchElement(index);
return Element.GetSetDateElement;
}
//записать элемент по индексу
public T1 WriteElement(T1 elem, int index)
{
ListElement<T1> Element = SearchElement(index);
return Element.GetSetDateElement = elem;
}
//выбор направления поиска и поиск элемента
public ListElement<T1> SearchElement(int index)
{
//присваиваю первый или последний член списка
ListElement<T1> Prev = LastElement;
ListElement<T1> Next = FirstElement;
//Проверка на недопустимый индекс / проход с начала / конца списка.
if (index > count || index < 0)
{
throw new IndexOutOfRangeException();
}
else if (index < ((count+1) / 2))
{
if (index == 0)
{
return FirstElement;
}
for (; index != 0; index--)
{
Next = Next.GetSetNextElement;
}
return Next;
}
else
{
for (; index < count; index++)
{
Prev = Prev.GetSetPrevElement;
}
return Prev;
}
}
//очистить список
public void DeleteAllElements()
{
FirstElement = null;
count = 0;
}
}
}