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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2011, 02:37   #1
Viktor19764
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 2
По умолчанию Бинарное дерево

Здравствуйте. Помогите сделать задачу. Надо построить бинарное дерево для хранения и операций с данными вида наименование товара-количество-цена. Сутки просидел, переделывал код Дейтла. Не получается.
Viktor19764 вне форума Ответить с цитированием
Старый 05.11.2011, 23:21   #2
Viktor19764
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 2
По умолчанию

Вот код:

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include "tree.h"
#include <string>
using std::string;

int main ()
{
setlocale(LC_CTYPE,"Russian");



TREE A;

A.BuildTree ();
cout<<"\nВывод дерева:\n";
A.Vyvod (A.GetTree(),0);
cout<<"\nВысота дерева:"<<A.Height(A.GetTree())<<en dl;
cout<<"\nЛевосторонний обход дерева: ";
A.ObhodLeft (A.GetTree());
cout<<"\nКонцевой обход дерева: "; A.ObhodEnd (A.GetTree());
cout<<"\nОбратный обход дерева: "; A.ObhodBack (A.GetTree());
A.CleanTree (A.GetTree());

A.copy (A.GetTree(), A.GetTree2());

cout<<"\nВывод дерева:\n";
A.Vyvod (A.GetTree2(),0);
cout<<"\nВысота дерева:"<<A.Height(A.GetTree2())<<e ndl;
cout<<"\nЛевосторонний обход дерева: ";
A.ObhodLeft (A.GetTree2());
cout<<"\nКонцевой обход дерева: "; A.ObhodEnd (A.GetTree2());
cout<<"\nОбратный обход дерева: "; A.ObhodBack (A.GetTree2());
A.CleanTree (A.GetTree2());
}

void TREE::BuildTree ()
// Построение бинарного дерева (рекурсивный алгоритм).
// Tree - указатель на корень дерева.
{
string el="a";
int k=0;
double v=0;

cout<<"Введите название товара ...\n";
cin>>el;
while(el!="kinec")
{

cout<<"Введите количество товара ...\n";
cin>>k;

cout<<"Введите цену товара ...\n";
cin>>v;
Search (el,k,v,&Tree);
cout<<"Введите название товара ...\n";
cin>>el;
}}

void TREE::Search (string x,int y, double z, node **p)
// Поиск вершины с ключом x в дереве со вставкой
// (рекурсивный алгоритм).
// *p - указатель на корень дерева.
{
if (*p==NULL)
{// Вершины в дереве нет; включить ее.
*p = new (node);
(**p).Key = x; (**p).Count = 1;
(**p).kilkist=y; (**p).vartist = z;
(**p).Left = NULL; (**p).Right = NULL; }
else
if (x<(**p).Key) Search (x,y,z,&((**p).Left));
else
if (x>(**p).Key) Search (x,y,z,&((**p).Right));
else (**p).Count = (**p).Count + 1;
}

void TREE::ObhodLeft (node **w)
//Левосторонний обход дерева.
//*w - указатель на корень дерева.
{
if (*w!=NULL)
{
cout<<(**w).Key<<" ";
ObhodLeft (&((**w).Left));
ObhodLeft (&((**w).Right));
}
}

void TREE::ObhodEnd (node **w)
//Концевой обход дерева.
//*w - указатель на корень дерева.
{
if (*w!=NULL)
{ ObhodEnd (&((**w).Left));
ObhodEnd (&((**w).Right));
cout<<(**w).Key<<" "; }
}

void TREE::ObhodBack (node **w)
//Обратный обход дерева.
//*w - указатель на корень дерева.
{
if (*w!=NULL)
{ ObhodBack (&((**w).Left));
cout<<(**w).Key<<" ";
ObhodBack (&((**w).Right)); }
}

void TREE::CleanTree (node **w)
//Очистка дерева.
//*w - указатель на корень дерева.
{
if (*w!=NULL)
{ CleanTree (&((**w).Left));
CleanTree (&((**w).Right));
delete *w; }
}

void TREE::Vyvod (node **w,int l)
//Изображение дерева *w на экране дисплея
// (рекурсивный алгоритм).
//*w - указатель на корень дерева.
{
int i;

if (*w!=NULL)
{ Vyvod (&((**w).Right),l+1);
for (i=1; i<=l; i++) cout<<" ";
cout<<(**w).Key<<endl;
Vyvod (&((**w).Left),l+1); }
}

int TREE::Height (node **w)
//Определение высоты бинарного дерева.
//*w - указатель на корень дерева.
{
int h1,h2;
if (*w==NULL) return (-1);
else
{
h1 = Height (&((**w).Left));
h2 = Height (&((**w).Right));
if (h1>h2) return (1 + h1);
else return (1 + h2);
}
}

void TREE::copy (node **w, node **p2)
{
if (*w!=0)
{
*p2= new (node);
(*p2)->Key=(*w)->Key;
(*p2)->kilkist=(*w)->kilkist;
(*p2)->vartist=(*w)->vartist; (*p2)->Count=(*w)->Count;
if ((*w)->Left!=0)
{ copy (&((**w).Left), &((**p2).Left)); }
else
(*p2)->Left=0;
if ((*w)->Right!=0)
{ copy (&((**w).Right), &((**p2).Right));}
else
(*p2)->Left=0;
}
}


Помогите сделать копию дерева. Что-то в функции copy не срабатывает - выдает ошибку Program received signal SIGSEGV, Segmentation fault.
In ntdll!RtlTimeToTimeFields () (C:\Windows\system32\ntdll.dll)
At tree.h:9
Viktor19764 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарное дерево Си Evacuator Помощь студентам 2 01.06.2011 21:40
бинарное дерево Intess Помощь студентам 0 23.05.2011 15:58
Бинарное дерево) Svetlanka_ya Помощь студентам 0 17.04.2010 11:13
Бинарное дерево С++ Olya90 Помощь студентам 1 20.10.2009 21:45
Бинарное дерево Lazio Общие вопросы C/C++ 2 10.09.2009 20:31