Advertisement
Guest User

Untitled

a guest
Apr 26th, 2015
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.06 KB | None | 0 0
  1. // ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <cstring>
  7.  
  8. using namespace std;
  9. struct node
  10. {
  11.     char* data = new char[1024];
  12.     node* next;
  13. };
  14. node* make_linked_list(int n)
  15. {
  16.     node *beg;//указатель на первый элемент
  17.     node *p, *r;//вспомогательные указатели
  18.     beg = new(node);//выделяем память под первый элемент
  19.     cout << "Ввод " << n << " значений информационного поля:" << endl;
  20.     cin >> beg->data;//вводим значение информационного поля
  21.     beg->next = 0;//обнуляем адресное поле
  22.     p = beg;//ставим на этот элемент указатель p (последний элемент)
  23.     for (int i = 0; i < n - 1; i++)
  24.     {
  25.         r = new(node);//создаем новый элемент
  26.         cin >> r->data;
  27.         r->next = 0;
  28.         p->next = r;//связываем p и r
  29.         //ставим на r указатель p (последний элемент)
  30.         p = r;
  31.     }
  32.     return beg;//возвращаем beg как результат функции
  33. }
  34. void print_linked_list(node* beg)
  35.  
  36. {
  37.     node* p = beg;//начало списка
  38.     cout << "Однонаправленный список:" << endl;
  39.     while (p != 0)
  40.     {
  41.         cout << p->data << " ";
  42.         p = p->next;//переход к следующему элементу
  43.     }
  44.     cout << endl;
  45. }
  46. node* add_node(node* beg, int k)
  47. //добавление элемента с номером k
  48. {
  49.     node *p = beg;//встали на первый элемент
  50.     node *New = new(node);//создали новый элемент
  51.     cout << "Ввод нового элемента: "; cin >> New->data;
  52.     if (k == 0)//добавление в начало, если k=0
  53.     {
  54.         New->next = beg;
  55.         beg = New;
  56.         return beg;
  57.     }
  58.     for (int i = 0; i < k - 1 && p != 0; i++)
  59.         p = p->next;//проходим по списку до(k-1) элемента или до конца
  60.     if (p != 0)//если k-й элемент существует
  61.     {
  62.         New->next = p->next;//связываем New и k-й элемент
  63.         p->next = New;//связываем (k-1)элемент и New
  64.     }
  65.     return beg;
  66. }
  67. /*find - функция для нахождения номера добавляемого элемента*/
  68. int find(node* beg, char *s)
  69. {
  70.     node* p = beg;//начало списка
  71.     int k = 1;
  72.     while (p != 0, strcmp(p->data, s)){
  73.         p = p->next;//переход к следующему элементу
  74.         k++;
  75.     }
  76.     return k;
  77. }
  78. void delete_linked_list(node *beg)
  79. {
  80.     node* p = beg;//начало списка
  81.     node* r = p->next;
  82.     while (p != 0 && r != 0)
  83.     {
  84.         delete (p);
  85.         p = r;
  86.         r = p->next;
  87.     }
  88.     cout << endl;
  89. }
  90.  
  91.  
  92. struct dobly_node{
  93.     int key;
  94.     dobly_node *next;
  95.     dobly_node *prev;
  96. };
  97. dobly_node *make_point(int key)
  98. //создание одного элемента двунаправленного списка
  99. {
  100.     dobly_node *p = new(dobly_node);
  101.     p->next = 0; p->prev = 0;//обнуляем указатели
  102.     p->key = key;//выделение памяти под строку
  103.     return p;
  104. }
  105. dobly_node *make_dobly_list(int n)//создание двунаправленного списка
  106. {
  107.     dobly_node *p, *beg;
  108.     int a;
  109.     cin >> a;
  110.     beg = make_point(a);//создаем первый элемент
  111.     beg->next = 0;//конца списка
  112.     for (int i = 1; i<n; i++)
  113.     {
  114.         cin >> a;
  115.         p = make_point(a);//создаем один элемент
  116.         //добавление элемента в начало списка
  117.         p->next = beg;//связываем р с первым элементом
  118.         beg->prev = p;//связываем первый элемент с p
  119.         beg = p;// p становится первым элементом списка
  120.     }
  121.     beg->prev = 0;//зануление начала списка
  122.     return beg;
  123. }
  124. void print_dobly_list(dobly_node *beg)
  125. {
  126.     dobly_node *p = beg;
  127.     cout << "Двунаправленный список: ";
  128.     while (p != 0)
  129.     {
  130.         cout << p->key << " ";
  131.         p = p->next;//переход к следующему элементу  
  132.     }
  133.     cout << endl;
  134. }
  135. dobly_node *delete_even(dobly_node *beg, int n)
  136. {
  137.     dobly_node *p = beg, *r = 0, *del = 0;
  138.     while (p->next != 0){
  139.         if ((p->key % 2) == 0 && p->prev != 0){
  140.             del = p;
  141.             r = p->prev;
  142.             p = del->next;
  143.             p->prev = r;
  144.             r->next = p;
  145.             delete(del);
  146.         }
  147.         else if ((p->key % 2) == 0 && p->prev == 0){
  148.             del = p;
  149.             p = del->next;
  150.             delete(del);
  151.             p->prev = 0;
  152.             beg = p;
  153.         }
  154.         else
  155.             p = p->next;
  156.        
  157.     }
  158.     if (p->key % 2 == 0)
  159.         p = p->prev;
  160.     p->next = 0;
  161.     return beg;
  162. }
  163. void delete_dobly_list(dobly_node *beg)//удаление списка
  164. {
  165.     dobly_node *p, *r;
  166.     p = beg;
  167.     r = beg->next;
  168.     while (p != 0 && r != 0)
  169.     {
  170.         delete(p);
  171.         p = r;
  172.         r = p->next;
  173.     }
  174. }
  175.  
  176. struct leaf
  177. {
  178.     char data;//информационное поле
  179.     leaf *left;//адрес левого поддерева
  180.     leaf *right;//адрес правого поддерева
  181. };
  182. leaf* first(char d)//формирование первого элемента дерева
  183. {
  184.     leaf* p = new leaf;
  185.     p->data = d;
  186.     p->left = 0;
  187.     p->right = 0;
  188.     return p;
  189. }
  190. leaf* Tree(int n, leaf *p)//создание идеально сбалансированного дерева
  191. {
  192.     leaf *r;
  193.     char nl, nr;
  194.     if (n == 0){ p = 0; return p; }
  195.     nl = n / 2;
  196.     nr = n - nl - 1;
  197.     r = new leaf;
  198.     cin >> r->data;
  199.     r->left = Tree(nl, r->left);
  200.     r->right = Tree(nr, r->right);
  201.     p = r;
  202.     return p;
  203. }
  204. void Print_tree(leaf*p)//печать дерева
  205. {
  206.     if (p)
  207.     {
  208.         cout << p->data << ' ';
  209.         Print_tree(p->left);//переход к левому поддереву
  210.         Print_tree(p->right);//переход к правому поддереву
  211.     }
  212. }
  213. int Find_hight(leaf*p, int h)//нахождение высоты дерева
  214. {
  215.     if (p)
  216.     {
  217.         ++h;
  218.         h = Find_hight(p->left, h);//переход к левому поддереву
  219.     }
  220.     return h;
  221. }
  222. void To_binary_tree(leaf*p)//преобразование идеально сбалансированного дерева в дерево поиска
  223. {
  224.     if (p)
  225.     {
  226.         char tmp;
  227.         if (p->left && p->left->data > p->data)
  228.         {
  229.             tmp = p->data;
  230.             p->data = p->left->data;
  231.             p->left->data = tmp;
  232.         }
  233.         if (p->right && p->right->data < p->data)
  234.         {
  235.             tmp = p->data;
  236.             p->data = p->right->data;
  237.             p->right->data = tmp;
  238.         }
  239.         To_binary_tree(p->left);//переход к левому поддереву
  240.         To_binary_tree(p->right);//переход к правому поддереву 
  241.     }
  242. }
  243.  
  244.  
  245. int main()
  246. {
  247.     setlocale(LC_ALL, "rus");
  248.     cout << "Ввод начального кол-ва записей однонаправленного списка:";
  249.     int n;
  250.     cin >> n;
  251.     node *beg = make_linked_list(n);
  252.     print_linked_list(beg);
  253.     cout << "Ввод элемента после которого будет добавляться новый элемент:";
  254.     char* s = new char[1024];
  255.     cin >> s;
  256.     beg = add_node(beg, find(beg, s));
  257.     print_linked_list(beg);
  258.     delete_linked_list(beg);
  259.     cout << "Ввод начального кол-ва записей двунаправленного списка:";
  260.     cin >> n;
  261.     dobly_node *start = make_dobly_list(n);
  262.     print_dobly_list(start);
  263.     start = delete_even(start, n);
  264.     cout << "Удаление четных информационных полей..." << endl;
  265.     print_dobly_list(start);
  266.     delete_dobly_list(start);
  267.     leaf *root = new leaf;
  268.     cout << "Ввод кол-ва элементов идеально сбалансированного дерева: "; cin >> n;
  269.     cout << "Ввод " << n << " элементов дерева:" << endl;
  270.     root = Tree(n, root);
  271.     cout << "Вывод идеально сбалансированного дерева:" << endl;
  272.     Print_tree(root);
  273.     cout << "\nВысота:" << Find_hight(root, 0) << endl;
  274.     for (int i = 0; i < Find_hight(root, 0); ++i)
  275.         To_binary_tree(root);
  276.     cout << "Дерево поиска:" << endl;
  277.     Print_tree(root);
  278.     system("pause");
  279.     return 0;
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement