Skip to content

Commit 5001dda

Browse files
committed
refactor trees and lists examples
1 parent fce048f commit 5001dda

25 files changed

Lines changed: 1222 additions & 1074 deletions

src/4_Lists/clone_complex_list.cpp

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ComplexList : public List {
6868
// Create the new head.
6969
head = std::unique_ptr<List::Node>(static_cast<List::Node *>(
7070
new Node(static_cast<const Node *>(other.head.get())->data)));
71+
count = 1;
7172
nodeMap[static_cast<const Node *>(other.head.get())] =
7273
static_cast<Node *>(head.get());
7374

@@ -80,6 +81,7 @@ class ComplexList : public List {
8081
currentNew = static_cast<Node *>(currentNew->next.get());
8182
currentOld = static_cast<const Node *>(currentOld->next.get());
8283
nodeMap[currentOld] = currentNew;
84+
++count;
8385
}
8486

8587
// Set sibling pointers.
@@ -94,6 +96,17 @@ class ComplexList : public List {
9496
}
9597
}
9698

99+
ComplexList &operator=(const ComplexList &other) {
100+
if (this == &other)
101+
return *this;
102+
ComplexList temp(other);
103+
swap(temp);
104+
return *this;
105+
}
106+
107+
ComplexList(ComplexList &&other) noexcept = default;
108+
ComplexList &operator=(ComplexList &&other) noexcept = default;
109+
97110
// Append a new node with the given value.
98111
// Returns a pointer to the new node (of our Node type).
99112
Node *append(int value) {
@@ -108,6 +121,7 @@ class ComplexList : public List {
108121
curr = static_cast<Node *>(curr->next.get());
109122
curr->next = std::move(newNode);
110123
}
124+
++count;
111125
return newNodePtr;
112126
}
113127

@@ -144,82 +158,71 @@ class ComplexList : public List {
144158
}
145159
};
146160

147-
namespace {
148-
struct TestRunner {
161+
int main() {
149162
int total = 0;
150163
int failed = 0;
151164

152-
void expectTrue(bool condition, const std::string &label) {
165+
auto expectTrue = [&](bool condition, const std::string &label) {
153166
++total;
154167
if (condition) {
155168
std::cout << "[PASS] " << label << "\n";
156169
return;
157170
}
158171
++failed;
159172
std::cout << "[FAIL] " << label << " expected=true got=false\n";
160-
}
173+
};
161174

162-
void summary() const {
175+
auto summary = [&]() {
163176
std::cout << "Tests: " << total - failed << " passed, " << failed
164177
<< " failed, " << total << " total\n";
165-
}
166-
};
167-
} // namespace
168-
169-
// ----- Test Cases -----
178+
};
170179

171-
void test1(TestRunner &runner) {
172-
ComplexList list;
173-
auto node1 = list.append(1);
174-
auto node2 = list.append(2);
175-
auto node3 = list.append(3);
176-
auto node4 = list.append(4);
177-
auto node5 = list.append(5);
180+
{
181+
ComplexList list;
182+
auto node1 = list.append(1);
183+
auto node2 = list.append(2);
184+
auto node3 = list.append(3);
185+
list.append(4);
186+
auto node5 = list.append(5);
178187

179-
list.setSibling(node1, node3);
180-
list.setSibling(node2, node5);
181-
list.setSibling(node5, node2);
188+
list.setSibling(node1, node3);
189+
list.setSibling(node2, node5);
190+
list.setSibling(node5, node2);
182191

183-
ComplexList copy(list);
184-
runner.expectTrue(list == copy, "clone test1");
185-
}
192+
ComplexList copy(list);
193+
expectTrue(list == copy, "clone test1");
194+
}
186195

187-
void test2(TestRunner &runner) {
188-
ComplexList list;
189-
auto node1 = list.append(1);
190-
auto node2 = list.append(2);
191-
auto node3 = list.append(3);
192-
auto node4 = list.append(4);
193-
auto node5 = list.append(5);
194-
195-
list.setSibling(node1, node2);
196-
list.setSibling(node2, node3);
197-
list.setSibling(node5, node4);
198-
list.setSibling(node4, node1);
199-
200-
ComplexList copy(list);
201-
runner.expectTrue(list == copy, "clone test2");
202-
}
196+
{
197+
ComplexList list;
198+
auto node1 = list.append(1);
199+
auto node2 = list.append(2);
200+
auto node3 = list.append(3);
201+
auto node4 = list.append(4);
202+
auto node5 = list.append(5);
203+
204+
list.setSibling(node1, node2);
205+
list.setSibling(node2, node3);
206+
list.setSibling(node5, node4);
207+
list.setSibling(node4, node1);
208+
209+
ComplexList copy(list);
210+
expectTrue(list == copy, "clone test2");
211+
}
203212

204-
void test3(TestRunner &runner) {
205-
ComplexList list;
206-
auto node1 = list.append(1);
207-
ComplexList copy(list);
208-
runner.expectTrue(list == copy, "clone test3");
209-
}
213+
{
214+
ComplexList list;
215+
list.append(1);
216+
ComplexList copy(list);
217+
expectTrue(list == copy, "clone test3");
218+
}
210219

211-
void test4(TestRunner &runner) {
212-
ComplexList list;
213-
ComplexList copy(list);
214-
runner.expectTrue(list == copy, "clone test4");
215-
}
220+
{
221+
ComplexList list;
222+
ComplexList copy(list);
223+
expectTrue(list == copy, "clone test4");
224+
}
216225

217-
int main() {
218-
TestRunner runner;
219-
test1(runner);
220-
test2(runner);
221-
test3(runner);
222-
test4(runner);
223-
runner.summary();
226+
summary();
224227
return 0;
225228
}

src/4_Lists/delete_duplicates.cpp

Lines changed: 84 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ class UniqueList : public List {
5555
// update head.
5656
head = std::move(current->next);
5757
current = head.get();
58+
--count;
5859
} else {
5960
previous->next = std::move(current->next);
6061
current = previous->next.get();
62+
--count;
6163
}
6264
} else {
6365
// First occurrence: mark as visited and move forward.
@@ -69,13 +71,26 @@ class UniqueList : public List {
6971
}
7072
};
7173

