Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Файл My_list.h
- #pragma once
- using std::cout; using std::endl;
- template<typename Item>
- class My_list
- {
- struct Node//Структура для узла списка.
- {
- Item item; //Содержимое узла.
- Node* next = nullptr;//Указатель на следующий узел.
- Node(const Item & it) { item = it; }
- ~Node() {/* cout << "Node deleted.\n";*/ }
- };
- Node* front = nullptr;//Указатель на голову списка.
- public:
- My_list() { cout << "Empty My_list created.\n"; }//Создание пустого списка
- ~My_list();
- void insert(const Item & it);//Добавить элемент в список со стороны головы.
- void show()const;//Вывести все эл-ты в консоль.
- void reverse();//Изменение порядка элементов на обратный.
- };
- //Деструктор последовательно освобождает память, выделенную для всех узлов.
- template<typename Item>
- inline My_list<Item>::~My_list()
- {
- if (front != nullptr)
- {
- while (front->next != nullptr)
- {
- Node* temp = front;
- front = front->next;
- delete temp;
- }
- delete front;
- }
- cout << "My list deleted.\n";
- }
- //Добавить элемент в список со стороны головы.
- template<typename Item>
- inline void My_list<Item>::insert(const Item & it)
- {
- Node* temp = new Node(it);
- temp->next = front;
- front = temp;
- }
- //Вывести все эл-ты в консоль.
- template<typename Item>
- inline void My_list<Item>::show() const
- {
- if (front != nullptr)
- {
- Node* temp = front;
- while (temp->next != nullptr)
- {
- cout << temp->item << ' ';
- temp = temp->next;
- }
- cout << temp->item << endl;
- }
- else
- {
- cout << "The list is empty!\n";
- }
- }
- //Изменение порядка элементов на обратный.
- template<typename Item>
- inline void My_list<Item>::reverse()
- {
- if (front != nullptr)//Если список не пустой.
- {
- if (front->next != nullptr)//Размер больше 1;
- {
- Node* old_front = front;//Указатель на голову при прямом порядке списка ("старая голова"). По окончанию реверса станет последним эл-том.
- Node* current = old_front->next;//Указатель на эл-т, следующий за старой головой. Этот эл-т будет "перемещаться".
- while (current != nullptr)//Пока не достигнут конец списка.
- {
- old_front->next = current->next;//Старая голова теперь связана с эл-том за текущим, который теперь можно перемещать.
- current->next = front;//Текущий связывается с новой головой,
- front = current;//и сам становится ею.
- current = old_front->next;//Текущим становится эл-т, стоявший ранее следующим в списке.
- }
- }
- else
- {
- cout << "List size is 1.\n";
- return;
- }
- }
- else
- {
- cout << "The list is empty!\n";
- }
- }
- //Файл List reverse.cpp
- #include <iostream>
- #include <forward_list>
- #include <ctime>
- #include "My_list.h"
- using std::cin;
- int main()
- {
- My_list<int> li;
- //Заполняем для демонстрации.
- for (size_t i = 0; i < 11; i++)
- {
- li.insert(i);
- }
- li.show();
- li.reverse();//Разворачиваем.
- li.show();
- My_list<int> li2;
- std::forward_list<int> f_list;//Стандартный односвязный список для сравнения.
- cout << "Enter list size: ";
- int size;
- while (!(cin >> size))
- {
- cout << "Only digits!\n";
- cin.clear();
- cin.ignore(1000, '\n');
- }
- //Заполняем оба списка.
- clock_t fill_start = clock();
- for (size_t i = 0; i < size; i++)
- {
- li2.insert(i);
- f_list.emplace_front(i);
- }
- clock_t fill_end = clock();
- cout<<"Filling lists time is "<< (double)(fill_end - fill_start) / CLOCKS_PER_SEC << " seconds.\n";
- //Разворачиваем наш список и замеряем время, на это потраченное.
- clock_t my_start = clock();
- li2.reverse();
- clock_t my_end = clock();
- cout << "My_list reversing time is " << (double)(my_end - my_start) / CLOCKS_PER_SEC << " seconds.\n";
- ////Аналогично для стандартного списка.
- clock_t std_start = clock();
- f_list.reverse();
- clock_t std_end = clock();
- cout << "Std forward_list reversing time is " << (double)(std_end - std_start) / CLOCKS_PER_SEC << " seconds.\n";
- return 0;
- }
- 16.01.2019
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement