Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях - C#
Формулировка задачи:
Разработать два метода для класса List (однонаправленный список и двунаправленный список).
Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях (DublicateOnEvenPos()).
Исходник однонаправленного списка (уже начал писать этот метод, но не получается):
Исходник двунаправленного списка
Main
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lists { class List<T>: IEnumerable<T>, IEnumerator<T> { class ListItem<T1> { public T Data { get; set; } public ListItem<T> Next { get; set; } } private ListItem<T> firstItem; private ListItem<T> currentItem; public T Current { get { if (currentItem == null) throw new NullReferenceException("Current item can't be null"); return currentItem.Data; } set { if (currentItem == null) throw new NullReferenceException("Current item can't be null"); currentItem.Data = value; } } public void AddFirst(T item) { ListItem<T> newItem = new ListItem<T>(); newItem.Data = item; newItem.Next = firstItem; firstItem = newItem; } public IEnumerator<T> GetEnumerator() { return this; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this; } public void Dispose() { } object System.Collections.IEnumerator.Current { get { if (currentItem == null) throw new NullReferenceException("Current item can't be null"); return currentItem.Data; } } public bool MoveNext() { if (currentItem == null) { if (HasValues) { currentItem = firstItem; return true; } return false; } if (currentItem.Next != null) { currentItem = currentItem.Next; return true; } Reset(); return false; } public void Reset() { currentItem = null; } public bool HasValues { get { return firstItem != null; } } public void DublicateOnEvenPos() { ListItem<T> newItem = new ListItem<T>(); var Count = 0; // счетчик для элементов newItem = firstItem; while (MoveNext()) { if (Count % 2 == 0 || Count == 0) { newItem = currentItem; newItem.Next = currentItem.Next; currentItem.Next = newItem; } Count++; } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ListsDemo { public class DoubleList<T> : IEnumerable<T>, IEnumerator<T> { class ListItem<T1> { public ListItem<T1> Prev { get; set; } public T1 Data { get; set; } public ListItem<T1> Next { get; set; } } private ListItem<T> firstItem; private ListItem<T> currentItem; private ListItem<T> lastItem; public T Current { get { if (currentItem == null) throw new NullReferenceException("Current item can't be null"); return currentItem.Data; } set { if (currentItem == null) throw new NullReferenceException("Current item can't be null"); currentItem.Data = value; } } public void AddFirst(T item) { ListItem<T> newItem = new ListItem<T>(); newItem.Data = item; newItem.Next = firstItem; firstItem = newItem; if(firstItem.Next == null) { lastItem = firstItem; } else { firstItem.Next.Prev = firstItem; } } public IEnumerator<T> GetEnumerator() { return this; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this; } public void Dispose() { } object System.Collections.IEnumerator.Current { get { if (currentItem == null) throw new NullReferenceException("Current item can't be null"); return currentItem.Data; } } public bool MoveNext() { if (currentItem == null) { if (HasValues) { currentItem = firstItem; return true; } return false; } if (currentItem.Next != null) { currentItem = currentItem.Next; return true; } Reset(); return false; } public void Reset() { currentItem = null; } public bool HasValues { get { return firstItem != null; } } } }
using System; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lists { class Program { static void Main(string[] args) { List<int> lst = new List<int>(); lst.AddFirst(5); lst.AddFirst(4); lst.AddFirst(3); lst.AddFirst(2); lst.AddFirst(1); lst.DublicateOnEvenPos(); PrintList(lst); Console.ReadLine(); } private static void PrintList(List<int> lst) { Console.WriteLine("------------"); foreach (var item in lst) { Console.WriteLine(item); } } } }
Решение задачи: «Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях»
textual
Листинг программы
public List<T> DublicateOnEvenPos() { var tmpCount = 0; //Создаём список, с которым будем работать List<T> tmpList = new List<T>(); //Переносимся в начало списка currentItem = firstItem; while (currentItem != null) { if (tmpCount % 2 == 0) { tmpList.AddFirst(currentItem.Data); tmpList.AddFirst(currentItem.Data); // После этого копирования оставшиеся элементы будут стоять в обратном порядке } else { tmpList.AddFirst(currentItem.Data); } tmpCount++; MoveNext(); } // Создаем конечный список, в который скопируем элементы из предыдущего, //чтобы восстановить порядок List<T> list = new List<T>(); foreach (T tmp in tmpList) { list.AddFirst(tmp); } return list; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д