Всем привет! Я ОЧЕНЬ новичок в проге, но я упорно занимаюсь ...
Вот, собссна, мое затруднение ... - на парах мы как-то очень быстро пробежали материал, и, не успев закрепить предыдущий, полезли уже в бинарные деревья ... - пытаюсь теперь осваивать самостоятельно...
И вот такая задача:
Надо написать программу, которая содержит динамическую информацию налоговой инспеции. Сведения о каждом лице включают в себя: имя, список налогов, для каждого налога - его размер, признак, юридическое лицо или нет.
Программа должна обеспечивать:1) Формирование базы данных инспекции в виде бинарного дерева. 2) при уплате всех налогов (сумма и имя вводятся с консоли) лицо удаляется из базы. 3) По запросу выводятся сведения о физ. и юрид. лицах отдельно.
У меня есть шаблон, который хотелось бы подогнать под эту задачку:
Код:
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <iostream>
using namespace std;
struct list
{
char* name;
int count;
list* next;
};
struct btree
{
int sort;
list* data;
btree* left;
btree* right;
};
list *addToList(list* l, char* str, int count)
{
if (l == NULL)
{
l = new list();
l->name = new char[strlen(str) + 1];
strcpy(l->name, str);
l->count = count;
l->next = NULL;
return l;
}
else if (strcmp(l->name, str) == 0)
{
l->count += count;
return l;
}
else
{
l->next = addToList(l->next, str, count);
return l;
}
}
list *deleteInList(list* l, char* str, int count)
{
if (l == NULL)
{
return NULL;
}
else if (strcmp(l->name, str) == 0)
{
l->count -= count;
if (l->count == 0)
{
list* temp = l->next;
delete [] l->name;
delete l;
return temp;
}
return l;
}
else
{
l->next = deleteInList(l->next, str, count);
return l;
}
}
void printList(list* l)
{
if (l == NULL)
return;
cout<<l->name<<l->count;
printList(l->next);
}
btree* add(btree *tree, int sort, char* str, int count)
{
if (tree == NULL)
{
btree* tree = new btree();
tree->data = NULL;
tree->left = NULL;
tree->right = NULL;
tree->sort = sort;
tree->data = addToList(tree->data, str, count);
return tree;
}
else if (tree->sort == sort)
{
tree->data = addToList(tree->data, str, count);
return tree;
}
else if (tree->sort > sort)
{
tree->left = add(tree->left, sort, str, count);
}
else if (tree->sort < sort)
{
tree->right = add(tree->right, sort, str, count);
}
return tree;
}
btree* find(btree *tree, int sort)
{
if (tree == NULL)
{
return NULL;
}
if (tree->sort == sort)
{
printList(tree->data);
return tree;
}
if (sort < tree->sort)
{
return find(tree->left, sort);
}
else if (sort > tree->sort)
{
return find(tree->right, sort);
}
}
btree* min(btree *tree)
{
if (tree->left == NULL)
{
return tree;
}
return min(tree->left);
}
btree* del(btree *tree, int sort, char* str, int count)
{
if (tree == NULL)
{
return NULL;
}
btree *temp;
if (tree->sort == sort)
{
tree->data = deleteInList(tree->data, str, count);
if (tree->data == NULL)
{
if (tree->left == NULL && tree->right == NULL)
{
delete tree;
return NULL;
}
else if (tree->left == NULL)
{
temp = tree->right;
delete tree;
return temp;
}
else if (tree->right == NULL)
{
temp = tree->left;
delete tree;
return temp;
}
else
{
temp = min(tree->right);
tree->sort = temp->sort;
tree->data = temp->data;
temp->data = NULL;
tree->right = del(tree->right, tree->sort, str, count);
return tree;
}
}
}
if (sort < tree->sort)
{
tree->left = del(tree->left, sort, str, count);
}
else if (sort > tree->sort)
{
tree->right = del(tree->right, sort, str, count);
}
return tree;
}
void destroyList(list* l)
{
list* temp;
while (l != NULL)
{
temp = l;
l = l->next;
delete [] temp->name;
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()
{
cout<<"Input element of tree or empty string to end : ";
btree* tree = NULL;
char str[100];
char sort[100];
char count[100];
while (strlen(gets(str)) > 0)
{
gets(sort);
gets(count);
tree = add(tree, atoi(sort), str, atoi(count));
cout<<"Input element of tree or empty string to end : ";
}
cout<<"\nInput element to delete or empty string to end : ";
while (strlen(gets(str)) > 0)
{
gets(sort);
gets(count);
tree = del(tree, atoi(sort), str, atoi(count));
cout<<"\nInput element to delete or empty string to end : ";
}
cout<<"\nInput sort to print or empty string to end : ";
while (strlen(gets(str)) > 0)
{
find(tree, atoi(str));
cout<<"\nInput sort to print or empty string to end : ";
}
destroyTree(tree);
return 0;
}
Посмотрите, пжлст ...