72-
namespace {
73-
struct TestRunner {
74+
int main() {
7475
int total = 0;
7576
int failed = 0;
7677

77-
void expectEqual(const List &got, const List &expected,
78-
const std::string &label) {
78+
auto listToString = [](const List &list) {
79+
std::ostringstream oss;
80+
oss << "{";
81+
bool first = true;
82+
for (int value : list) {
83+
if (!first)
84+
oss << ", ";
85+
oss << value;
86+
first = false;
87+
}
88+
oss << "}";
89+
return oss.str();
90+
};
91+
92+
auto expectEqual = [&](const List &got, const List &expected,
93+
const std::string &label) {
7994
++total;
8095
if (got == expected) {
8196
std::cout << "[PASS] " << label << "\n";
@@ -84,106 +99,83 @@ struct TestRunner {
8499
++failed;
85100
std::cout << "[FAIL] " << label << " expected=" << listToString(expected)
86101
<< " got=" << listToString(got) << "\n";
87-
}
102+
};
88103

89-
void summary() const {
104+
auto summary = [&]() {
90105
std::cout << "Tests: " << total - failed << " passed, " << failed
91106
<< " failed, " << total << " total\n";
107+
};
108+
109+
{
110+
UniqueList duplicateList;
111+
duplicateList.append(1);
112+
duplicateList.append(2);
113+
duplicateList.append(3);
114+
duplicateList.append(4);
115+
duplicateList.append(4);
116+
duplicateList.append(5);
117+
118+
UniqueList uniqueList;
119+
uniqueList.append(1);
120+
uniqueList.append(2);
121+
uniqueList.append(3);
122+
uniqueList.append(4);
123+
uniqueList.append(5);
124+
125+
duplicateList.deleteDuplication();
126+
expectEqual(duplicateList, uniqueList, "delete duplicates #1");
92127
}
93128

94-
private:
95-
static std::string listToString(const List &list) {
96-
std::ostringstream oss;
97-
oss << "{";
98-
for (unsigned int i = 0; i < list.size(); ++i) {
99-
if (i > 0)
100-
oss << ", ";
101-
oss << list.get(i);
102-
}
103-
oss << "}";
104-
return oss.str();
129+
{
130+
UniqueList duplicateList;
131+
duplicateList.append(1);
132+
duplicateList.append(2);
133+
duplicateList.append(3);
134+
duplicateList.append(4);
135+
duplicateList.append(5);
136+
137+
UniqueList uniqueList;
138+
uniqueList.append(1);
139+
uniqueList.append(2);
140+
uniqueList.append(3);
141+
uniqueList.append(4);
142+
uniqueList.append(5);
143+
144+
duplicateList.deleteDuplication();
145+
expectEqual(duplicateList, uniqueList, "delete duplicates #2");
105146
}
106-
};
107-
} // namespace
108-
109-
// ------------------- Test Cases -------------------
110-
111-
void test1(TestRunner &runner) {
112-
UniqueList duplicateList;
113-
duplicateList.append(1);
114-
duplicateList.append(2);
115-
duplicateList.append(3);
116-
duplicateList.append(4);
117-
duplicateList.append(4);
118-
duplicateList.append(5);
119-
120-
UniqueList uniqueList;
121-
uniqueList.append(1);
122-
uniqueList.append(2);
123-
uniqueList.append(3);
124-
uniqueList.append(4);
125-
uniqueList.append(5);
126-
127-
duplicateList.deleteDuplication();
128-
runner.expectEqual(duplicateList, uniqueList, "delete duplicates #1");
129-
}
130-
131-
void test2(TestRunner &runner) {
132-
UniqueList duplicateList;
133-
duplicateList.append(1);
134-
duplicateList.append(2);
135-
duplicateList.append(3);
136-
duplicateList.append(4);
137-
duplicateList.append(5);
138-
139-
UniqueList uniqueList;
140-
uniqueList.append(1);
141-
uniqueList.append(2);
142-
uniqueList.append(3);
143-
uniqueList.append(4);
144-
uniqueList.append(5);
145-
146-
duplicateList.deleteDuplication();
147-
runner.expectEqual(duplicateList, uniqueList, "delete duplicates #2");
148-
}
149147

150-
void test3(TestRunner &runner) {
151-
UniqueList duplicateList;
152-
duplicateList.append(1);
153-
duplicateList.append(1);
154-
duplicateList.append(1);
155-
duplicateList.append(1);
156-
duplicateList.append(2);
148+
{
149+
UniqueList duplicateList;
150+
duplicateList.append(1);
151+
duplicateList.append(1);
152+
duplicateList.append(1);
153+
duplicateList.append(1);
154+
duplicateList.append(2);
157155

158-
UniqueList uniqueList;
159-
uniqueList.append(1);
160-
uniqueList.append(2);
156+
UniqueList uniqueList;
157+
uniqueList.append(1);
158+
uniqueList.append(2);
161159

162-
duplicateList.deleteDuplication();
163-
runner.expectEqual(duplicateList, uniqueList, "delete duplicates #3");
164-
}
160+
duplicateList.deleteDuplication();
161+
expectEqual(duplicateList, uniqueList, "delete duplicates #3");
162+
}
165163

166-
void test4(TestRunner &runner) {
167-
UniqueList duplicateList;
168-
duplicateList.append(1);
169-
duplicateList.append(1);
170-
duplicateList.append(1);
171-
duplicateList.append(1);
172-
duplicateList.append(1);
164+
{
165+
UniqueList duplicateList;
166+
duplicateList.append(1);
167+
duplicateList.append(1);
168+
duplicateList.append(1);
169+
duplicateList.append(1);
170+
duplicateList.append(1);
173171

174-
UniqueList uniqueList;
175-
uniqueList.append(1);
172+
UniqueList uniqueList;
173+
uniqueList.append(1);
176174

177-
duplicateList.deleteDuplication();
178-
runner.expectEqual(duplicateList, uniqueList, "delete duplicates #4");
179-
}
175+
duplicateList.deleteDuplication();
176+
expectEqual(duplicateList, uniqueList, "delete duplicates #4");
177+
}
180178

181-
int main() {
182-
TestRunner runner;
183-
test1(runner);
184-
test2(runner);
185-
test3(runner);
186-
test4(runner);
187-
runner.summary();
179+
summary();
188180
return 0;
189181
}

0 commit comments

Comments
 (0)