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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2010, 19:38   #1
Simbian
Новичок
Джуниор
 
Регистрация: 27.05.2010
Сообщений: 2
По умолчанию Бинарные деревья в C++, как работает прога?

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

Сведения о каждой книге включает в себя:
1)Номер УДК (3-х-значный без букв, уникальный) - в данном случае это ключ;
2)Фамилию автора;
3)Название книги;
4)Количество экземпляров книг в библиотеке.

Программа должна обеспечивать:
1)Начальное формирование базы данных о книгах в виде бинарного дерева.(пользователь вводит всё)
2)При выдаче каждой книги на руки (УДК вводится с консоли пользователем) из базы книг,
находящихся в библиотеке, программа уменьшает количество экземпляров данной книги на 1
или выдаёт сообщение о том, что требуемый книги в библиотеке нет, или она находится
на руках (2 разных сообщения - 2 разных случая).
3)При возвращении каждой книги на руки (УДК вводится с консоли пользователем) программа
увеличивает значение количества экземпляров данной книги на 1, если такая книга лдолжна
быть в библиотеке.
4)По запросу выводятся сведения о книгах, находящихся в библиотеке.

Помогите разобраться в рабочем(!!!) коде:
Интересует как работает первая часть.
next - указатель на следующий элемент списка, зачем его обнулять?

#include<iostream.h>
#include <stdio.h>
#include <string>

using namespace std;

struct list
{
char* author;
char* book;
int count;
list* next;
};

struct btree
{
int YDK;
list* data;
btree* left;
btree* right;
};

list *addToList(list* l, char* author, char* book, int count)
{
if (l == NULL)
{
l = new list();
l->count = count;
l->author = new char[strlen(author) + 1];
l->book = new char[strlen(book) + 1];
strcpy (l->author, author);
strcpy (l->book, book);
l->next = NULL;
return l;
}
else
{
l->next = addToList(l->next, author, book, count);
return l;
}
}

btree* add(btree *tree, int YDK, char* author, char* book, int count)
{
if (tree == NULL)
{
btree* tree = new btree();
tree->YDK = YDK;
tree->data = NULL;
tree->left = NULL;
tree->right = NULL;
tree->data = addToList(tree->data, author, book, count);
return tree;

}
else if (tree->YDK > YDK )
tree->left = add(tree->left, YDK, author, book, count);
else if (tree->YDK < YDK )
tree->right = add(tree->right, YDK, author, book, count);

return tree;
}

btree *takeBook(btree* tree, int YDK)
{
if (tree == NULL)
{
cout<<"there isn't this book in the library\n";
return NULL;
}
else if (tree->YDK == YDK)
{
if (tree->data->count > 0)
tree->data->count--;
else if (tree->data->count == 0)
{
cout<<"this book has already been taken\n";
return tree;
}

}
else if (tree->YDK > YDK)
return takeBook(tree->left, YDK);
else if (tree->YDK < YDK)
return takeBook(tree->right, YDK);
}

btree *returnBook(btree* tree, int YDK)
{
if (tree == NULL)
return NULL;
else if (tree->YDK == YDK)
tree->data->count++;
else if (tree->YDK > YDK)
return returnBook(tree->left, YDK);
else if (tree->YDK < YDK)
return returnBook(tree->right, YDK);
}

void printTree(btree* tree)
{
if (tree == NULL)
return;

printf("\n%d %s\t %s\t %d\n", tree->YDK, tree->data->author, tree->data->book, tree->data->count);
printTree(tree->left);
printTree(tree->right);
}

void destroyList(list* l)
{
list* temp;
while (l != NULL)
{
temp = l;
l = l->next;
delete [] temp->author;
delete [] temp->book;
delete temp;
}
}

void destroyTree(btree* tree)
{
if (tree == NULL)
return;
btree* left = tree->left;
btree* right = tree->right;
destroyList(tree->data);
delete tree;
destroyTree(left);
destroyTree(right);

}
int main()
{
printf("Input the information about the book or empty string to end : ");
btree* tree = NULL;
char YDK[4];
char author[10];
char book[10];
int count;
int x = 0;
while (strlen(gets(YDK)) > 0)
{
gets (author);
gets (book);
cin>>count;
tree = add(tree, atoi(YDK), author, book, count);
printf("Input the information about the book or empty string to end : ");

}

printf("\nIf you want to take the book input 1");
printf("\nif you want to return the book input 2");
printf("\nIf you want to print information about the books input 3");
printf("\nInput 0 to end\n");
cin>>x;

while (x != 0)
{
switch(x)
{
case 1:

printf("\nInput YDK : ");
gets(YDK);
takeBook(tree, atoi(YDK));
break;

case 2:
printf("\nInput YDK : ",gets (YDK));
returnBook (tree, atoi(YDK));
break;

case 3:

printTree(tree);

break;

default:;
}

printf("\nIf you want to take the book input 1");
printf("\nif you want to return the book input 2");
printf("\nIf you want to print information about the books input 3");
printf("\nInput 0 to end\n");
cin>>x;

}
destroyTree (tree);
return 0;
}
Simbian вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бинарные деревья gilex Паскаль, Turbo Pascal, PascalABC.NET 7 23.06.2013 16:55
бинарные деревья в c++ eLegAM Помощь студентам 0 21.06.2009 22:12
Бинарные деревья Aleks_90 Помощь студентам 0 07.06.2009 15:06
Деревья со случайным поиском! Не работает прога Valeri Общие вопросы C/C++ 7 17.05.2009 12:40