Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2013, 08:39   #1
No_Comments
Пользователь
 
Регистрация: 03.07.2011
Сообщений: 92
По умолчанию Дерево на C#

Ребята, помогайте!!!
Срочно надо курсовую сдавать

Пишу красно-черное дерево на C#, Windows Store App.
Так как с указателями в C# имеются трудности, решила делать все через класс Object.
Но, похоже, делаю что-то не так.
Код:
  public unsafe class Elem
    {
        public int value;
        public Object pleft;
        public Object pright;
        public bool IsLeft;
        public bool IsRight;
        public bool IsRed;

        public void BuildTree(Object tt, int n)
        {
            Elem t = (Elem)tt;
            if (n < t.value)
                if (t.IsLeft == false)
                {
                    Elem left = new Elem();
                    left.value = n;
                    left.IsRed = true;
                    t.pleft = left;
                    t.IsLeft = true;                   
                }
                else BuildTree(t.pright, n);
            else
            {
                if (t.IsRight == false)
                {
                    Elem right = new Elem();
                    right.value = n;
                    right.IsRed = true;
                    t.pright = right;
                    t.IsRight = true;
                }
                else BuildTree(t.pright, n);
            }
//...
}
При компиляции вылазит ошибка
Object reference not set to an instance of an object.
No_Comments вне форума Ответить с цитированием
Старый 26.04.2013, 09:49   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Есть прекрасный List<>, в котором можно узлы дерева можно разместить вместе для более удобной обработки. Добавляете внутреннний идентификатор для ссылки на него. Все просто, и обработка в большинстве случева в цикле, а не в рекурсии.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.04.2013, 10:02   #3
No_Comments
Пользователь
 
Регистрация: 03.07.2011
Сообщений: 92
По умолчанию

Т.е. использовать List вроде стека, где первый элемент - корень, 2 других - его потомки и т.д.?
Глупый, наверное, вопрос, но что такое внутренний идентификатор?
No_Comments вне форума Ответить с цитированием
Старый 26.04.2013, 10:04   #4
No_Comments
Пользователь
 
Регистрация: 03.07.2011
Сообщений: 92
По умолчанию

Что интересно. Заменила в классе value на Evalue, и код стал рабочим.
Но, если вводить больше 7 элементов. все равно выскакиевает эта ошибка на том же месте.
No_Comments вне форума Ответить с цитированием
Старый 26.04.2013, 10:15   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Т.е. использовать List вроде стека, где первый элемент - корень, 2 других - его потомки и т.д.?
ЧТо-то типа того.
Цитата:
Глупый, наверное, вопрос, но что такое внутренний идентификатор?
Это уникальный идентифкатор узла. Дело в том, что в результате преобразований нельзя будет положиться на индекс узла в списке. Допустим удалили узел в середине списка и все - все остальные поменяли индексы. И соответственно Вы потеряете ссылочную целостность всего дерева. А имея идентифкаторы, которые не привязаны к хранилищу (то есть к списку). Вы всегда сможете найти элемент в списке по его идентификатору независимо от того в каком месте списка он находится. Просто прошлись циклом и нашли нужный идентификатор, а по нему соответственно и определили его индекс в списке на текущий момент. Это медленней, но намного надежней - одна неверная операция не развалит Ваше дерево. Кроме того, линенйная обработка очень удобна в некоторых случаях. Например, при сериализации, в частности сохранении/чтении данных в файл.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 26.04.2013 в 10:17.
Utkin вне форума Ответить с цитированием
Старый 26.04.2013, 10:19   #6
No_Comments
Пользователь
 
Регистрация: 03.07.2011
Сообщений: 92
По умолчанию

Так вместо List можно использовать ассоциативный массив?
No_Comments вне форума Ответить с цитированием
Старый 26.04.2013, 10:40   #7
No_Comments
Пользователь
 
Регистрация: 03.07.2011
Сообщений: 92
По умолчанию

Код подправила. И без List<> вроде работает!
Только вот тебе стоит задача вывести все это на экран.
Хочу каждый элемент выводить в отдельный textbox.
Но вот вопрос: как программно разместить textbox-ы на странице?!
В приложениях Windows Store Apps фишка this.Controls.Add() не работает(
No_Comments вне форума Ответить с цитированием
Старый 26.04.2013, 13:06   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Так вместо List можно использовать ассоциативный массив?
Конечно, просто работу со списками Вы должны были знать, про массивы обычно учат гораздо реже.

Цитата:
И без List<> вроде работает!
Дело не в списке, а в другом способе организации, который будет более удобен в реализации.
Цитата:
Хочу каждый элемент выводить в отдельный textbox.
Накладно. Выводите наверно в одном. Так проще. Вывод можно сделать на манер лисповых списков (суть описания деревьев через скобочный синтаксис) либо в развернутом виде, так как раньше делали в старых досовских программах. Например, как строились деревья каталогов в файловых менеджерах.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.04.2013, 21:22   #9
No_Comments
Пользователь
 
Регистрация: 03.07.2011
Сообщений: 92
По умолчанию

Я правильно понимаю, что мне для вывода на экран понадобится глубина дерева?!

Подскажите, пожалуйста, как ее подсчитать?
No_Comments вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дерево Dizelektwo Общие вопросы C/C++ 8 09.07.2012 10:44
2-3 дерево С++ dimentius Помощь студентам 0 08.06.2012 17:11
Дерево Igemon93 Общие вопросы C/C++ 0 14.04.2012 18:56
В-дерево kikimka Фриланс 5 12.07.2010 23:16
Дерево Yoger БД в Delphi 3 25.01.2007 01:24