In the following code, I implemented the doubly linked list. I am getting the output as 56 2 3 4 0 instead of 56 2 3 4. However, if I remove lt.erase(5); lt.push_back(46); then I get the correct output. I first thought that erase() have some bugs but by individually testing every function they seem fine to me. However, in this combination, I am getting an extra 0.
#include <iostream>
using namespace std;
template <class T>
class LinkedList {
private:
T data;
LinkedList *prev, *next, *head, *tail;
public:
LinkedList() : next(nullptr), head(nullptr), tail(nullptr), prev(nullptr){}
LinkedList* get_node(T);
void push_back(T);
void insert(int, T);
void pop_bak();
void erase(int);
void print();
};
template <typename T>
LinkedList<T>* LinkedList<T>:: get_node(T element) {
auto* new_node = new LinkedList;
new_node -> data = element;
new_node -> prev = nullptr;
new_node ->next = nullptr;
return new_node;
}
template <typename T>
void LinkedList<T>:: push_back(T element) {
static LinkedList *temp;
if(head == nullptr) {
head = get_node(element);
tail = head;
temp = head;
} else {
LinkedList *node = get_node(element);
tail->next = node;
tail = node;
tail->prev = temp;
temp = temp->next;
}
}
template <typename T>
void LinkedList<T>:: insert(int position, T element) {
LinkedList *node = get_node(element);
if(position == 1){
head->prev = node;
node->next = head;
head = node;
} else {
LinkedList *start = head;
int it = 1;
while (it < position - 1) {
start = start->next;
++it;
}
node->next = start->next;
node->prev = start;
start->next = node;
}
}
template <typename T>
void LinkedList<T>:: pop_bak() {
LinkedList *temp;
temp = tail;
tail = tail->prev;
tail->next = nullptr;
delete temp;
}
template <typename T>
void LinkedList<T>:: erase(int position) {
LinkedList *temp;
if(position == 1){
temp = head;
head = head ->next;
delete temp;
} else {
LinkedList *start = head;
int it = 1;
while (it < position - 1) {
start = start->next;
++it;
}
if(start->next == tail) {
temp = tail;
tail = tail ->prev;
tail->next = nullptr;
delete temp;
} else {
temp = start -> next;
start ->next = start ->next->next;
delete temp;
}
}
}
template <typename T>
void LinkedList<T>:: print() {
LinkedList *start = head;
while(start != tail->next) {
cout << start->data << " ";
start = start->next;
}
}
int main() {
LinkedList<int> lt;
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);
lt.insert(1, 56);
lt.erase(5); // Remove this
lt.push_back(46); // And this and it works perfectly. Where is the bug?
lt.pop_bak();
lt.print();
}