[C++] Добавление элементов в дерево на основе <list>

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Lamarq
Сообщения: 2
Зарегистрирован: 17 ноя 2009, 18:06

Попытался реализовать сильноветвящееся дерево с помощью STL. Но в дерево рекурсивной функцией не добавляются никакие элементы, кроме первого(((

Код: Выделить всё

#include <iostream>
#include <list>
#include <string>

using namespace std;

struct Node
{
	unsigned char data;
	list<Node> List;
};

list<unsigned char> StringList;

void AddToTree (list<unsigned char>::iterator new_data, Node& parent)
{
	if (new_data == StringList.end())
		return;
	Node temp;
	temp.data = (*new_data);
	parent.List.push_back(temp);
	AddToTree(++new_data, temp);
}

static Node root;

int main()
{
	for (unsigned char i = 1; i < 11; ++i)
	{
		StringList.push_back(i);
		cout << i << " ";
	}
	root.data = 0;
	AddToTree(StringList.begin(), root);
}
Каким образом мне исправить программу, чтобы элементы добавлялись правильно? (в данном примере, допустим, 10 штук потомков друг друга).
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Скажи пожалуйста, тебе структура дерева нужна для решения какой-то конкретной задачи или построение дерева как такового - и есть сама по себе задача?
Я к чему это спрашиваю - могу предложить использовать (или просто изучить) готовую реализацию дерева в библиотеке ATL. Это находится в файле atlcoll.h
Там тоже используется двусвязный список (CAtlList<>).
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

std::list типа структуры, в которой он сам расположен, объявлять нельзя. Оно у тебя не должно даже компилироваться, не говоря уже о работе.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Lamarq
Сообщения: 2
Зарегистрирован: 17 ноя 2009, 18:06

WinMain,
спасибо, непременно посмотрю.

Romeo,
нет, так можно. Все спокойно компилируется. Ошибка была в том, что я использовал локальную переменную как параметр-ссылку рекурсивной функции. Но я уже разобрался.

Строку

Код: Выделить всё

 AddToTree(++new_data, temp);
заменил на

Код: Выделить всё

AddToTree(++new_data, parent.List.back());
Ответить