Двоичное дерево и файлы

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

Approx
Сообщения: 4
Зарегистрирован: 07 июн 2009, 19:01

я, начинающий пользователь С++, до этого дела с ним не имел. Вот такая вот задача:

Составить программу, которая содержит текущую информацию о книгах в библиотеке.

Сведения о книгах содержат:
-номер УДК;
-фамилию и инициалы автора;
-название;
-год издания;
-количество экземпляров данной книги в библиотеке.

Программа должна обеспечивать:
-начальное формирование данных обо всех книгах в библиотеке в виде двоичного дерева;
-добавление данных о книгах, вновь поступающих в библиотеку;
-удаление данных о списываемых книгах;
-по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.


Я написал ее но без работы(чтения/записи) с файлом. А также, не знаю как реализовать пункт:

-начальное формирование данных обо всех книгах в библиотеке в виде двоичного дерева;

кто может помочь? Вот что у меня получилось:

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

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
 
using namespace std;
 
struct LIBRARY
{
    char nomer[30];
    char FIO[30];
    char nazvanie[40];
    int Year;
    int kolvo;
};
 
struct STR
{
    LIBRARY *Library;
    STR *next;
};
 
STR * create(LIBRARY * Library)
{
   STR *root=new STR;
   root->Library=Library;
   root->next=NULL;
   return root;
}
 
void add(LIBRARY *Library, STR* root) 
{
    while(root->next)
      root=root->next;
    root->next=new STR;
    root->next->Library=Library;
    root->next->next=NULL;
}
 
void printLIBRARY(LIBRARY *Library) //âûâîä íà ýêðàí  
{
     
    cout<<"Nomer => "<<Library->nomer<<endl;
    cout<<"FIO => "<<Library->FIO<<endl;
    cout<<"Nazvanie => "<<Library->nazvanie<<endl;
    cout<<"Year => "<<Library->Year<<endl;
    cout<<"Kolvo => "<<Library->kolvo<<endl;    
    cout<<endl;
     
}
LIBRARY * makeLIBRARY() 
{
   cout<<"Enter book data:"<<endl;
    LIBRARY *Library=new LIBRARY;
    fflush(stdin);
    cout<<"Enter book nomer: => ";
    cin.getline(Library->nomer,30);
 
    cout<<"Enter Author's FIO:  => ";
    cin.getline(Library->FIO,30);
 
    cout<<"Enter book name: => ";
    cin.getline(Library->nazvanie,40);
 
    cout<<"Enter made year:  => ";
    cin>>Library->Year;
 
    cout<<"Enter count of books:  => ";
    cin>>Library->kolvo;
 
    return Library;
}
int choice()
{
    int answer;
    getch();
    system("cls");
    cout<<"Main menu"<<endl;
    cout<<"1. Add new books to the list"<<endl;
    cout<<"2. Print LIBRARY at list"<<endl;
    cout<<"3. Search and delete"<<endl;
    cout<<"4. Clear all entries"<<endl;
    cout<<"5. Load"<<endl;
	cout<<"6. Save"<<endl;
	cout<<"0. Exit"<<endl;
    cout<<"Enter your choice: ";
    cin>>answer;
    fflush(stdin);
    if(answer>=1 && answer<=5)
      return answer;
    else
      return 0;
}
 
int main()
{
    STR *root=NULL;
    int ch;
    while(1)
    {
       ch=choice();
	   if(ch==1)
       {
           cout<<endl;
           if(root==NULL)
             root=create(makeLIBRARY());
           else
             add(makeLIBRARY(),root);
       }
 
       else if(ch==2)
       {
           cout<<endl;
           int i=0;
           int N=0;
           
           STR *proot=root;
           while (root)
           {
               N++;
               root=root->next;
           }
 
           LIBRARY *buf;
           LIBRARY **pLibrary=new LIBRARY*[N];
           root=proot;
           
           while (root)
           {
                   pLibrary[i]=root->Library;
                   root=root->next;
                   i++;
               }
 
           root=proot;
 
         
               for (i=0;i<N;i++)
                   printLIBRARY(pLibrary[i]);
               
       }
 
            else if(ch==3)
       {
           char qwe[30];
           char qw[30], q[1];
           cout<<"Enter nomer of book => "<<endl;
           cin.getline(qwe,30);
           while (root)
           {
               if (!strcmp(qwe,root->Library->nomer))
               {  
                    {
                   printLIBRARY(root->Library);
 cout<<"Do you want clear this entries? (y/n) "<<endl;
                   cin.getline(q,1);
                        if (!strcmp(q,"y"))
                                    {
                                root->Library=NULL;
                         }
                   root=root->next;
                    }
                     }
               else if (strcmp(qwe,root->Library->nomer))
                   root=root->next;
           }
           
           cout<<endl;
       }
 
       else if(ch==5)
       {
           break;
           cout<<endl;
       }
       
    }
    return 0;
}
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

1. Пользуйся [ code = cpp ] ... [ /code ], а то непонятно что написано в проге.
2. Начальное формирование данных производится откуда: из файла, БД или как-то по-другому ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Approx
Сообщения: 4
Зарегистрирован: 07 июн 2009, 19:01

да, начальная загрузка из файла
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
так что? может кто нибуть помочь, хотябы с двоичным деревом?
evgenrpo
Сообщения: 12
Зарегистрирован: 31 май 2009, 21:26
Контактная информация:

Как в указаной дериктории узнать. Какие есть папки?
По инете не могу ничево найти . Может кто знает где искать.
Approx
Сообщения: 4
Зарегистрирован: 07 июн 2009, 19:01

не понял про [ code = cpp ] ... [ /code ] :(

2evgenrpro вообщето не в тему... но поищи по инет про диррективу dir
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Какой конкретно вопрос ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Approx
Сообщения: 4
Зарегистрирован: 07 июн 2009, 19:01

я не разбираюсь в деревьях... и не могу реализовать пункт:

-начальное формирование данных обо всех книгах в библиотеке в виде двоичного дерева;

почитал в инете, потыкался но так и не понял... не нашел ни 1 толкового примера
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Если ты реализовал добавление, то чтение из файла - это просто добавление элементов из файла, пока не конец файла.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

У тебя вообще какой компилятор?
В Borland C++ есть готовый класс бинарного дерева. Он в виде шаблона реализован, называется TBinarySearchTreeImp.
Поумнеть несложно, куда труднее от дури избавиться.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

В любом поисковике (хотя бы взять тот же Google) достаточно набрать c++ binary trees и получишь огромное количество ссылок...
Ответить