简体   繁体   English

双向链表 Class,节点 C++

[英]Doubly Linked List Class with Nodes C++

I'm Trying to do a doubly linked list class that calls a Node class in C++我正在尝试做一个双向链表 class,它调用 C++ 中的节点 class

The Code for the Node class works just fine and I have the code for my class that works only when trying to print the values from least to greatest but if I try to print from greatest to least it only prints some values.节点 class 的代码工作得很好,我的 class 的代码仅在尝试从最小到最大打印值时有效,但如果我尝试从最大到最小打印,它只会打印一些值。

I also need guide on how to make a remove function that works similar to insert我还需要有关如何删除 function 的指南,其工作方式类似于插入

Code of Node class:节点代码 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(Node *currentPrt) {}

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());
            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->setNextPtr(newPtr);
                newPtr->setBeforePtr(currentPrt);
            }
            else{
                currentPrt->setBeforePtr(newPtr);
                newPtr->setNextPtr(currentPrt);
            }
        }
    }




}

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;
    }

}

MyList test;

    test.insert(5);
    test.insert(3);

    test.insert(2);
    test.insert(1);
    test.insert(2);

    test.insert(7);
    test.insert(8);
    test.insert(6);
    test.print();

Output: 8 7 5 3 2 1 Output: 8 7 5 3 2 1

and when the print function is this:当打印 function 是这样的:

void MyList::print() const {
    Node *ptr;
    ptr = currentPrt;
    while(ptr->getBeforePtr() != nullptr){
        ptr = ptr->getBeforePtr();
    }
    for (ptr; ptr != nullptr; ptr = ptr->getNextPtr()){
        cout << ptr->getData() << endl;
    }

}

Output is: 1 2 2 3 5 6 7 8 as expected Output 是:1 2 2 3 5 6 7 8 如预期

Thank you for all the help谢谢你的帮助

First of all, your code has undefined behaviour because of this constructor:首先,由于此构造函数,您的代码具有未定义的行为:

MyList::MyList(Node *currentPrt) {}

This leaves the currentPrt member uninitialised.这使currentPrt成员未初始化。 It should be:它应该是:

MyList::MyList(Node *currentPrt) : currentPrt(currentPrt) {}

The problem you have with the list order is caused by the insert method.列表顺序的问题是由insert方法引起的。 There are two code blocks there where two next pointers are set, but only one before pointer, so in total three pointers are set.那里有两个代码块,其中设置了两个 next 指针,但只有一个 before 指针,因此总共设置了三个指针。 But there should be four of them in the general case.但一般情况下应该有四个。

This issue occurs in the second if block:此问题出现在第二个if块中:

        Node *newPtr = new Node(value);
        newPtr->setNextPtr(currentPrt->getNextPtr());
        currentPrt->setNextPtr(newPtr);
        newPtr->setBeforePtr(currentPrt);

where newPtr->setNextPtr(currentPrt->getNextPtr());其中newPtr->setNextPtr(currentPrt->getNextPtr()); is not mirrored by a link in the opposite direction.不被相反方向的链接镜像。 The correction is:更正如下:

        Node *newPtr = new Node(value);
        newPtr->setNextPtr(currentPrt->getNextPtr());
        if (currentPrt->getNextPtr() != nullptr) // <---
            currentPrt->getNextPtr()->setBeforePtr(newPtr); // <---
        currentPrt->setNextPtr(newPtr);
        newPtr->setBeforePtr(currentPrt);

The same is going wrong in the deeper if block, where the if protection is not needed:在不需要if保护的更深的if块中也会出现同样的错误:

        if (currentPrt->getBeforePtr() != nullptr){
            currentPrt = currentPrt->getBeforePtr();
            newPtr->setNextPtr(currentPrt->getNextPtr());
            currentPrt->setNextPtr(newPtr);
            newPtr->setBeforePtr(currentPrt);
        }

The same statement is missing, and the correction can be:同样的语句缺失,更正可以是:

        if (currentPrt->getBeforePtr() != nullptr){
            currentPrt = currentPrt->getBeforePtr();
            newPtr->setNextPtr(currentPrt->getNextPtr());
            currentPrt->getNextPtr()->setBeforePtr(newPtr); // <---
            currentPrt->setNextPtr(newPtr);
            newPtr->setBeforePtr(currentPrt);
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM