Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Профессор
Рейтинг: 6688
∙ повысить рейтинг »
Micren
Статус: Профессионал
Рейтинг: 1697
∙ повысить рейтинг »
Andrew Kovalchuk
Статус: Профессионал
Рейтинг: 772
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Microsoft .NET : C#

Номер выпуска:203
Дата выхода:13.01.2011, 19:30
Администратор рассылки:Alexey G. Gladenyuk (Управляющий)
Подписчиков / экспертов:165 / 55
Вопросов / ответов:1 / 2

Вопрос № 181780: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: массив целых чисел x[1] ... x[n] использовать для формирования кольцевого списка. Элементы массива вводит пользователь. Подскажите пожалуйста как это сделать с помощью Link...



Вопрос № 181780:

Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: массив целых чисел x[1] ... x[n] использовать для формирования кольцевого списка. Элементы массива вводит пользователь.
Подскажите пожалуйста как это сделать с помощью LinkedList. Очень срочно нужно, помогите прошу. Я пытался что-то сделать, но у меня не совсем получается. Ниже приведен мой неудавшийся код на C#.

Отправлен: 07.01.2011, 18:48
Вопрос задал: Посетитель - 356777 (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Гаряка Асмик (Профессор) :
Здравствуйте, Посетитель - 356777!

Если Вас нужен только кольцеобразный вывод:

Приложение:

Ответ отправил: Гаряка Асмик (Профессор)
Ответ отправлен: 08.01.2011, 13:01
Номер ответа: 265286
Армения, Ереван
Тел.: 37493385079
Адрес сайта: http://rus-kniga.biz/tv11073127-3155712.html
ICQ # 166073765
Mail.ru-агент: hasmikgaryaka@bk.ru
Абонент Skype: hasmik7

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265286 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Evgenijm (10-й класс) :
    Здравствуйте, Посетитель - 356777!

    Односвязное кольцо. Со реализацией стандартной коллекции и дополнительного задания. Для удаления последнего элемента эта конструкция неэффективна, но сойдет для лабораторной.

    Код:
    using
    System;
    using System.Collections.Generic;
    using System.Text;

    namespace Task_2
    {
    class Spisok
    {
    static void Main() // вызов метода Main
    {
    string buf; // объявляем переменную строкового типа
    Console.WriteLine("Введите количество элементов массива");
    buf = C onsole.ReadLine(); // считываем введенную строку
    int size = Convert.ToInt32(buf); // преобразуем строку в число (размерность массива)
    Console.WriteLine();

    int[] mas = new int[size]; // объявляем массив введенной размерности
    for (int i = 0; i < size; ++i) // цикл for для ввода элементов массива
    {
    Console.WriteLine("Введите элемент массива, затем нажмите Enter");
    mas[i] = Convert.ToInt32(Console.ReadLine());
    }

    CircularList<int> Circle = new CircularList<int>();
    foreach (int i in mas)
    Circle.Add(i);

    Circle = Circle.GetCopy(); //Проверяем правильность операции копирования

    Console.WriteLine(" Значения кольцевого списка:");
    Console.WriteLine();
    while (true)
    {
    Console.Write("[{0}]: ", Circle.Count);
    if (Circle.Count > 0)
    {
    int[] vals = new int[Circle.Count];
    Circle.CopyTo(vals, 0);
    Console.Write(vals[0]);
    for (int i = 1; i < vals.Length; i++)
    Console.Write(" {0}", vals[i]);
    }
    Console.WriteLine();
    Console.WriteLine(" Введите <d> для удаления первого элемента, <l> для удаления последнего, число для перехода по списку или <q> для выхода:");
    String S = Console.ReadLine();
    switch (S)
    {
    case "d":
    Circle.Remove();
    break;
    case "l":
    Circle.RemoveLast();
    break;
    case "q":
    return;
    default:
    int shift;
    if(int.TryParse(S, out shift))
    for(int i=0; i<shift; i++)
    Circle.MoveToNext();
    break;
    }
    }
    }
    }

    /// <summary>Однонаправленное кольцо</summary>
    class CircularList<T> : ICollection<T>
    {
    CircularNode<T> precurrent; //Элемент ПЕРЕД текущим
    int count; //Количество элементов

    /// <summary>Перечисляет все узлы, для внутреннего пользования</summary>
    IEnumerable <CircularNode<T>> EnumerateNodes()
    {
    CircularNode<T> Cur = precurrent.Next;
    for (int i = 0; i < count; i++)
    {
    yield return Cur;
    Cur = Cur.Next;
    }
    }

    /// <summary>Удаляет текущий элемент. Исключение, если кольцо пустое</summary>
    public void Remove()
    {
    if (count==0)
    throw new IndexOutOfRangeException();
    else if (count == 1)
    {
    precurrent = null;
    count = 0;
    }
    else
    {
    precurrent.Next = precurrent.Next.Next;
    count--;
    }


    }

    /// <summary>Удаляет последний элемент. Текущий остается.</summary>
    public void RemoveLast()
    {
    if (precurrent == null)
    throw new IndexOutOfRangeException();
    else if (count == 1 )
    {
    precurrent = null;
    count = 0;
    }
    else
    {
    CircularNode<T> Cur = precurrent;
    while (Cur.Next != precurrent)
    Cur = Cur.Next;
    Cur.Next = precurrent.Next;
    precurrent = Cur;
    count--;
    }
    }

    /// <summary>Делает текущим следующий элемент</summary>
    public void MoveToNext()
    {
    precurrent = precurrent.Next;
    }

    /// <summary>Доступ к данным в текущем элементе</summary>
    T Current
    {
    get { return precurrent.Next.Data; }
    set { precurrent.Next.Data = value; }
    }

    /// <summary>Создает новое кольцо с теми е данными</summary>
    public CircularList<T> Get Copy()
    {
    CircularList<T> New = new CircularList<T>();
    if(count>0)
    {
    CircularNode<T> Cur = precurrent.Next.Next;
    for (int i = 0; i < count; i++)
    {
    New.Add(Cur.Data);
    Cur = Cur.Next;
    }
    }
    return New;
    }

    //ICollection implementation

    public void Add(T data)
    {
    switch (count)
    {
    case 0:
    precurrent = new CircularNode<T>(data, null);
    precurrent.Next = precurrent;
    break;
    case 1:
    precurrent.Next = new CircularNode<T>(data, precurrent);
    break;
    default:
    CircularNode<T&g t; New = new CircularNode<T>(data, precurrent.Next.Next);
    precurrent.Next.Next = New;
    precurrent = precurrent.Next;
    break;
    }
    count++;
    }

    public void Clear()
    {
    precurrent = null;
    count = 0;
    }

    public bool Contains(T data)
    {
    foreach (CircularNode<T> n in EnumerateNodes())
    if (n.Data.Equals(data))
    return true;
    return false;
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
    foreach (T t in this)
    array[arrayIndex++] = t;
    }

    public int Count
    {
    get { return count; }
    }

    public bool IsReadOnly
    {
    get { return false; }
    }
    < br> public bool Remove(T item)
    {
    foreach(CircularNode<T> n in EnumerateNodes())
    if (n.Next.Data.Equals(item))
    {
    if (count == 1)
    {
    count = 0;
    precurrent = null;
    return true;
    }
    else
    {
    n.Next = n.Next.Next;
    count--;
    return true;
    }
    }
    return false;
    }

    public IEnumerator<T> GetEnumerator()
    {
    foreach (CircularNode<T> n in EnumerateNodes())
    yield return n.Data;
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
    return this.GetEnumerator();
    }


    class CircularNode<T>
    {
    public CircularNode( T data, CircularNode<T> next)
    {
    Next = next;
    Data = data;
    }

    public CircularNode<T> Next;
    public T Data;
    }
    }
    }

    Ответ отправил: Evgenijm (10-й класс)
    Ответ отправлен: 09.01.2011, 06:00
    Номер ответа: 265292
    Германия, Падерборн

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265292 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное