我正在使用Node创建一个列表容器。
这是Node结构的样子; mFirst
是List类的私有数据成员。
struct Node{
Node(const EType & d, Node *n = nullptr) : mData(d), mNext(n) { }
EType mData;
Node *mNext;
};
Node *mFirst;
有一个用于从容器中删除元素的函数:
问题发生在 temp2->mNext = temp->mNext;
.
元素被删除,但是程序会崩溃。
我不知道是什么原因造成的。
template <typename EType>
void Set<EType>::remove(const EType & x) {
if (isElement(x)) {
Node *temp = mFirst;
Node *temp2 = nullptr;
while(temp->mData != x) {
temp2 = temp;
temp = temp->mNext;
}
if (temp2 == nullptr) {
mFirst = temp->mNext;
} else {
temp2->mNext = temp->mNext;
}
}
}
如果我把这行改成:
temp = temp->mNext;
temp2 = temp2->mNext;
temp2 = temp;
什么也没发生,函数不能工作。
两个表达式不相同吗?
首先。你的最后一个代码没有任何作用。再读一遍。
这样你就永远不会检查列表的末尾,即使在循环中也是如此。
您如何知道元素已被删除?如果您的程序在这一行崩溃,则不会删除任何内容。
我没有看到任何删除,所以你永远不会删除这个对象,它仍然在内存中。
你能告诉我们确切的坠机信息吗?使用gdb也许
对于您使用的每个指针,您必须检查它是否与0不同:您只检查tmp2,但您也应该检查tmp。
while(tmp && tmp->mData !=x)
您需要检查该元素是否在列表
中找到if(tmp)
{
if(!tmp2)
{
mFirst = tmp->mNext;
delete tmp;//now it is deleted
}
else
{
tmp2->mNext = tmp->mNext;
delete tmp;//now it is deleted
}
在创建列表时还需要注意:最后一个元素必须将mNext设置为0