I'm developing a doubly linked list class that uses a Node class in C++.
I'm trying to make a remove function that deletes the desired node if it exist.
But if the value is greater than currentPrt
it just exits without doing anything, and if it is less, it deletes the node and the program gets into an endless loop of printing weird values.
Code of Node class:
// Node.h
class Node {
public:
explicit Node(int data = 0, Node *nextPtr = nullptr, Node *beforePtr = nullptr);
int getData() const;
void setData(int data);
Node *getNextPtr() const;
void setNextPtr(Node *nextPtr);
Node *getBeforePtr() const;
void setBeforePtr(Node *beforePtr);
void print() const;
private:
int data;
Node *nextPtr;
Node *beforePtr;
};
// Node.cpp
Node::Node(int data, Node *nextPtr, Node *beforePtr) : data(data), nextPtr(nextPtr), beforePtr(beforePtr) {}
int Node::getData() const {
return data;
}
void Node::setData(int data) {
Node::data = data;
}
Node *Node::getNextPtr() const {
return nextPtr;
}
void Node::setNextPtr(Node *nextPtr) {
Node::nextPtr = nextPtr;
}
Node *Node::getBeforePtr() const {
return beforePtr;
}
void Node::setBeforePtr(Node *beforePtr) {
Node::beforePtr = beforePtr;
}
void Node::print() const {
cout << getData() << endl;
}
// MyList.h
class MyList {
public:
MyList(Node *currentPrt = nullptr);
void insert(int value);
void print() const;
private:
Node *currentPrt;
};
// MyList.cpp
MyList::MyList(){
currentPrt = nullptr;
}
void MyList::insert(int value) {
if(currentPrt == nullptr){
currentPrt = new Node;
currentPrt->setData(value);
currentPrt->setNextPtr(nullptr);
currentPrt->setBeforePtr(nullptr);
}
else{
if(value > currentPrt->getData()){
while (currentPrt->getNextPtr() != nullptr && currentPrt->getNextPtr()->getData() < value){
currentPrt = currentPrt->getNextPtr();
}
Node *newPtr = new Node(value);
newPtr->setNextPtr(currentPrt->getNextPtr());
if (currentPrt->getNextPtr() != nullptr) // <---
currentPrt->getNextPtr()->setBeforePtr(newPtr); // <---
currentPrt->setNextPtr(newPtr);
newPtr->setBeforePtr(currentPrt);
}
else{
while (currentPrt->getBeforePtr() != nullptr && currentPrt->getBeforePtr()->getData() > value){
currentPrt = currentPrt->getBeforePtr();
}
Node *newPtr = new Node(value);
if (currentPrt->getBeforePtr() != nullptr){
currentPrt = currentPrt->getBeforePtr();
newPtr->setNextPtr(currentPrt->getNextPtr());
currentPrt->getNextPtr()->setBeforePtr(newPtr); // <---
currentPrt->setNextPtr(newPtr);
newPtr->setBeforePtr(currentPrt);
}
else{
currentPrt->setBeforePtr(newPtr);
newPtr->setNextPtr(currentPrt);
}
}
}
}
void MyList::remove(int value) {
if (currentPrt != nullptr){
if(value > currentPrt->getData()){
while (currentPrt->getNextPtr() != nullptr && currentPrt->getBeforePtr()->getData() > value){
currentPrt = currentPrt->getNextPtr();
}
if (currentPrt->getNextPtr()->getData() == value){
delete currentPrt->getNextPtr();
}
}
else{
while (currentPrt->getBeforePtr() != nullptr && currentPrt->getBeforePtr()->getData() > value){
currentPrt = currentPrt->getBeforePtr();
}
if (currentPrt->getBeforePtr()->getData() == value){
delete currentPrt->getBeforePtr();
}
}
}
}
void MyList::print() const {
Node *ptr;
ptr = currentPrt;
while(ptr->getNextPtr() != nullptr){
ptr = ptr->getNextPtr();
}
for (ptr; ptr != nullptr; ptr = ptr->getBeforePtr()){
cout << ptr->getData() << endl;
}
}
Main:
MyList test;
test.insert(5);
test.insert(3);
test.insert(7);
test.insert(6);
test.printAscending();
std::cout<<endl;
test.remove(7); // doesn't work but doesn't cause infinit print
test.remove(5); // doesn't work but doesn't cause infinit print
test.remove(6); // causes infinit prints
test.remove(3); // causes infinit prints
test.printAscending();
Ouput of only remove(5), remove(7):
3
5
6
7
3
5
6
7
if I put remove(6)
, (or 3), it gets into and endless print of numbers like this:
2109940880
2109365888
2109348064
2109342032
What is wrong with my remove
implementation?