Advertisement
Guest User

Untitled

a guest
Oct 10th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <iomanip>
  6. #include <conio.h>
  7. using namespace std;
  8. struct student
  9. {
  10.     char fio[15];
  11.     int ball[3];
  12. };
  13. struct node
  14. {
  15.     student data;
  16.     node* left;
  17.     node* right;
  18. };
  19. student input()
  20. {
  21.     student inf;
  22.     cout << endl << "Фамилия: ", cin >> inf.fio;
  23.     cout << "Физика: ", cin >> inf.ball[0];
  24.     cout << "История: ", cin >> inf.ball[1];
  25.     cout << "Математика: ", cin >> inf.ball[2];
  26.     return inf;
  27. }
  28. node* add(node* top, const student& newnode)
  29. {
  30.     if (!top)
  31.     {
  32.         top = new node;
  33.         top->data = newnode;
  34.         top->left = NULL;
  35.         top->right = NULL;
  36.     }
  37.     else
  38.         if (strcmp(top->data.fio, newnode.fio) > 0)
  39.             top->left = add(top->left, newnode);
  40.         else
  41.             top->right = add(top->right, newnode);
  42.     return top;
  43. }
  44. void viewtable(node* top)
  45. {
  46.     if (top)
  47.     {
  48.         cout << setw(15) << top->data.fio << setw(8) << top->data.ball[0] << setw(9) << top->data.ball[1] << setw(12) << top->data.ball[2] << endl;
  49.         viewtable(top->left);
  50.         viewtable(top->right);
  51.     }
  52. }
  53. void viewtree(node* top, int space)
  54. {
  55.     if (top)
  56.     {
  57.         space += 3;
  58.         viewtree(top->right, space);
  59.         cout << setw(space) << top->data.fio << endl;
  60.         viewtree(top->left, space);
  61.     }
  62. }
  63. void save(ofstream& fout, node* top)
  64. {
  65.     if (top)
  66.     {
  67.         fout.write((char*)top, sizeof(node));
  68.         save(fout, top->left);
  69.         save(fout, top->right);
  70.     }
  71. }
  72. void load(char* filename, node*& top)
  73. {
  74.     ifstream fin(filename, ios::in);
  75.     node z;
  76.     top = NULL;
  77.     while (fin.read((char*)& z, sizeof(node)))
  78.         top = add(top, z.data);
  79.     cout << "Данные загружены" << endl;
  80. }
  81. node* del(node* top)
  82. {
  83.     if (top)
  84.     {
  85.         if (top->left)
  86.             del(top->left);
  87.         if (top->right)
  88.             del(top->right);
  89.         top = NULL;
  90.     }
  91.     return top;
  92. }
  93. void exit(node* top)
  94. {
  95.     if (top)
  96.     {
  97.         exit(top->left);
  98.         exit(top->right);
  99.         delete(top);
  100.     }
  101. }
  102. int node_count(node* top, int& n)
  103. {
  104.     if (top)
  105.     {
  106.         if ((top->right == NULL) && (top->left != NULL))
  107.         {
  108.             n++;
  109.             node_count(top->left, n);
  110.         }
  111.         else
  112.         {
  113.             node_count(top->left, n);
  114.             node_count(top->right, n);
  115.         }
  116.     }
  117.     return n;
  118. }
  119.  
  120. int main()
  121. {
  122.     setlocale(LC_ALL, "rus");
  123.     node* top = 0;
  124.     char key, c;
  125.     char fbin[] = "P6(5).txt";
  126.     int a, num;
  127.     a = 0;
  128.     while (1)
  129.     {
  130.         num = 1;
  131.         while (1)
  132.         {
  133.  
  134.             while (a != 13) {
  135.                 if ((a == 72) && (num != 1))
  136.                     num--;
  137.                 if ((a == 80) && (num != 9))
  138.                     num++;
  139.  
  140.                 if (num == 1)
  141.                 {
  142.                     system("cls");
  143.                     cout << "=>Создать дерево" << endl
  144.                         << "  Вывести таблицу" << endl
  145.                         << "  Вывести дерево" << endl
  146.                         << "  Добавить элемент" << endl
  147.                         << "  Сохранить в файл" << endl
  148.                         << "  Загрузить из файла" << endl
  149.                         << "  Удалить данные" << endl
  150.                         << "  Подсчитать вершины с единственным потомком" << endl
  151.                         << "  Выход" << endl;
  152.                 }
  153.  
  154.                 if (num == 2)
  155.                 {
  156.                     system("cls");
  157.                     cout << "  Создать дерево" << endl
  158.                         << "=>Вывести таблицу" << endl
  159.                         << "  Вывести дерево" << endl
  160.                         << "  Добавить элемент" << endl
  161.                         << "  Сохранить в файл" << endl
  162.                         << "  Загрузить из файла" << endl
  163.                         << "  Удалить данные" << endl
  164.                         << "  Подсчитать вершины с единственным потомком" << endl
  165.                         << "  Выход" << endl;
  166.                 }
  167.                 if (num == 3)
  168.                 {
  169.                     system("cls");
  170.                     cout << "  Создать дерево" << endl
  171.                         << "  Вывести таблицу" << endl
  172.                         << "=>Вывести дерево" << endl
  173.                         << "  Добавить элемент" << endl
  174.                         << "  Сохранить в файл" << endl
  175.                         << "  Загрузить из файла" << endl
  176.                         << "  Удалить данные" << endl
  177.                         << "  Подсчитать вершины с единственным потомком" << endl
  178.                         << "  Выход" << endl;
  179.                 }
  180.                 if (num == 4)
  181.                 {
  182.                     system("cls");
  183.                     cout << "  Создать дерево" << endl
  184.                         << "  Вывести таблицу" << endl
  185.                         << "  Вывести дерево" << endl
  186.                         << "=>Добавить элемент" << endl
  187.                         << "  Сохранить в файл" << endl
  188.                         << "  Загрузить из файла" << endl
  189.                         << "  Удалить данные" << endl
  190.                         << "  Подсчитать вершины с единственным потомком" << endl
  191.                         << "  Выход" << endl;
  192.                 }
  193.                 if (num == 5)
  194.                 {
  195.                     system("cls");
  196.                     cout << "  Создать дерево" << endl
  197.                         << "  Вывести таблицу" << endl
  198.                         << "  Вывести дерево" << endl
  199.                         << "  Добавить элемент" << endl
  200.                         << "=>Сохранить в файл" << endl
  201.                         << "  Загрузить из файла" << endl
  202.                         << "  Удалить данные" << endl
  203.                         << "  Подсчитать вершины с единственным потомком" << endl
  204.                         << "  Выход" << endl;
  205.                 }
  206.                 if (num == 6)
  207.                 {
  208.                     system("cls");
  209.                     cout << "  Создать дерево" << endl
  210.                         << "  Вывести таблицу" << endl
  211.                         << "  Вывести дерево" << endl
  212.                         << "  Добавить элемент" << endl
  213.                         << "  Сохранить в файл" << endl
  214.                         << "=>Загрузить из файла" << endl
  215.                         << "  Удалить данные" << endl
  216.                         << "  Подсчитать вершины с единственным потомком" << endl
  217.                         << "  Выход" << endl;
  218.                 }
  219.                 if (num == 7)
  220.                 {
  221.                     system("cls");
  222.                     cout << "  Создать дерево" << endl
  223.                         << "  Вывести таблицу" << endl
  224.                         << "  Вывести дерево" << endl
  225.                         << "  Добавить элемент" << endl
  226.                         << "  Сохранить в файл" << endl
  227.                         << "  Загрузить из файла" << endl
  228.                         << "=>Удалить данные" << endl
  229.                         << "  Подсчитать вершины с единственным потомком" << endl
  230.                         << "  Выход" << endl;
  231.                 }
  232.                 if (num == 8)
  233.                 {
  234.                     system("cls");
  235.                     cout << "  Создать дерево" << endl
  236.                         << "  Вывести таблицу" << endl
  237.                         << "  Вывести дерево" << endl
  238.                         << "  Добавить элемент" << endl
  239.                         << "  Сохранить в файл" << endl
  240.                         << "  Загрузить из файла" << endl
  241.                         << "  Удалить данные" << endl
  242.                         << "=>Подсчитать вершины с единственным потомком" << endl
  243.                         << "  Выход" << endl;
  244.                 }
  245.                 if (num == 9)
  246.                 {
  247.                     system("cls");
  248.                     cout << "  Создать дерево" << endl
  249.                         << "  Вывести таблицу" << endl
  250.                         << "  Вывести дерево" << endl
  251.                         << "  Добавить элемент" << endl
  252.                         << "  Сохранить в файл" << endl
  253.                         << "  Загрузить из файла" << endl
  254.                         << "  Удалить данные" << endl
  255.                         << "  Подсчитать вершины с единственным потомком" << endl
  256.                         << "=>Выход" << endl;
  257.                 }
  258.  
  259.  
  260.  
  261.                 int enter = _getch();
  262.                 if (enter == 13)
  263.                     a = enter;
  264.                 else
  265.                     a = _getch();
  266.  
  267.             }
  268.  
  269.             switch (num)
  270.             {
  271.             case 1:
  272.                 while (1)
  273.                 {
  274.                     cout << endl << "Для продолжения нажмите Enter, для выхода введите '*'" << endl;
  275.                     _getch();
  276.                     c = _getch();
  277.                     if (c != '*')
  278.                         top = add(top, input());
  279.                     else
  280.                         break;
  281.                 }
  282.                 break;
  283.             case 2:
  284.                 cout << setw(15) << "Фамилия" << setw(8) << "Физика" << setw(9) << "История" << setw(12) << "Математика" << endl;
  285.                 viewtable(top);
  286.                 system("pause");
  287.                 break;
  288.             case 3:
  289.                 viewtree(top, 3);
  290.                 system("pause");
  291.                 break;
  292.             case 4: top = add(top, input()); break;
  293.             case 5:
  294.             {
  295.                 ofstream fout(fbin);
  296.                 save(fout, top);
  297.                 cout << "Данные сохранены" << endl;
  298.                 system("pause");
  299.                 break;
  300.             }
  301.             case 6:
  302.                 load(fbin, top);
  303.                 system("pause");
  304.                 break;
  305.             case 7:
  306.                 top = del(top);
  307.                 cout << "Данные удалены" << endl;
  308.                 system("pause");
  309.                 break;
  310.             case 8:
  311.             {
  312.                 int n = 0;
  313.                 node_count(top, n);
  314.                 cout << "Вершин с единственным потомком: " << n << endl;
  315.                 system("pause");
  316.                 break;
  317.             }
  318.             case 9: exit(top); return 0;
  319.             default: cout << "Неверный ввод"; break;
  320.             }
  321.             a = 0;
  322.         }
  323.     }
  324.     return 0;
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement