Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.11 KB | None | 0 0
  1. #include<string>
  2. #include<iostream>
  3.  
  4. int start_word = 0;
  5.  
  6. struct Element {
  7.     std::string word;
  8.     int index;
  9.  
  10.     Element* next;
  11.     Element* prev;
  12.     Element() {
  13.         word = "";
  14.         index = 0;
  15.         next = NULL;
  16.         prev = NULL;
  17.     }
  18. };
  19.  
  20. typedef Element* ElementPtr;
  21.  
  22. class List {
  23.     int size;
  24.     ElementPtr head;
  25.     ElementPtr tail;
  26.  
  27. public:
  28.     List();
  29.     ~List();
  30.  
  31.     void push_back(ElementPtr arg1);
  32.     void insert_data();
  33.  
  34.     void insert_element(ElementPtr&, ElementPtr);
  35.     void delete_element(ElementPtr arg);
  36.  
  37.     ElementPtr jump_left(ElementPtr arg, int steps);
  38.     ElementPtr jump_right(ElementPtr arg, int steps);
  39.  
  40.  
  41.     void set_size(int size);
  42.     bool isEmpty();
  43.  
  44.     ElementPtr change_position(ElementPtr curr_el, int index);
  45.     ElementPtr change_position_with_delete(ElementPtr curr_el, int index);
  46.     int count_new_index(int index);
  47.     void create_statement();
  48.  
  49.  
  50.     void display_list(); // POMOC
  51.  
  52. };
  53. List::List() {
  54.     head = NULL;
  55.     tail = NULL;
  56.     size = 0;
  57. }
  58.  
  59. List::~List() {
  60. }
  61.  
  62. void List::set_size(int size) {
  63.     this->size = size;
  64. }
  65. void List::display_list() {
  66.     ElementPtr currPtr = head;
  67.  
  68.     for (int i = 0; i < size; ++i) {
  69.         std::cout << "(" << i << ")   " << "[ " << currPtr->word << ", " << currPtr->index << " ] " << std::endl;
  70.         currPtr = currPtr->next;
  71.     }
  72. }
  73.  
  74. bool List::isEmpty() {
  75.     return head == NULL;
  76. }
  77.  
  78. void List::push_back(ElementPtr arg) {
  79.  
  80.     if (isEmpty()) {
  81.         head = arg;
  82.         tail = arg;
  83.  
  84.         head->prev = tail;
  85.         head->next = tail;
  86.         tail->next = head;
  87.         tail->prev = head;
  88.  
  89.     }
  90.     else {
  91.         tail->next = arg;
  92.         arg->prev = tail;
  93.         tail = arg;
  94.         head->prev = tail;
  95.         tail->next = head;
  96.     }
  97. }
  98.  
  99. void List::insert_element(ElementPtr& curr_el, ElementPtr new_el) {
  100.  
  101.     new_el->prev = curr_el->prev;
  102.     curr_el->prev->next = new_el;
  103.     curr_el->prev = new_el;
  104.     new_el->next = curr_el;
  105.  
  106.     ++size;
  107.  
  108. }
  109.  
  110. void List::delete_element(ElementPtr arg) {
  111.     if (size == 1)
  112.     {
  113.         size--;
  114.         delete head;
  115.         head = tail = NULL;
  116.         return;
  117.     }
  118.     //if (head == tail) {
  119.     //  //delete head;
  120.     //  --size;
  121.     //  head = tail = NULL;
  122.     //  return;
  123.     //}
  124.  
  125.     --size;
  126.  
  127.     arg->prev->next = arg->next;
  128.     arg->next->prev = arg->prev;
  129.  
  130.     if (arg == tail)
  131.         tail = arg->prev;
  132.     if (arg == head)
  133.         head = arg->next;
  134.     delete arg; // dlaczego to bylo zakomentowane ? ~HSO
  135.  
  136. }
  137.  
  138. ElementPtr List::jump_left(ElementPtr arg, int steps) {
  139.  
  140.     for (int i = steps * (-1); i > 0; --i) {
  141.         arg = arg->prev;
  142.     }
  143.  
  144.     return arg;
  145. }
  146.  
  147. ElementPtr List::jump_right(ElementPtr arg, int steps) {
  148.  
  149.     for (int i = 0; i < steps; ++i) {
  150.         arg = arg->next;
  151.     }
  152.  
  153.     return arg;
  154. }
  155.  
  156. ElementPtr get_data_element() {
  157.     ElementPtr tmp = new Element;
  158.     std::cin >> tmp->word >> tmp->index;
  159.     return tmp;
  160. }
  161.  
  162. void List::insert_data() {
  163.     int n;
  164.     ElementPtr el1 = NULL;
  165.  
  166.     std::cin >> n >> start_word;
  167.     size = n;
  168.  
  169.     for (int i = 0; i < n; ++i) {
  170.         el1 = new Element;
  171.         std::cin >> el1->word >> el1->index;
  172.         push_back(el1);
  173.     }
  174.  
  175.     std::cin >> n;
  176. }
  177.  
  178.  
  179. int List::count_new_index(int index) {
  180.     if (size > 0)
  181.         index = index % size;
  182.     else
  183.         return 0; // w przypadku gdy ostatni element jest wyswietlany -> size ==0 nie mamy gdzie przejsc - skonczylismy wyswietlac HSO
  184.     // TO DO TEST 9 & 10 (chyba xD)
  185.     // check if index > 0.5*size
  186.     // if so index = size-abs(index)
  187.     // negate index if it was previously > 0
  188.     // do not negate if it was previously < 0 (will be negated by default)
  189.     return index;
  190. }
  191.  
  192. ElementPtr List::change_position_with_delete(ElementPtr curr_el, int index) {
  193.     if (index == 0) return curr_el;
  194.     int opposite_index = 0;
  195.  
  196.     if (index > 0) {
  197.         curr_el = jump_right(curr_el, 1); // przesun w prawo o jeden
  198.         delete_element(curr_el->prev); // usun poprzedni
  199.         opposite_index = count_new_index(index - 1); // przesun w prawo o index -1
  200.     }
  201.     if (index < 0) {
  202.         curr_el = jump_left(curr_el, -1); // przesun w lewo o jeden
  203.         delete_element(curr_el->next); // usun nastepny
  204.         opposite_index = count_new_index(index + 1); // przesun w lewo o index + 1
  205.     }
  206.  
  207.  
  208.     if (opposite_index < 0)
  209.         return jump_left(curr_el, opposite_index);
  210.     if (opposite_index > 0)
  211.         return jump_right(curr_el, opposite_index);
  212.  
  213.     return curr_el; // zwroc NOWY!! element
  214.  
  215. }
  216.  
  217. ElementPtr List::change_position(ElementPtr curr_el, int index) {
  218.     int opposite_index = count_new_index(index);
  219.     if (opposite_index < 0)
  220.         curr_el = jump_left(curr_el, opposite_index);
  221.  
  222.     if (opposite_index > 0)
  223.         curr_el = jump_right(curr_el, opposite_index);
  224.  
  225.     return curr_el;
  226.  
  227. }
  228.  
  229. void List::create_statement() {
  230.  
  231.     ElementPtr curr_el = NULL;
  232.     ElementPtr new_el = NULL;
  233.     curr_el = head;
  234.     new_el = curr_el;
  235.  
  236.     int new_index = 0;
  237.     curr_el = change_position(curr_el, start_word);
  238.  
  239.     while (size > 0) {
  240.  
  241.  
  242.         if (curr_el->index == 0) {
  243.  
  244.             new_el = get_data_element();
  245.             insert_element(curr_el, new_el);
  246.  
  247.             std::cin >> curr_el->index;
  248.             curr_el = change_position(curr_el, curr_el->index);
  249.  
  250.         }
  251.         if (curr_el->index != 0) {
  252.             std::cout << "o." << curr_el->word << " " << std::endl;
  253.             curr_el = change_position_with_delete(curr_el, curr_el->index);
  254.         }
  255.     }
  256.  
  257. }
  258.  
  259.  
  260. int main() {
  261.     //std::ios_base::sync_with_stdio(false);
  262.  
  263.     List list1;
  264.     list1.insert_data();
  265.  
  266.     list1.create_statement();
  267.  
  268.  
  269.     return 0;
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement