Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание связного списка, не понимаю код 
V
    Опции темы
ДобренькийПапаша
Дата 25.1.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



В книге "C# 2008 и платформа .NET 3.5 для профессионалов приведён такой код:"

Код

public class LinkedListNode
    {
        public LinkedListNode(object value)
        {
            this.value = value;
        }

        private object value;
        public object Value
        {
            get { return value; }
        }

        private LinkedListNode next;
        public LinkedListNode Next
        {
            get { return next; }
            set { next = value; }
        }

        private LinkedListNode prev;
        public LinkedListNode Prev
        {
            get { return prev; }
            set { prev = value; }
        }
    }

public class LinkedList : IEnumerable
    {
        private LinkedListNode first;

        public LinkedListNode First
        {
            get { return first; }
        }

        private LinkedListNode last;

        public LinkedListNode Last
        {
            get { return last; }
        }

        public LinkedListNode AddLast(object node)
        {
            LinkedListNode newNode = new LinkedListNode(node);
            if (first == null)
            {
                first = newNode;
                last = first;
            }
            else
            {
                last.Next = newNode;
                last = newNode;
            }
            return newNode;
        }
        
        public IEnumerator GetEnumerator()
        {
            LinkedListNode current = first;

            while (current != null)
            {
                yield return current.Value;
                current = current.Next;
            }            
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            LinkedList list1 = new LinkedList();
            list1.AddLast(1);
            list1.AddLast(2);
            list1.AddLast(3);

            foreach (int i in list1)
            {
                Console.WriteLine(i);
            }
        }
    }
 

