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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2013, 13:43   #1
Transcend
Пользователь
 
Регистрация: 13.03.2013
Сообщений: 10
По умолчанию Бинарное дерево поиска C++

Доброго времени суток!
У меня есть задание:создать картотеку,в ней указать тип магазина,номер магазина,ключ,и адрес магазина.Такое задание было предыдущи,только там нужно было сделать этос помощью ЛОС.А теперь это задание нужно сделать с помощью ДБП.Вот мой код на С++(извиняюсь заранее,он очень кривойбт.пишу в блокноте, потом запускаю в Borland 3.1)
Код:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<iomanip.h>
#include<string.h>
#include<stdlib.h>
#define n 3
class btree
{
int k;
int numb;
char addres[30];
char tip[20];
btree *left;
btree *right;
btree *p;
btree *head;
btree *z;
 
public:
void create();
void output(btree *p);
void search();
void insert(btree object,btree *&p);
void del(btree *&r);
void del_element(int key,btree *&p);
};
 
void btree::insert(btree object,btree *&p)
{
 
if(p==NULL)
{
p=new btree;
p->k=object.k;
p->numb=object.numb;
strcpy(p->addres,object.addres);
strcpy(p->tip,object.tip);
p->left=NULL;
p->right=NULL;
}
else
if(object.k<p->k)
insert(object,p->left);
else
if(object.k>p->k)
insert(object,p->right);
}
void btree::del(btree *&r)
{
if(r->right==NULL)
{z->k=r->k;
z->numb=r->numb;
strcpy(z->addres,r->addres);
strcpy(z->tip,r->tip);
z=r;
r=r->left;
}
else del(r->right);
};
 
 
void btree::create()
{
int i;
btree object;
head=NULL;
for( i=0;i<n;i++)
{
cout<<"\n Key : ";
cin>>object.k;
cout<<"\n number magazina : ";
cin>>object.numb;
cout<<"\n Addres : ";
gets(object.addres);
cout<<"\n Tip magazina : ";
gets(object.tip);
insert(object,head);
}
}
 
void btree::output(btree *p)
{
if(p!=NULL)
  {output(p->left);
   
 
    cout<<"\n"<<"і"<<setw(5)<<p->k;
 
 
  
    output(p->right);
   }
}
 
void btree::search()
{
int key;
if (p==NULL)
cout<<"\ Tree ne sysh.";
else
{while(p!=NULL && p->k!=key)
   {if (p->k<key)
     p=p->right;
    else
     p=p->left;
   }
if (p==NULL)
cout<<"\element is not fiund\n";
else
{cout<<"\n"<<"ЪДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДї";
   cout<<"\n"<<"і"<<setw(5)<<"Key"<<"і"<<setw(8)<<"Number"<<"і"<<setw(30)<<"Addres"<<"і"<<setw(20)<<"Tip"<<"і";
   cout<<"\n"<<"ГДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ";
 
    cout<<"\n"<<"і"<<setw(5)<<p->k<<"і"<<setw(8)<<p->numb<<"і"<<setw(30)<<p->addres<<"і"<<setw(20)<<p->tip<<"і";
 
 
    cout<<"\n"<<"АДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ";
}
}
getch();
}
 
void btree::insert(btree *&p)
{
btree object;
if(p==NULL)
{
p=new btree;
p->k=object.k;
p->numb=object.numb;
strcpy(p->addres,object.addres);
strcpy(p->tip,object.tip);
p->left=NULL;
p->right=NULL;
}
else
if(object.k<p->k)
insert(object.p->left);
else
if(object.k>p->k)
insert(object,p->right);
}
void btree::del(btree *&r)
{
if(r->right==NULL)
{z->k=r->k;
z->numb=r->numb;
strcpy(z->addres,r->addres)
strcpy(z->tip,r->tip)
z=r;
r=r->left;
}
else del(r->right);
};
 
 
 
 
 
 
 
 
void menu()
{clrscr();
cout<<"\n 1-Vvod dannih";
cout<<"\n 2-Vivod dannih";
cout<<"\n 3-Poisk po kluchu";
cout<<"\n 4-Udalenie po kluchu";
cout<<"\n 5-Vstavka dannih posle elementa";
cout<<"\n ESC-vihod ";
}
void main()
{clrscr();
 btree object;
 char punkt;
 while(punkt!=27)
 {menu();
  punkt=getch();
  clrscr();
  switch(punkt)
  {case '1':object.create();getch();break;
   case '2':object.output(&object);getch();break; 
   case '3':object.search();getch();break;
   case '4':object.insert(&object);getch();break;
   case '5':object.del();getch();break;   
  }
 }
}
Помогите пожалуйста разобраться,что я неправильно делаю.или вообще я в другую степь полез.
Transcend вне форума Ответить с цитированием
Старый 01.04.2013, 14:48   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
пишу в блокноте, потом запускаю в Borland 3.1
*бип*! Какой *бип* в наше время до сих пор мучает учеников этим *бип*?
Ладно, это так, лирика.

