Старый 04.05.2009, 17:07   #1   
Moderator
 
Аватар для mexx
 
Сообщений: 2,261
Регистрация: 21.01.2004

mexx вне форума Не в сети
[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;
};
 
Старый 04.05.2009, 17:50   #2   
Кэп Улитка
 
Аватар для Yandex
 
Сообщений: 8,067
Регистрация: 04.05.2005
Возраст: 45

Yandex вне форума Не в сети
Цитата:
Написал основу, но при запуске - ошибка
Не верю! (с)
 
Старый 04.05.2009, 17:54   #3   
бибизьян
 
Аватар для aerin
 
Сообщений: 3,020
Регистрация: 17.02.2004

aerin вне форума Не в сети
mexx
Дело в том, что в C параметры передаются по значению.
 
Старый 04.05.2009, 17:58   #4   
Moderator
 
Аватар для mexx
 
Сообщений: 2,261
Регистрация: 21.01.2004

mexx вне форума Не в сети
Yandex, ну что поделать, мож таланту нет)

aerin, странно как-то. Хотя у Кернигана так и написано
И что теперь делать? Использовать глобальные переменные?
 
Старый 04.05.2009, 18:23   #5   
бибизьян
 
Аватар для aerin
 
Сообщений: 3,020
Регистрация: 17.02.2004

aerin вне форума Не в сети
Вариантов масса - использовать указатели на указатели, переписать алгоритм так, чтоб адрес нового элемента возвращался функцией.
ЗЫ. Непонятно только, зачем нужно изобретать кривой лисапед, если в C++ есть готовый std::list Или у вас какая-нибудь embeded-система, и С++ там нет?
 
Старый 04.05.2009, 18:24   #6   
Moderator
 
Аватар для mexx
 
Сообщений: 2,261
Регистрация: 21.01.2004

mexx вне форума Не в сети
aerin, просто преподаватель в университете дал задание реализовать дерево на чистом Си, без плюсов
 
Старый 04.05.2009, 19:17   #7   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,144
Регистрация: 18.09.2006
Возраст: 42

xxx-men вне форума Не в сети
class tree
{
tree* pNext;
tree* pChild;

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

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

//ну и остальные навороты
........
.....
....
};
 
Старый 04.05.2009, 19:33   #8   
Moderator
 
Аватар для mexx
 
Сообщений: 2,261
Регистрация: 21.01.2004

mexx вне форума Не в сети
xxx-men, сорри за тупой вопрос, но всеже. В Си есть классы?
 
Старый 04.05.2009, 20:30   #9   
Mоdеrаtоr
 
Аватар для DeniSS1
 
Сообщений: 1,617
Регистрация: 09.10.2007
Возраст: 32

DeniSS1 вне форума Не в сети
mexx, нет, только структуры.
 
Старый 04.05.2009, 20:32   #10   
Moderator
 
Аватар для mexx
 
Сообщений: 2,261
Регистрация: 21.01.2004

mexx вне форума Не в сети
значит никто не может показать работающий код/поправить мой?
 
Старый 05.05.2009, 13:45   #11   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,144
Регистрация: 18.09.2006
Возраст: 42

xxx-men вне форума Не в сети
блин, ну если в структуры нельзя писать методы, просто переделай так:

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

//+ остальные навороты, не забывай проверки на нулевые указатели
........
.....
....
 
Старый 05.05.2009, 20:01   #12   
Moderator
 
Аватар для mexx
 
Сообщений: 2,261
Регистрация: 21.01.2004

mexx вне форума Не в сети
собственно долгое чтение манов и прочее помогли написать адекватный код
[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]
 
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind