Skip to content

Commit adf7c35

Browse files
committed
Add linked_list skeleton
1 parent bb25a4d commit adf7c35

File tree

4 files changed

+194
-4
lines changed

4 files changed

+194
-4
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
88
include_directories(include)
99

1010
# add executables
11-
add_executable(arrays src/arrays_list.cpp include/array_list.hpp)
11+
add_executable(array_list src/arrays_list.cpp include/array_list.hpp)
12+
add_executable(linked_list src/linked_list.cpp include/linked_list.hpp)

include/array_list.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#pragma once
22

3-
#include <string>
43
#include <algorithm> // copy
4+
#include <cassert> // assert
55
#include <stdexcept> // out_of_range
6+
#include <string> // to_string
67

78
namespace itis {
89

@@ -74,7 +75,9 @@ struct ArrayList {
7475
}
7576

7677
/**
77-
* Удаление элементов массива. Сложность операции - O(n).
78+
* Удаление всех элементов массива.
79+
* Сложность операции - O(1).
80+
*
7881
* Емкость (capacity) массива остается прежним.
7982
*/
8083
void Clear() {
@@ -106,6 +109,7 @@ struct ArrayList {
106109
*/
107110
int IndexOf(char element) const {
108111
// To Do ...
112+
return {};
109113
}
110114

111115
/**
@@ -149,7 +153,8 @@ struct ArrayList {
149153
* @param new_capacity - новая емкость массива (должна быть больше предыдущей)
150154
*/
151155
void resize(int new_capacity) {
152-
if (new_capacity <= capacity_) return;
156+
assert(new_capacity > capacity_);
157+
153158
// To Do ...
154159
}
155160

include/linked_list.hpp

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
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

src/linked_list.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "linked_list.hpp"
2+
3+
#include <iostream>
4+
5+
using namespace itis;
6+
7+
int main() {
8+
9+
auto list = LinkedList();
10+
11+
// To Do ...
12+
13+
return 0;
14+
}

0 commit comments

Comments
 (0)