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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2012, 18:28   #1
LordJohn
 
Регистрация: 06.09.2012
Сообщений: 4
Печаль Переполнение стека при рекурсии (в бинарном дереве)

Доброго времени суток.
Задача - создать бинарное дерево элементов типа student. Так вот, когда я пытаюсь запихнуть в дерево больше примерно 3750 элементов, мне компилятор (vs 2010) выдаёт stack overflow. Я, конечно, понимаю, что можно просто увеличить размер стека, но нельзя ли решить эту проблему как-либо иначе??
Прошу прощения за такое колличество кода.
main.cpp
int main()
Код:
{
	Tree* tree1 = new Tree();
	int i;

	for(i = 0; i < 10000; i++)
	{
		printf("%d\n", i);
		tree1->Insert(new Student("d", 1));
	}
}
tree.h
Код:
class Tree
{
private:
	Node* root;

	Node* Insert(Node* node, Student *s);
public:
	void Insert(Student *s);
};
tree.cpp
Код:
Node* Tree::Insert(Node* node, Student *s)
{
	if(node == 0)
		return new Node(s);
	else
	{
		if( s->cmp(node->data) ==  1)
			node->left = Insert(node->left, s);
		else
			node->right = Insert(node->right, s);
		return node;
	}
}

void Tree::Insert(Student *s)
{
	root = Insert(root, s);
}
node.h
Код:
class Node
{
private:
	friend class Tree;
	Student *data;
	Node *left;
	Node *right;
public:
	Node();
	Node(Student *s);
	Node(const char *n, int v);
	Node(Node *node);
};
node.cpp
Код:
Node::Node()
{
	left = right = 0; data = 0;
}

Node::Node(Student *s)
{
	left = right = 0;
	data = s;
}

Node::Node(const char *n, int v)
{
	left = right = 0;
	data = new Student(n, v);
}

Node::Node(Node *node)
{
	left = right = 0;
}
student.h
Код:
class Student
{
private:
	friend class Tree;
	friend class Node;
	char *name;
	int value;
public:
	Student();
	Student(const char *in, int iv);
	Student(const Student& s);
	~Student();
	int cmp(const Student *b) const;
	void operator =(const Student &rhs);
	const char *get_name() const { return (const char*) name; }
	int get_value() const { return value; }
	int operator <(const Student &b) const;
	int operator >(const Student &b) const;
	int init(const char *in = 0, int iv = 0);
};
student.cpp
Код:
#define BUF_LEN 1234

Student::Student(const char *in, int iv)
{
	init(in, iv);
}

int Student::init(const char *in, int iv)
{
	/*
	if(name)
		delete[] name;
		*/
	if(in)
	{
		name = new char[strlen(in) + 1];
		if(!name) return -1;
		strcpy(name, in);
	}
	else name = 0;

	value = iv;
	return 0;
}

Student::Student() { name = 0; init(name, value); }

Student::~Student()
{
	if(name) delete[] name;
	name = 0;
	value = 0;
}
int Student::cmp(const Student *b) const
{
	int i = strcmp(name, b->name);
	if(i == 0)
	{ if( (value - b->value) > 0) return 0; else return 1; }
	else if(i > 0) return 0;
	else return 1;
}
int Student::operator<(const Student &b) const
{
	int i = strcmp(name, b.name);
	if(i == 0)
	{ if( (value - b.value) > 0) return 0; else return 1; }
	else if(i > 0) return 0;
	else return 1;
}

int Student::operator > (const Student &b) const
{
	int i = strcmp(name, b.name);
	if(i == 0)
	{ if( (value - b.value) > 0) return 1; else return 0; }
	else if(i > 0) return 1;
	else return 0;
}

void Student::operator = (const Student &rhs)
{
	name = rhs.name;
	value = rhs.value;
}
LordJohn вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчет уровней в бинарном дереве holi10 Общие вопросы C/C++ 0 01.06.2011 18:22
переполнение стека при создании сообщений Miller-1981 Общие вопросы C/C++ 0 24.01.2011 10:49
при открытии Recordset'a возникает переполнение стека MrGB Microsoft Office Access 3 16.11.2010 20:15
Поиск в бинарном дереве не по ключу lebrosha Помощь студентам 2 26.05.2009 15:32
Переполнение стека при передачи функциям массивов большой размерности graphoman Общие вопросы Delphi 2 07.01.2008 21:47