1+ #pragma once
2+
3+ #include < cassert> // assert
4+ #include < stdexcept> // out_of_range
5+ #include < string> // to_string
6+
7+ namespace itis {
8+
9+ /* *
10+ * Структура "узел".
11+ * Хранит в себе данные и указатель на следующий узел.
12+ */
13+ struct Node {
14+ char data;
15+ Node *next_; // указатель на следующий узел
16+ };
17+
18+ struct LinkedList {
19+ public:
20+ // default constructor
21+ LinkedList () = default ;
22+
23+ ~LinkedList () {
24+ // To Do ...
25+ }
26+
27+ /* *
28+ * Добавление элемента в конец списка.
29+ * Сложность операции - O(1).
30+ *
31+ * @param element - значение элемента
32+ */
33+ void PushBack (char element) {
34+ // To Do ...
35+ }
36+
37+ /* *
38+ * Вставка элемента в список по индексу.
39+ * Сложность операции вставки - O(1).
40+ * Сложность операции поиска узла - O(n).
41+ *
42+ * @param index - позиция для вставки
43+ * @param element - значение элемента
44+ *
45+ * @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
46+ */
47+ void Insert (int index, char element) {
48+ check_out_of_range (index);
49+ // To Do ...
50+ }
51+
52+ /* *
53+ * Удаление элемента списка по индексу.
54+ * Сложность операции удаления - O(1).
55+ * Сложность операции поиска узла - O(n).
56+ *
57+ * @param index - индекс удаляемого элемента
58+ * @return значение удаленного элемента
59+ *
60+ * @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
61+ */
62+ char Remove (int index) {
63+ check_out_of_range (index);
64+ // To Do ...
65+ return {};
66+ }
67+
68+ /* *
69+ * Удаление всех элементов списка. Сложность операции - O(n).
70+ */
71+ void Clear () {
72+ // To Do ...
73+ }
74+
75+ /* *
76+ * Получение элемента списка по индексу.
77+ * Сложность операции - O(n).
78+ *
79+ * @param index - индекс элемента
80+ * @return значение элемента по индексу
81+ *
82+ * @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
83+ */
84+ char Get (int index) const {
85+ check_out_of_range (index);
86+
87+ // To Do ...
88+ return {};
89+ }
90+
91+ /* *
92+ * Вычисление индекса элемента.
93+ * Сложность операции - O(n).
94+ *
95+ * @param element - значение элемента
96+ * @return индекс элемента или -1 при остутствии элемента в списке
97+ */
98+ int IndexOf (char element) const {
99+ // To Do ...
100+ return {};
101+ }
102+
103+ /* *
104+ * Проверка наличия хотя бы одного элемента в массиве.
105+ * Сложность операции - O(1).
106+ *
107+ * @return при наличии хотя бы одного элемента - true, иначе - false
108+ */
109+ bool IsEmpty () const {
110+ // To Do ...
111+ return {};
112+ }
113+
114+ int GetSize () const {
115+ return size_;
116+ }
117+
118+ int GetCapacity () const {
119+ return size_;
120+ }
121+
122+ private:
123+
124+ /* *
125+ * Поиск узла списка по значению элемента.
126+ * Сложность операции - O(n).
127+ *
128+ * Если в списке несколько элементов с одинаковым значением,
129+ * то возвращается первый встретившийся узел.
130+ *
131+ * @param element - значение элемента в узле
132+ * @return указатель на узел или nullptr - при отсутствии узла с таким значением
133+ */
134+ Node *find_node (char element) const {
135+ // To Do ...
136+ return nullptr ;
137+ }
138+
139+ /* *
140+ * Поиск узла списка по значению элемента.
141+ * Сложность операции - O(n).
142+ *
143+ * @param element - значение элемента в узле
144+ * @return указатель на узел или nullptr - при отсутствии узла с таким значением
145+ */
146+ Node *find_node (int index) const {
147+ assert (index >= 0 && index < size_);
148+
149+ // To Do ...
150+ return nullptr ;
151+ }
152+
153+ private:
154+ int size_{0 };
155+
156+ Node *head_{nullptr };
157+ Node *tail_{nullptr };
158+
159+ void check_out_of_range (int index) const ;
160+ };
161+
162+ // реализация методов
163+
164+ void LinkedList::check_out_of_range (int index) const {
165+ if (index >= size_) {
166+ throw std::out_of_range (" index is out of range: " + std::to_string (size_));
167+ }
168+ }
169+
170+ } // namespace itis
0 commit comments