C++链表

C++链表,c++,list,nodes,C++,List,Nodes,我正在使用list类的修改版本处理作业 class List { private: class Node { public: std::string _entry; Node * _link; Node(std::string entry, Node * link) : _entry(entry), _link(link) {} }; }; 我试图实现的目标是在输入列表后,我需要能够删除一名成员,

我正在使用list类的修改版本处理作业

class List
{
private:
    class Node
    {
    public:
        std::string _entry;
        Node * _link;

        Node(std::string entry, Node * link) : _entry(entry), _link(link)
        {}
    };
};
我试图实现的目标是在输入列表后,我需要能够删除一名成员,因此如果我输入:

a
b
c
d
e
我需要能够删除c,并保持其余的不受影响。我的职能是:

    bool deleteOneOf(const std::string & target)
        {
            Node * & del = _first;
            Node *  temp = _first;
            if (contains(target))
            { 
               del = find(temp, target);
               del = del->_link;
            }
                delete temp;
                return true;

            }
            else
            {
                return false;
            }

        }
Node * & find(Node * & ptr, const std::string & target)
    {
        if (ptr == nullptr || ptr->_entry == target)
        {
            return ptr;
        }
        else
        {
            return find(ptr->_link, target);
        }
    }
查找功能是:

    bool deleteOneOf(const std::string & target)
        {
            Node * & del = _first;
            Node *  temp = _first;
            if (contains(target))
            { 
               del = find(temp, target);
               del = del->_link;
            }
                delete temp;
                return true;

            }
            else
            {
                return false;
            }

        }
Node * & find(Node * & ptr, const std::string & target)
    {
        if (ptr == nullptr || ptr->_entry == target)
        {
            return ptr;
        }
        else
        {
            return find(ptr->_link, target);
        }
    }
我遇到的问题是,如果我输入要删除的C,它不能正确地将B链接到D,所以C,D,E都被删除,而不仅仅是C。
因此,输出是B,而不是应该的B D E。

deleteOneOf中的代码看起来有点让我困惑。我不清楚您试图实现什么方法,但它不必如此复杂

我假设_first是指向列表的头指针。在这种情况下:

bool deleteOneOf(const std::string & target)
{
    Node **del = &_first;

    while (*del)
    {
         if ((*del)->_entry == target)
         {
             Node *ptr=*del;

             (*del)=ptr->_link;
             delete ptr;
             return true;
         }

         del=&(*del)->_link;
     }
     return false;
}

除非我遗漏了您需求的某些部分,否则这应该是所需的全部内容。

当您看起来刚刚找到目标时,为什么要调用deleteOneOf顶部附近的find?我看不到任何代码以任何方式更改链接,更不用说更改正确的链接了。当我运行该命令并输入它需要从B C D E中删除C时,当我打印出新的列表时,它只是一个B,而不是一个B D E。我有一个小的打字错误,你可能猜错了修复应该是什么。更正了代码。指针的下一个值应设置为del=&*del->\u link;。