我正在尝试交换两个列表之间的值,它使用我创建的名为ListNum的自定义List类的成员函数,它是具有节点类和迭代器类的朋友。我可以交换它们但我不断得到一个奇怪的错误我不知道如何解决。在第二个列表的最后一个值上,当我尝试实现它时,我收到一个错误。
我只是在两个列表的第一个迭代器之后插入然后删除该元素,迭代器在删除后自动转到列表的下一个值。在最后一次擦除调用中,它会检查要删除的值是否为 “持续”。在第二个列表中,值是“last”但是当它检查if语句“erase”时,此调用失败并且我得到BAD_ACCESS错误。基本上尝试分配导致错误的空指针
值为6,它是最后一个但是if语句失败了。我不确定这是否必须这样做第一个列表我需要创建一个指针,而第二个列表作为参考传递。
这是我的代码。
int main(){
list1.push_back(1);
list1.push_back(2);
list1.push_back(3);
list2.push_back(4);
list2.push_back(5);
list2.push_back(6);
list1.swap(list2);
return 1;
}
这是我试图实现的交换成员函数
void ListNum::swap(ListNum& list2){
ListNum* list1 = this;
IteratorNum end1 = list1->end();
IteratorNum end2 = list2.end();
IteratorNum start1 = list1->begin();
IteratorNum start2 = list2.begin();
while(!start1.equals(end1) && !start2.equals(end2)){
list1->insert(start1, start2.get());
list2.insert(start2, start1.get());
start1 = erase(start1);
start2 = erase(start2);
}
}
代码在if语句的最后一次运行时失败(remove == last)
IteratorNum ListNum::erase(IteratorNum iter){
assert(iter.position != NULL); //check that erase is not null
NodeNum *remove = iter.position;
NodeNum *after = remove->next;
NodeNum *before = remove->previous;
if(remove == first)
first = after;
else
before->next = after;
//FAILS HERE, 6 is last int value but it doesn't pass this test. List 1 passes but list 2 does not...
if(remove == last) //erasing at end of ListNum
last = before;
else
after->previous = before;
delete remove;
IteratorNum r;
r.position = after;
r.container = this;
return r;
}
答案 0 :(得分:2)
首先:不要重新发明轮子。 std::list
经过了充分测试,已经实施std::swap()
。编写自己的列表对于教育目的非常有用。
无论如何,不要自己交换元素,而是指向它们的指针。您的列表可能包含指向第一个和最后一个节点的指针。交换这些指针,也许一些元数据,如大小,你就完成了。