C++链表
我正在使用list类的修改版本处理作业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) {} }; }; 我试图实现的目标是在输入列表后,我需要能够删除一名成员,
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;。