Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Реализация дерева, Код написан, где-то вылажу за память 
V
    Опции темы
lagab
Дата 4.5.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такой вод код написал..
При запуске бинарника - Bus Error, то есть выход за память.
Код

/*------------------TREE----------------------- */
#include <stdio.h>
typedef struct TNode
{
    int Data;
    struct TNode *right;
    struct TNode *left;
} Tree;

Tree *Root = NULL;

void ReadFromFile(Tree *Top)
{
    int tmp = 0;
    FILE *f;
    f = fopen("nums","r");
    
    if (Top == NULL)
    {
        fscanf(f, "%d\n", &tmp);
        Top = (Tree*) malloc(sizeof(Tree));
        Top->Data = tmp;
        Top->left = NULL;
        Top->right = NULL;
    };
    while (!feof(f))
    {
        fscanf(f, "%d\n", &tmp);
        InsertNode(Top, tmp);
    };    
};

void PrintTree(Tree *Top)
{
    printf("%d", Top->Data);
    if (Top->left != NULL)
        PrintTree(Top->left);
    if (Top->right != NULL)
        PrintTree(Top->right);    
};

void InsertNode(Tree *Top, int tmp)
{
    if ( tmp < Top->Data )
        if ( Top->left == NULL )
        {
            Top->left = (Tree*) malloc(sizeof(Tree));
            Top->left->Data = tmp;
            Top->left->left = Top->left->right = NULL;
        }
        else
            InsertNode(Top->left, tmp);
    else 
        if ( tmp > Top->Data)
            if ( Top->right == NULL )
            {
                Top->right = (Tree*) malloc(sizeof(Tree));
                Top->right->Data = tmp;
                Top->right->left = Top->right->left = NULL;
            }
            else
                InsertNode(Top->right, tmp);

    //free(Top->right);
    //free(Top->left);
};

int main()
{
    ReadFromFile(Root);
    PrintTree(Root);
    if ( Root == NULL)
        printf("%d\n", 123);
    return 0;
};



Посмотрите плиз, какие есть замечания? Может быть кто-то подскажет лучшую реализацию дерева?
Пока нужно просто организовать добавление/вывод на консоль.
И сразу вопрос: как вывести дерево в консоль, чтобы оно выглядело наглядно? В древовидном виде.
PM MAIL   Вверх
bsa
Дата 4.5.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



lagab, отлаживать пробовал? попробуй отладчиком.

Дальше, ты попытался открыть файл, но не удостоверился в результате операции. Если fopen не открыла файл (а у тебя файл "nums" - уверен, что без расширения?), то она возвращает NULL. Что вернет fscanf в этом случае?

PM   Вверх
lagab
Дата 5.5.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



файл существует. просто все читает.
Понаставив бряк в виде printf заметил, что после отработки функции добавления - Root->Data всеравно остается NULL, то есть как локальную переменную он изменяет, а глобальная остается такой же как была. Не понимаю почему, ведь Tree *Top это указатель на вершину...
PM MAIL   Вверх
math64
Дата 5.5.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Код

Tree * ReadFromFile() {
  Tree *Top = NULL;
  ...
  return Top;
}

int main()
{
    Root = ReadFromFile();
    ...
}

PM   Вверх
J0ker
Дата 5.5.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(lagab @  5.5.2009,  14:23 Найти цитируемый пост)
Понаставив бряк в виде printf заметил, что после отработки функции добавления - Root->Data всеравно остается NULL

Root->Data не может быть NULL, т.к. это int


--------------------
user posted image
PM MAIL   Вверх
lagab
Дата 5.5.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



J0ker, да, имел ввиду Top == NULL 
PM MAIL   Вверх
sdukshis
Дата 5.5.2009, 17:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Параметры в C передаются только по значению.
Значит чтобы изменить переменную типа Tree надо передавать Tree*, а чтобы изменить переменную типа Tree* надо передавать Tree**


PM MAIL   Вверх
J0ker
Дата 5.5.2009, 17:31 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void ReadFromFile(Tree *&Top)
...



--------------------
user posted image
PM MAIL   Вверх
zim22
Дата 5.5.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(J0ker @  5.5.2009,  17:31 Найти цитируемый пост)
void ReadFromFile(Tree *&Top)

J0ker, посмотрите внимательней на название темы
Цитата

 [C] Реализация дерева, 

насколько я знаю, в С нет ссылок.




--------------------
PM MAIL   Вверх
J0ker
Дата 5.5.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zim22 @  5.5.2009,  17:59 Найти цитируемый пост)
насколько я знаю, в С нет ссылок.

да, действительно, забыл этот недостаток plain C  smile 


--------------------
user posted image
PM MAIL   Вверх
lagab
Дата 5.5.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



таки реализовал все. спасибо за отклики

Это сообщение отредактировал(а) lagab - 5.5.2009, 20:42
PM MAIL   Вверх
J0ker
Дата 5.5.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(lagab @  5.5.2009,  20:42 Найти цитируемый пост)
таки реализовал все. спасибо за отклики

у вас вывод не сортированный
исправьте:
Код

void PrintTree(Tree *Top)
{
    if (Top->left != NULL)
        PrintTree(Top->left);
    printf("%d", Top->Data);
    if (Top->right != NULL)
        PrintTree(Top->right);    
};




--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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