
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
[C] Реализация бинарного дерева
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#1 |
|
Moderator
Сообщений: 2,261
Регистрация: 21.01.2004
|
[C] Реализация бинарного дерева
Написал основу, но при запуске - ошибка.
"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 *p, int i)
{
if ( i < p->Data )
if ( p->left == NULL )
{
p->left = (Tree*) malloc(sizeof(Tree));
p->left->Data = i;
p->left->left = p->left->right = NULL;
}
else
InsertNode(p->left, i);
else
if ( i > p->Data)
if ( p->right == NULL )
{
p->right = (Tree*) malloc(sizeof(Tree));
p->right->Data = i;
p->right->left = p->right->left = NULL;
}
else
InsertNode(p->right, i);
// free(p->right);
// free(p->left);
};
int main()
{
ReadFromFile(Root);
// PrintTree(Root);
if ( Root == NULL)
printf("%d\n", 123);
return 0;
};
|
|
|
|
#5 |
|
бибизьян
Сообщений: 3,020
Регистрация: 17.02.2004
|
Вариантов масса - использовать указатели на указатели, переписать алгоритм так, чтоб адрес нового элемента возвращался функцией.
ЗЫ. Непонятно только, зачем нужно изобретать кривой лисапед, если в C++ есть готовый std::list Или у вас какая-нибудь embeded-система, и С++ там нет? |
|
|
|
#11 |
|
Форумец
Сообщений: 1,144
Регистрация: 18.09.2006
Возраст: 42
|
блин, ну если в структуры нельзя писать методы, просто переделай так:
struct tree { tree* pNext; tree* pChild; void* data; }; void addNext(tree* this, tree* pl) { pl->pNext=this->pNext; this->pNext=pl; }; void addChild(tree* this, list* pl) { addNext(this,pl); }; //+ остальные навороты, не забывай проверки на нулевые указатели ........ ..... .... |
|
|
|
#12 |
|
Moderator
Сообщений: 2,261
Регистрация: 21.01.2004
|
собственно долгое чтение манов и прочее помогли написать адекватный код
![]() [PHP] /*------------------TREE----------------------- */ #include <stdio.h> typedef struct TNode { int Data; struct TNode *right; struct TNode *left; } Tree; Tree * InsertNode(Tree *Top, int tmp) { if (Top == NULL) { Top = (Tree *) malloc(sizeof(Tree)); Top->Data = tmp; Top->left = NULL; Top->right = NULL; } else if (tmp < Top->Data) Top->left = InsertNode(Top->left, tmp); else Top->right = InsertNode(Top->right, tmp); return Top; }; Tree * ReadFromFile(Tree * Head) { int tmp = 0; FILE *f; f = fopen("nums","r"); while (!feof(f)) { fscanf(f, "%d\n", &tmp); Head = InsertNode(Head, tmp); }; return Head; }; void PrintTree(Tree * Top) { if (Top != NULL) { PrintTree(Top->left); printf("%d\n", Top->Data); PrintTree(Top->right); }; }; int main() { Tree *Root = NULL; Root = ReadFromFile(Root); PrintTree(Root); return 0; }; [/PHP] |
|