Skip to content

Commit 449864e

Browse files
committed
fix: implementasi tail pointer
1 parent 4af00c5 commit 449864e

File tree

5 files changed

+87
-48
lines changed

5 files changed

+87
-48
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ enable_testing()
3131
add_executable(forward_list_test
3232
test/testing.cpp
3333
)
34+
# set_tests_properties(forward_list_test PROPERTIES TIMEOUT 5)
3435
target_link_libraries(forward_list_test
3536
PRIVATE forward_list_lib GTest::gtest_main
3637
)

build_testing.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
build(){
22
cmake -S . -B build
33
cmake --build build -j
4-
ctest --test-dir build -V
4+
ctest --test-dir build --timeout 5 -V
55
}
66
build

header/forward_list.hpp

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,15 @@ class forward_lists{
4343
*/
4444
template <typename It>
4545
requires my_input_iterator<It>
46-
forward_lists(It begin,It end): head(nullptr),size(0){
46+
forward_lists(It begin,It end){
4747
head = new Node(T{});
4848
size = 0;
4949
head->next = nullptr;
5050
tail = head;
51-
Node** curr = &tail->next; //curr menunjuk head->next
51+
Node** curr = &head->next; //curr menunjuk head->next
5252
while(begin != end){
53-
*curr = new Node(*begin); //isi node
53+
*curr = new Node(*begin); //isi node dengan deferencing begin
54+
tail = *curr;
5455
curr = &((*curr)->next); //curr = curr->next
5556
size++; //increment size
5657
++begin; //increment iterator
@@ -65,10 +66,11 @@ class forward_lists{
6566
head->next = nullptr;
6667
tail = head;
6768
size = 0;
68-
Node** curr = &tail->next; //store alamat memory head ke curr
69+
Node** curr = &head->next; //store alamat memory head ke curr
6970
for(const T& it: arr){
7071
*curr = new Node(it); //deference pointer
7172
//head = new Node(it) ->meaning
73+
tail = *curr;
7274
curr = &((*curr)->next); //store alamat curr->next
7375
//curr = head->next
7476
//curr selalu menunjuk ke posisi kosong
@@ -119,21 +121,29 @@ class forward_lists{
119121
* karena head = others.head maka head == nullptr,akan mengakibatkan
120122
* undefined behavior
121123
*/
122-
forward_lists(forward_lists&& others) noexcept : head(nullptr){
123-
head = others.head;
124+
forward_lists(forward_lists&& others) noexcept: head(new Node(T{})),tail(head),size(0){
125+
head->next = others.head->next;
126+
tail = others.tail == head ? head: others.tail; //ternery operator,if you dont understand please read documentation
124127
size = others.size;
125-
others.head = nullptr; //kosongkan others lama agar tidak memory leak
128+
129+
//kosongkan object lama
130+
others.head->next = nullptr;
131+
others.tail = others.head;
126132
others.size = 0;
127133
}
128134
/**
129135
* @brief move assignment constructor
130136
*/
131137
forward_lists& operator=(forward_lists&& others)noexcept{
132-
if(this != others){
138+
if(this != &others){
133139
clear();
134-
head = others.head;
140+
head->next = others.head->next;
141+
tail = others.tail == head ? head: others.tail; //ternery operator,if you dont understand please read documentation
135142
size = others.size;
136-
others.head = nullptr;
143+
144+
//kosongkan object lama
145+
others.head->next = nullptr;
146+
others.tail = others.head;
137147
others.size = 0;
138148
}
139149
return *this;
@@ -250,6 +260,9 @@ class forward_lists{
250260
std::size_t max_size()const noexcept{
251261
return std::numeric_limits<T>::max() / sizeof(Node);
252262
}
263+
T back()const noexcept{
264+
return this->tail->data;
265+
}
253266
public:
254267
/**
255268
* @brief method untuk insertion val pada pos front
@@ -288,15 +301,14 @@ class forward_lists{
288301
void pop_front(){
289302
if(tail == head){
290303
return;
291-
}else if(head->next == tail->next){
292-
head = tail = nullptr;
293-
size--;
294-
}else{
295-
Node* temp = head->next;
296-
Node* next = head->next;
297-
head->next = next->next;
298-
delete temp;
299304
}
305+
Node* temp = head->next;
306+
head->next = temp->next;
307+
if(temp == tail){
308+
tail = head;
309+
}
310+
delete temp;
311+
size--;
300312
}
301313
/**
302314
* @brief Menyisipkan elemen setelah posisi iterator tertentu.
@@ -551,7 +563,7 @@ class forward_lists{
551563
head = new Node(T{});
552564
head->next = nullptr;
553565
Node** curr = &head->next;
554-
size++;
566+
//size++;
555567
for(const T& value: arr){
556568
*curr = new Node(value); //curr = new Node
557569
curr = &((*curr)->next); //curr = curr->next
@@ -602,18 +614,25 @@ class forward_lists{
602614
}
603615
void splice_after(const Iterator pos,forward_lists& others){
604616
Node* src = pos.get_raw();//pos object saat ini
605-
Node* begin = others.begin(); //begin object lain
606-
Node* end = others.end();
607-
//hubungkan node terakhir ke object saat ini
608-
Node* moved = src->next; //object saat ini
609-
end->next = moved; //end->next = src->next
610-
//hubungkan ke list tujuan
611-
Node* curr = src; //curr menunjuk src
612-
curr->next = begin;//curr next adalah begin dari object lain
613-
//moved->next = begin; //object saat ini
614-
size = others.size;
617+
Node* begin = others.head->next ; //begin object lain
618+
Node* end = others.tail; //end object lain
619+
620+
//lingking node pertama others ke object saat ini
621+
Node* moved = src->next;
622+
moved->next = begin->next; //tunjuk node setelah begin
623+
624+
begin->next = moved; //linking begin ke node setelah iterator
625+
//linking node terakhir object lain ke src->next
626+
end->next = src->next;
627+
628+
//linking node pertama object saat ini ke head object lain
629+
src->next = begin;
630+
size += others.size;
615631
others.size = 0;
616632
}
633+
// void splice_after(const Iterator pos,forward_lists& others,const Iterator first,const Iterator last){
634+
// Node* curr = pos.get_raw();
635+
// }
617636
public:
618637
/**
619638
* @brief method untuk print semua node list
@@ -632,13 +651,16 @@ class forward_lists{
632651
* berguna pada destructor
633652
* @details time complexity O(n),Space Complexity O(n)
634653
*/
635-
void clear(){
636-
while(head->next != nullptr){
637-
Node* temp = head->next;
638-
head->next = head->next->next;
639-
delete temp;
640-
}
641-
size = 0;
642-
}
654+
void clear(){
655+
Node* curr = head->next; // mulai dari setelah dummy
656+
while(curr != nullptr){
657+
Node* temp = curr;
658+
curr = curr->next;
659+
delete temp;
660+
}
661+
head->next = nullptr; // dummy menunjuk ke kosong
662+
tail = head; // tail kembali ke dummy
663+
size = 0;
664+
}
643665
};
644666
#endif

implementation/implementation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ int main(){
66
forward_lists<int>flst = {1,2,3};
77
flst.pop_front();
88
flst.pop_front();
9+
std::cout << "harus nya sisa 3" << std::endl;
10+
std::cout << "ini tail " << flst.back() << std::endl;
911
flst.print_all(flst.begin(),flst.end()); //3
1012
//initializer list
1113
std::cout << "initializer list constructor" << std::endl;

test/testing.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ TEST(Basic_stl,pop_element){
1616
forward_lists<int>fl = {1,2,3,4,5};
1717
EXPECT_EQ(fl.get_size(),5);
1818
EXPECT_EQ(fl.front(), 1);
19-
fl.pop_front();
19+
fl.pop_front();
2020
std::vector<int>actual;
2121
std::vector<int>expectation = {2,3,4,5};
2222
for(auto x: fl){
@@ -68,15 +68,15 @@ TEST(Constructor_testing,basic_constructor_test){
6868
}
6969
TEST(Constructor_testing,mv_constructor){
7070
forward_lists<int>fl = {1,2,3,4};
71-
forward_lists<int>flst = std::move(fl);
7271
int size_fl = fl.get_size();
73-
int size_flst = flst.get_size();
74-
EXPECT_EQ(size_fl,size_flst);
7572
std::vector<int>exFl;
76-
std::vector<int>exFlst;
7773
for(auto x: fl){
7874
exFl.push_back(x);
7975
}
76+
forward_lists<int>flst = std::move(fl);
77+
int size_flst = flst.get_size();
78+
EXPECT_EQ(size_fl,size_flst);
79+
std::vector<int>exFlst;
8080
for(auto x: flst){
8181
exFlst.push_back(x);
8282
}
@@ -85,6 +85,7 @@ TEST(Constructor_testing,mv_constructor){
8585
TEST(Constructor_testing,mv_assgn_test){
8686
forward_lists<int>list;
8787
list = {1,2,3};
88+
int Ssize = list.get_size();
8889
forward_lists<int>cp;
8990
cp = std::move(list);
9091
std::vector<int>Slist;
@@ -95,10 +96,9 @@ TEST(Constructor_testing,mv_assgn_test){
9596
for(auto x: cp){
9697
Scp.push_back(x);
9798
}
98-
int SizeList = list.get_size();
99-
int SizeCp = cp.get_size();
100-
EXPECT_EQ(SizeList,SizeCp);
101-
EXPECT_EQ(Slist,Scp);
99+
EXPECT_EQ(list.get_size(),0);
100+
EXPECT_EQ(cp.get_size(),3);
101+
EXPECT_EQ(cp.get_size(),Ssize);
102102
}
103103
TEST(Insert_testing,push_testing){
104104
forward_lists<int>fl;
@@ -212,4 +212,18 @@ TEST(Assign_test,Assign_testIII){
212212
actual.push_back(x);
213213
}
214214
EXPECT_EQ(actual,expectations);
215-
}
215+
}
216+
// TEST(splice_test,splice_testI){
217+
// forward_lists<int>fl = {1,2,3};
218+
// forward_lists<int>list = {10,20,30};
219+
// fl.splice_after(fl.begin(),list);
220+
// std::vector<int>expectations = {1,10,20,30,2,3};
221+
// std::vector<int>actual;
222+
// for(auto x: fl){
223+
// actual.push_back(x);
224+
// }
225+
// EXPECT_EQ(fl.get_size(),6);
226+
// EXPECT_EQ(list.get_size(),0);
227+
// EXPECT_TRUE(!list.is_empty());
228+
// EXPECT_EQ(actual,expectations);
229+
// }

0 commit comments

Comments
 (0)