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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2012, 16:42   #1
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию Дерево

Здравствуйте, я попробовал реализовать полное дерево в котором попытался выполнить следующие условия:

1. Количество потомков(1 уровня) не может быть больше 4
2. В дерево не может быть добавлено больше 30 элементов
3. Если можно выполнить пункт 1- добавляем потомок в любой указанный родительский элемент.

В общем ошибка вылетает при обращении к родительской переменной хранящей число всех детей.

"Необработанное исключение в "0x00c51484" в "test.exe": 0xC0000005: Нарушение прав доступа при чтении "0xccccccd0"."

Что я намутил?

Код:
         

#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;


class tree {

struct unit {
	                
                                	int width; //ширина, кол-во братьев
					int countChildren;//число детей
					unit *parent,*children[4]; //отец, дети
                                        int data;  //вес
					int num; //порядковый номер
               }; 


public:

	~tree(){};   
          int count; 
	unit * addr[30]; 
	void null(){ tree:count=NULL; }
	void toTree(int,int); 
    
};


void tree::toTree(int dat, int current) {
	unit * treeElem= new unit;
	
	if(count==NULL) {                //если счетчик равен нулю- добавляем первый элемент
		treeElem->countChildren=NULL;          //число детей 0
		treeElem->width=0;                // нет братьев
		treeElem->parent=NULL;          //нет родительского элемента
		int data=dat;                     //чему равен элемент
		addr[count]=treeElem;           //добавляем ссылку на этот элемент
	        treeElem->num=count;             //его номер
		count++;
		
		}

	else {

		if(current>count) { MessageBox(0,L"There is no such element",L"!",0);} //если такого элемента нет
		if(addr[current]->countChildren==4) { MessageBox(0,L"family is complete. You can not add a child",L"error",0);} //лимит детей исчерпан

		addr[current]->countChildren++;              //увеличиваем счетчик детей у родителя
		int max=addr[current]->countChildren;	     // чем он равен?
		addr[current]->children[max]=treeElem;        // счетчик указывает на созданный элемент
		treeElem->parent=addr[current];               //показываем родителя
		treeElem->width=max-1;                        //сколько братьев? вычитаем единицу что бы не считать себя
		treeElem->data=dat;                           //значение
		treeElem->countChildren=NULL;                 //число детей у созданного объекта- NULL
		addr[count++]=treeElem;                       //кидаем на него ссылку в массив ссылок
		treeElem->num=count;
		count++;
		
	}


}


int _tmain(int argc, _TCHAR* argv[])
{
	tree f;
	f.null();
	f.toTree(1,0);
	f.toTree(2,0);
	f.toTree(3,0);

    system("pause");
	return 0;
}

Последний раз редактировалось Dizelektwo; 08.07.2012 в 20:25.
Dizelektwo вне форума Ответить с цитированием
Старый 08.07.2012, 18:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
f.toTree(1,0);
f.toTree(2,1);
А ты не забыл что в Си первый элемент массива имеет индекс 0?
f.toTree(2,1); - Но элемента с номером 1 еще не существует.
Поэтому
Код:
	else {
		current--;
в tree::toTree может поправить положение дел, если хочется именно с единицы начинать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.07.2012, 18:11   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

кривовато, но хоть читается
ошибка тут:
addr[current]->countChildren++;
потому что индексация массивов в С начинается с нуля

В массиве 1 элемент, вы пишите addr[1], но надо addr[0].
да и вообще, криво все это, что вы пытаетесь сделать?

---------------к вопросу не совсем относится:
в коде есть void null(){ tree:count=NULL; }, МБ я неверно понял его назначение, но если верно понял - то замените его чем-то таким:
tree() : count( 0 ) {} (конструктор добавьте)

А еще, поля класса не кошерно размещать в открытой секции, я про это:
int count;
unit * addr[30];
принцип инкапсуляции у вас нарушен.

А еще, замените уже свой NULL на 0, я понимаю еще когда указателю NULL присваивают(хотя, если мне не изменяет память, небезызвестный Страуструп рекомендовал избегать NULL), но писать так: count==NULL....я не понимаю.

добавил
Коварный стилет меня опередил на 2 минуты (вроде бы не в первый раз xD)
Добавить хотел..пользуйтесь отладчиком уже, посмотрите стек вызовов(узнаете в какой функции ошибка), ну а затем пройдитесь по шагам и посмотрите на значения переменных.

Последний раз редактировалось rrrFer; 08.07.2012 в 18:15.
rrrFer вне форума Ответить с цитированием
Старый 08.07.2012, 18:29   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Коварный стилет меня опередил на 2 минуты
Зато ты рассказал больше.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.07.2012, 19:08   #5
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Эко упущение смешное. И про 1 адрес массива и про инкапсуляцию знал, да что-то совсем меня попутало.
Да и знаем мы что пишем криво, главное ведь то, что стараемся и прислушиваемся к грамотным людям . Все приходит с опытом и за советы большое спасибо. Благодарю) Ну а написать хотел то, что уже написано. Добавление элемента к узлу, создание связи и т.п Можно сказать -необычное дерево.

п.с
Да, набыдлокодил. Цитата:'NULL это просто макрос для 0, который рекомендовано использовать для обозначения нулевого указателя'. Может пригодится кому-нибудь из новичков. А я то считал что NULL это кашерно ^^

Последний раз редактировалось Dizelektwo; 08.07.2012 в 19:20. Причина: добавлено
Dizelektwo вне форума Ответить с цитированием
Старый 08.07.2012, 19:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можно сказать -необычное дерево.
Хорошо было бы если бы ты еще свое древо мог через XPath формировать и обходить
Это было бы круто.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.07.2012, 19:39   #7
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Ну обход этого дерева можно реализовать, вполне реально. Под XPath Вы подразумеваете "XPath (XML Path Language) — язык запросов к элементам XML-документа"?. Цитата из вики.
Да и еще один вопрос, не совсем по теме- не подскажите ли самую сложную структуру данных? Я понимаю что это будет некоторый граф. Но какой именно и с каким "функционалом"?

Последний раз редактировалось Dizelektwo; 08.07.2012 в 19:46.
Dizelektwo вне форума Ответить с цитированием
Старый 08.07.2012, 21:42   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Под XPath Вы подразумеваете "XPath (XML Path Language)
Да. Модная сейчас замануха.
Цитата:
самую сложную структуру данных?
Всмысле? Незнаю насколько сложно, но мне приходилось сталкиваться с иерархией деталей и узлов в машинах. Там структура не то чтобы сложная, просто ветвей и связей чрезвычайно много. При учете что одна ветка может расти одновременно из нескольких ветвей (один узел может присутствовать в разных узлах). Т.е. получается виноградное дерево.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.07.2012, 10:44   #9
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Dizelektwo Посмотреть сообщение
Да и еще один вопрос, не совсем по теме- не подскажите ли самую сложную структуру данных? Я понимаю что это будет некоторый граф. Но какой именно и с каким "функционалом"?
Тренируешься в написании программ? Попробуй реализовать 2-3+ дерево или B+ дерево. Красно-чёрное для затравки.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дерево jekie182 Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2012 15:40
Я дерево Кукла_колдуна Паскаль, Turbo Pascal, PascalABC.NET 0 20.03.2011 23:07
Дерево в С# vedro-compota C# (си шарп) 5 07.11.2010 14:02
дерево С# Natok Помощь студентам 0 14.09.2009 23:42
Дерево Yoger БД в Delphi 3 25.01.2007 01:24