Страница 1 из 1

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

Добавлено: 17 ноя 2009, 18:09
Lamarq
Попытался реализовать сильноветвящееся дерево с помощью 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 штук потомков друг друга).

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

Добавлено: 18 ноя 2009, 13:16
WinMain
Скажи пожалуйста, тебе структура дерева нужна для решения какой-то конкретной задачи или построение дерева как такового - и есть сама по себе задача?
Я к чему это спрашиваю - могу предложить использовать (или просто изучить) готовую реализацию дерева в библиотеке ATL. Это находится в файле atlcoll.h
Там тоже используется двусвязный список (CAtlList<>).

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

Добавлено: 18 ноя 2009, 15:26
Romeo
std::list типа структуры, в которой он сам расположен, объявлять нельзя. Оно у тебя не должно даже компилироваться, не говоря уже о работе.

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

Добавлено: 18 ноя 2009, 21:02
Lamarq
WinMain,
спасибо, непременно посмотрю.

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

Строку

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

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

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

AddToTree(++new_data, parent.List.back());