Я никак не пойму каким образом здесь работает foreach. Мы объявляем класс, массива нет ни одного. Где хранятся все значения переданные в list1? Битый час смотрю в код, отлаживаю и ничё не понимаю(((


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KelTron
Дата 25.1.2010, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



А что удивительного в том, что нет массивов, для реализации списка они не нужны.

На счёт foreach, если ты посмотришь на эту строку, я думаю многое прояснится:
Код

yield return current.Value;



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
ДобренькийПапаша
Дата 25.1.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Ничего для меня не прояснилось, к сожалению. Я не понимаю как организовано хранение данных в памяти в данном случае.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
ДобренькийПапаша
Дата 25.1.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Ещё я не понимаю как в это коде происходит вызов last.Next (55-я строка), если конструктор не вызван: поле объявлено просто как 
Код

private LinkedListNode last;



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
v1rtu0z
Дата 25.1.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.4.2008
Где: Воронеж

Репутация: нет
Всего: нет



Цитата(ДобренькийПапаша @ 25.1.2010,  16:45)
Ещё я не понимаю как в это коде происходит вызов last.Next (55-я строка), если конструктор не вызван: поле объявлено просто как 
Код

private LinkedListNode last;

Да в 55й строке происходит не вызов last, а присваивание. А конструируется то что присваивается в 47й строке.
Насчет foreach. Я сам не до конца не понимаю механизм, но обеспечивает возможность перебора интерфейс IEnumerable, который реализует список. 
Там еще используется ключевое слово yield, которое
Цитата

Используется в блоке итератора для предоставления значения объекта перечислителя или для сообщения о конце итерации.

PM MAIL ICQ   Вверх
KelTron
Дата 25.1.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Цитата(ДобренькийПапаша @  25.1.2010,  15:29 Найти цитируемый пост)
Я не понимаю как организовано хранение данных в памяти в данном случае.

Тогда бери любой учебник и читай - что такое связный список.
http://ru.wikipedia.org/wiki/Связный_список

Цитата(ДобренькийПапаша @  25.1.2010,  15:45 Найти цитируемый пост)
Ещё я не понимаю как в это коде происходит вызов last.Next (55-я строка), если конструктор не вызван: поле объявлено просто как 

Что то уж совсем какие то элементарные вещи спрашиваешь...
При чём тут конструктор, ссылке значение можно присвоить где угодно, здесь это происходит в этом куске:
Код

if (first == null)
            {
                first = newNode;
                last = first;
            }
            else
            {
                last.Next = newNode;
                last = newNode;
            }

Тут last и инициализируется.



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
KuMa1104
Дата 25.1.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Цитата(ДобренькийПапаша @  25.1.2010,  14:39 Найти цитируемый пост)
В книге "C# 2008 и платформа .NET 3.5 для профессионалов приведён такой код:"

А можно ссылочку откуда вы скачали эту книгу если не сложно. Я как то искал её в нете но только на английском находил(((


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
ДобренькийПапаша
Дата 25.1.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата(KuMa1104 @ 25.1.2010,  20:11)
А можно ссылочку откуда вы скачали эту книгу если не сложно. Я как то искал её в нете но только на английском находил(((

Она у меня в текстовом варианте. Очень хорошая книга. Вообще-то мне всё в книге понятно. Наваждение какое-то с этими списками сегодня.

Никак я не пойму где хранятся числа? Кто-нибудь может ответить где здесь хранится массив(ну или как хотите называйте) чисел? Если мы совершенно отдельно вызываем оператор foreach, проходя по всем элементам, значит они где-то хранятся. Я не могу понять где???

Это сообщение отредактировал(а) ДобренькийПапаша - 25.1.2010, 21:23


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KuMa1104
Дата 25.1.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3




ИМХО пусть меня поправят если я не прав.
Цитата(ДобренькийПапаша @  25.1.2010,  21:19 Найти цитируемый пост)
Если мы совершенно отдельно вызываем оператор foreach, проходя по всем элементам, значит они где-то хранятся. Я не могу понять где???

У вас в классе LinkedList хранится ссылка на 1 эл списка в нём(в элементе) ссылка
 на 2ой и т.д. 

Как я понимаю обекты будут удалены из памяти когда на них не будет ни одной действующей ссылки. А пока они есть всё норм. пока каждый объект ссылается на следующий всё это лежит спокойно в куче.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
ДобренькийПапаша
Дата 25.1.2010, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата(KuMa1104 @ 25.1.2010,  21:45)
У вас в классе LinkedList хранится ссылка на 1 эл списка в нём(в элементе) ссылка
 на 2ой и т.д. 

Как я понимаю обекты будут удалены из памяти когда на них не будет ни одной действующей ссылки. А пока они есть всё норм. пока каждый объект ссылается на следующий всё это лежит спокойно в куче.

Я там вижу две ссылки: first и last. Вот собственно два числа тут хранится могут. Но мы добавляем там третье. Первое присваивается first, второе присваивается last и третье тоже присваивает last. Каким образом там сдвиг происходит с помощью Next не понимаю.

Стыдно, конечно. Но лучше такие вещи понять поздно, чем никогда.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
KuMa1104
Дата 25.1.2010, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Код

private  LinkedListNode first;
 private LinkedListNode last;


это же не числа а классы.

Цитата(ДобренькийПапаша @  25.1.2010,  22:03 Найти цитируемый пост)
Я там вижу две ссылки: first и last. Вот собственно два числа тут хранится могут. Но мы добавляем там третье. Первое присваивается first, второе присваивается last и третье тоже присваивает last. Каким образом там сдвиг происходит с помощью Next не понимаю.


KelTron это уже приводил.
Код

if (first == null)
            {
                first = newNode;
                last = first;
            }
            else
            {
                last.Next = newNode;
                last = newNode;
            }

Когда происходит 
 list1.AddLast(3);
то у нас  newNode  это ваш 3 элемент.Теперь список не заканчиваеться на 2м элементе и мы показываем это last.Next = newNode; т.е есть 3 элемент. 
И устанавливаем в  last ссылку на последний эл.


Эл1(имет в себе ссылку на эл 2)

Эл2(имет в себе ссылку на эл 3)

Эл3 является последним.

У нас список из 3х эл.

Класс содержит в себе указатели на начальный и конечный эл списка 
first - 1й
last -3й.



Это сообщение отредактировал(а) KuMa1104 - 25.1.2010, 22:17


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.