Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Динамические списки. Реализация.


Автор: NeoN2k 20.9.2009, 11:02
Доброго времени, ребят)
Изучал Pascal и Си в универе... Сейчас встал вопрос о том, на каком языке буду оставшееся свое время писать... Решил перейти на С-подобный язык. Выбрал C#.
Такой вопрос к вам.
Не могу разобраться, как использовать динамические списки в шарпе.
Вот, допустим, на Си этот кусок кода работает:
Код

struct my_type
{
    int data;
    my_type *next;
    my_type(int temp)
    {
        data = temp;
    }
};
//---------------------
int main(void)
{
    my_type *head;
    // создание динамического списка
    my_type *now = new my_type(0);
    head = now;
    for(int i = 1; i < 10; i++)
    {
        my_type *element = new my_type(i);
        now->next = element;
        now = element;
    }
    now->next = 0;
    // обход списка
    now = head;
    while(now != 0)
    {
        printf("%i\n",now->data);
        now = now->next;
    }
    getch();
    return 0;
}


Пытаюсь подобное сделать в Шарпе, учитывая ООП, но не получается никак. Во-первых тот же самый my_type *element = new my_type(i);... Звездочку перед element он видеть не хочет)) Ну и в остальном коде свои непонятки...
Искал здесь, не нашел)
Скажите, пожалуйста, или источник нужного мне материала, или ответьте на вопрос) Благодарю)

Автор: Heinzz 20.9.2009, 11:30
Код


static void Main(string[] args)
        {
            LList<string> llist = new LList<string>("first");
            llist.AddLast("second");
            llist.AddLast("third");
            Node<string> n = llist.first;

            while (true)
            {
                Console.WriteLine(n.value);
                
                n = n.next;
                if (n == null) { break; }
                
            }
            Console.ReadKey();
            
        }
 class LList<T>
    {
        public Node<T> first;
        public Node<T> last;

        public LList(T _value)
        {
            first = new Node<T>(_value);
            last = first;
        }
        public void AddLast(T _val)
        {
            Node<T> my = new Node<T>(_val);
            last.next = my;
            last = my;
        }
        public void ToConsole()
        {
            Node<T> node = new Node<T>();
            node = first;
            while (node.next != null)
            {
                Console.WriteLine(node.value);
                node = node.next;
            }
            Console.WriteLine(last.value);
        }
        public void Delete(T _val)
        {
            Node<T> node = new Node<T>();
            Node<T> prev = new Node<T>();
            node = first;
            while (node.next != null)
            {
                if ((object)node.value == (object)_val)
                {
                    prev.next = node.next;
                }
                prev = node;
                node = node.next;
            }
        }
    }

    class Node<T>
    {
        public Node<T> next;
        public T value;
        public Node(T _val)
        { value = _val; }
        public Node() { }
    }



это самописный, а вообще смотрите List<>

Автор: NeoN2k 20.9.2009, 12:55
Благодарю, но неужели код в 2 раза больше должен быть? ))
И сложноват на восприятие мне)) Если это то, что мне нужно, то не могли бы Вы комментарии оставить?

Автор: Heinzz 20.9.2009, 15:43


Цитата(NeoN2k @  20.9.2009,  12:55 Найти цитируемый пост)
Благодарю, но неужели код в 2 раза больше должен быть? ))


не больше, просто в приведенном примере реализовано удаление узла и вывод всего списка на консоль

зы а кроме как в познавательных целях вручную делать особо смысла нет. Используйте готовые компоненты:

Код

List<string> list = new List<string>();
            list.Add("first");
            list.Add("second");
            list.Add("third");

            foreach (string s in list)
            {
                Console.WriteLine(s);
            }



Автор: NeoN2k 20.9.2009, 18:34
Именно в познавательных) В универе лабы надо писать)) А я то выбрал шарп) Теперь мучаюсь с переходом на него)
Спс за инфу)

Автор: NeoN2k 24.9.2009, 00:23
Я извиняюсь, но не могли бы Вы прокомментировать данный код?...
Я не до конца синтаксис понял...
Также не понимаю назначение <T> или <string>...

Автор: Ram1reS 24.9.2009, 09:47
Читайте про http://msdn.microsoft.com/en-us/library/ms379564%28VS.80%29.aspx.

Автор: Heinzz 24.9.2009, 16:03
грубо говоря это указание типа объектов содержащихся в коллекции. при описании классов написано  <Т> - то-есть тип пока не известен и эта буква его заменяет. (грубо переменная содержащая тип), где написано <string> - это уже мы создали коллекцию типа именно string. Строгая типизация снижает вероятность ошибок при всяких парсингах ,+ дженерики(такие коллекции,...) работают быстрее поскольку не производят боксинг/анбоксинг (приведение типов object-T-object).

Автор: Partizan 24.9.2009, 22:42
нечто аналогичное шаблонам С++

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)