Удвоение всех вхождений элементов, расположенных на четных (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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д