|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.06.2010, 19:38 | #1 |
Новичок
Джуниор
Регистрация: 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; } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
бинарные деревья | 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 |