1) Попробуйте явно записать, что должна делать каждая функция (комментариями). Наподобие:
Код:
//Функция вставки. Вставляет объект object, изменяя дерево p. this не меняется и не используется.
void btree::insert(btree object,btree *&p)
2) Попробуйте разбить класс натрое для уменьшения путаницы: отдельно TreeItem, содержащий всю существенную информацию и методы "создать", "сравнить", "скопировать"; отдельно - BinaryTreeNode, содержащий TreeItem и указатели на BinaryTreeNode; отдельно - сам BinaryTree (чтобы нормально справиться со случаем пустого дерева, см. ниже).

3) Не стоит делать create() методом класса BinaryTree. Это уже использование дерева "пользователем", его уместно сделать простой функцией, которая либо принимает ссылку на дерево, либо просто создаёт его внутри себя и возвращает.

Попробуйте в таком духе:
Код:
struct TreeItem{ //Можно сделать её "полноценным" классом, но пока так тоже сойдёт
  int k;
  int numb;
  char addres[30];
  char tip[20];
};
//Функция ввода информации. "Заполняет" pItem
void InputItem(TreeItem *pItem){
  cout<<"\n Key : ";
  cin>>pItem->k;
  cout<<"\n number magazina : ";
  cin>>pItem->numb;
  cout<<"\n Addres : ";
  gets(pItem->addres); //Используйте лучше fgets... если он есть в Borland 3.1 
  cout<<"\n Tip magazina : ";
  gets(pItem->tip);
}

//Функция сравнения. Возвращает true, если первый аргумент "меньше" второго:
bool IsLessItem(const TreeItem& item, const TreeItem& than){
  return item.k < than.k;
}

//Функция копирования не нужна - TreeItem не содержит указателей

//Функция вывода - выводит item в cout
void OutputItem(const TreeItem& item){
cout<<"\n" <<"ЪДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДї"; //Вместо cout << "\n" можно писать cout << endl
   cout<<"\n"<<"і"<<setw(5)<<"Key"<<"і"<<setw(8)<<"Number"<<"і"<<setw(30)<<"Addres"<<"і"<<setw(20)<<"Tip"<<"і";
   cout<<"\n"<<"ГДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ";
    cout<<"\n"<<"і"<<setw(5)<<item.k<<"і"<<setw(8)<<item.numb<<"і"<<setw(30)<<item.addres<<"і"<<setw(20)<<item.tip<<"і";
 
    cout<<"\n"<<"АДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ";
}

//==========================================================

class BinaryTreeNode{
private:
  TreeItem m_item; //закрытые члены полезно отмечать особыми именами, например m_XXX
  BinaryTreeNode* m_left;
  BinaryTreeNode* m_right;
public:
  //Конструктор, "превращающий" TreeItem в BinaryTreeNode
  explicit BinaryTreeNode(TreeItem item) : m_item(item), m_left(NULL), m_right(NULL) {}
  void Insert(TreeItem item);
  //Дальше сами. Не забудьте только этот метод:
  void Clean(void); //Удаляет поддеревья m_left и m_right
};

//Метод вставляет новый лист с элементом item в поддерево
void BinaryTreeNode::Insert(TreeItem item){
  if(IsLessItem(item, m_item)){ //Если меньше - налево
    if(m_left == NULL){ //Если слева пусто
      m_left = new BinaryTreeNode(item);
      return;
    } else {
      return m_left->Insert(item); //Да, так можно. То же самое: m_left->Insert(item); return;
    }
  } else { //Иначе - направо
    if(m_right == NULL){
      m_right = new BinaryTreeNode(item);
      return;
    } else {
      return m_right->Insert(item);
    }
  }
}

//==========================================================

class BinaryTree{
private:
  BinaryTreeNode* m_tree; //Один указатель. Он NULL - дерево пусто.
public:
  //Конструктор без параметров
  BinaryTree(void) : m_tree(NULL) {}
  void Insert(TreeItem item);
  //Деструктор
  ~BinaryTree() {if(m_tree != NULL) {m_tree->Clean(); delete m_tree;} }
};

//Вставляет item в дерево
void BinaryTree::Insert(TreeItem item){
  if(m_tree == NULL){
    m_tree = new BinaryTreeNode(item);
    return;
  } else {
    return m_tree->Insert(item);
  }
}
Abstraction вне форума Ответить с цитированием
Старый 01.04.2013, 14:51   #3
Transcend
Пользователь
 
Регистрация: 13.03.2013
Сообщений: 10
По умолчанию

спасибо!)я попробую разобраться!
Transcend вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарное дерево, проблема с функцией поиска rockfun Общие вопросы C/C++ 1 27.11.2012 10:26
Бинарное дерево поиска С++ vadiprog Помощь студентам 1 06.05.2012 21:47
Бинарное дерево поиска Orli Общие вопросы C/C++ 1 15.12.2011 21:27