Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях - C#

Узнай цену своей работы

Формулировка задачи:

Разработать два метода для класса List (однонаправленный список и двунаправленный список). Удвоение всех вхождений элементов, расположенных на четных (0-четное) позициях (DublicateOnEvenPos()). Исходник однонаправленного списка (уже начал писать этот метод, но не получается):
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; }
        }
    }
 
}
Main
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;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы