Большой Воронежский Форум
» Программирование>[C] Реализация бинарного дерева
mexx 17:07 04.05.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 *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;
};
Yandex 17:50 04.05.2009

Сообщение от :
Написал основу, но при запуске - ошибка

Не верю! (с)
aerin 17:54 04.05.2009
mexx
Дело в том, что в C параметры передаются по значению.
mexx 17:58 04.05.2009
Yandex, ну что поделать, мож таланту нет)

aerin, странно как-то. Хотя у Кернигана так и написано
И что теперь делать? Использовать глобальные переменные?
aerin 18:23 04.05.2009
Вариантов масса - использовать указатели на указатели, переписать алгоритм так, чтоб адрес нового элемента возвращался функцией.
ЗЫ. Непонятно только, зачем нужно изобретать кривой лисапед, если в C++ есть готовый std::list Или у вас какая-нибудь embeded-система, и С++ там нет?
mexx 18:24 04.05.2009
aerin, просто преподаватель в университете дал задание реализовать дерево на чистом Си, без плюсов
xxx-men 19:17 04.05.2009
class tree
{
tree* pNext;
tree* pChild;

void addNext(tree* pl)
{
pl->pNext=pNext;
pNext=pl;
}

void addChild(list* pl)
{
pChild->addNext(pl);
};

//ну и остальные навороты
........
.....
....
};
mexx 19:33 04.05.2009
xxx-men, сорри за тупой вопрос, но всеже. В Си есть классы?
DeniSS1 20:30 04.05.2009
mexx, нет, только структуры.
mexx 20:32 04.05.2009
значит никто не может показать работающий код/поправить мой?
xxx-men 13:45 05.05.2009
блин, ну если в структуры нельзя писать методы, просто переделай так:

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);
};

//+ остальные навороты, не забывай проверки на нулевые указатели
........
.....
....
mexx 20:01 05.05.2009
собственно долгое чтение манов и прочее помогли написать адекватный код
[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]
Вверх